IoTLabs

Nghiên cứu, Sáng tạo và Thử nghiệm

Series ESP32 & Cảm biến: Bài 25 – Đọc cảm biến JSN-SR04T: đo khoảng cách chống nước & theo dõi realtime

JSN-SR04T là phiên bản chống nước của HC-SR04, rất phù hợp cho các ứng dụng ngoài trời hoặc môi trường ẩm ướt như: bể nước, ao hồ, hố ga, silo, thùng chứa.
Trong bài này, chúng ta sẽ đọc khoảng cách bằng JSN-SR04T với ESP32, sau đó gửi dữ liệu realtime lên IoTLabs Cloud MQTT.

1. JSN-SR04T là gì? Dùng khi nào?

JSN-SR04T là cảm biến siêu âm:

  • Đầu dò chống nước (IP66/IP67 tuỳ bản)
  • Module xử lý tách rời → có dây nối đầu dò
  • Đo khoảng cách không tiếp xúc

So sánh nhanh

Tiêu chíHC-SR04JSN-SR04T
Chống nước
Ngoài trời
Độ bềnTrung bìnhCao
Ứng dụngRobot, indoorBể nước, outdoor

👉 Nếu đo mực nước / ngoài trờiJSN-SR04T là lựa chọn đúng.

2. Chuẩn bị phần cứng & lưu ý điện áp

Thiết bị

  • ESP32-C3 SuperMini
  • JSN-SR04T (module + đầu dò)
  • (Khuyến nghị) chia áp Echo về 3.3V

Điện áp

  • JSN-SR04T thường chạy 5V
  • Chân ECHO xuất 5V → cần chia áp trước khi vào ESP32

3. Nối dây JSN-SR04T với ESP32

JSN-SR04TESP32-C3
VCC5V
GNDGND
TRIGGPIO4
ECHOGPIO5 (qua chia áp)

📌 Chia áp gợi ý: 1kΩ + 2kΩ (5V → ~3.3V)

4. Nguyên lý đo khoảng cách (nhắc lại)

JSN-SR04T hoạt động giống HC-SR04:

distance_cm = (duration_us × 0.034) / 2
  • duration_us: thời gian Echo HIGH
  • 0.034 cm/µs: vận tốc âm thanh

5. Ví dụ 1: Đọc khoảng cách JSN-SR04T (local)

#define TRIG_PIN 4
#define ECHO_PIN 5

void setup() {
  Serial.begin(115200);
  pinMode(TRIG_PIN, OUTPUT);
  pinMode(ECHO_PIN, INPUT);
}

float readDistanceCM() {
  digitalWrite(TRIG_PIN, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIG_PIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIG_PIN, LOW);

  long duration = pulseIn(ECHO_PIN, HIGH, 30000);
  if (duration == 0) return -1;

  return (duration * 0.034) / 2.0;
}

void loop() {
  float d = readDistanceCM();
  if (d > 0) {
    Serial.print("Distance: ");
    Serial.print(d);
    Serial.println(" cm");
  } else {
    Serial.println("Out of range");
  }
  delay(1000);
}

📌 Với JSN-SR04T, khoảng đo ổn định thường 20–450 cm.

6. Đặc trưng dữ liệu & tư duy IoT

JSN-SR04T sinh telemetry liên tục, phù hợp:

  • Vẽ chart theo thời gian
  • Cảnh báo ngưỡng
  • Automation

Payload gợi ý:

{
  "ts": 1760000000,
  "metrics": {
    "distance_cm": 128.4
  }
}

7. Ví dụ 2: Gửi dữ liệu realtime lên IoTLabs Cloud MQTT

#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <PubSubClient.h>

#define TRIG_PIN 4
#define ECHO_PIN 5

const char* WIFI_SSID = "YOUR_WIFI";
const char* WIFI_PASS = "YOUR_PASS";

const char* MQTT_HOST = "mqtt.iotlabs.vn";
const int MQTT_PORT = 8883;
const char* MQTT_USER = "YOUR_MQTT_USER";
const char* MQTT_PASS = "YOUR_MQTT_PASS";

const char* MQTT_TOPIC =
  "iotlabs/<orgId>/devices/<deviceId>/telemetry";

WiFiClientSecure net;
PubSubClient mqtt(net);

float readDistanceCM() {
  digitalWrite(TRIG_PIN, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIG_PIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIG_PIN, LOW);

  long duration = pulseIn(ECHO_PIN, HIGH, 30000);
  if (duration == 0) return -1;
  return (duration * 0.034) / 2.0;
}

void connectWiFi() {
  WiFi.begin(WIFI_SSID, WIFI_PASS);
  while (WiFi.status() != WL_CONNECTED) delay(500);
}

void connectMQTT() {
  net.setInsecure();
  mqtt.setServer(MQTT_HOST, MQTT_PORT);
  while (!mqtt.connected()) {
    mqtt.connect("esp32c3-jsn", MQTT_USER, MQTT_PASS);
    delay(1000);
  }
}

unsigned long lastSend = 0;

void setup() {
  Serial.begin(115200);
  pinMode(TRIG_PIN, OUTPUT);
  pinMode(ECHO_PIN, INPUT);

  connectWiFi();
  connectMQTT();
}

void loop() {
  if (!mqtt.connected()) connectMQTT();
  mqtt.loop();

  if (millis() - lastSend > 2000) {
    lastSend = millis();

    float d = readDistanceCM();
    if (d < 0) return;

    long ts = millis() / 1000;
    String payload = "{";
    payload += "\"ts\":" + String(ts) + ",";
    payload += "\"metrics\":{";
    payload += "\"distance_cm\":" + String(d, 1);
    payload += "}}";

    mqtt.publish(MQTT_TOPIC, payload.c_str());
    Serial.println(payload);
  }
}

8. Kinh nghiệm thực tế khi dùng JSN-SR04T

  • Không đặt đầu dò quá gần mặt nước (<20 cm)
  • Tránh sóng gió mạnh làm nhiễu
  • Nên lấy trung bình 3–5 mẫu
  • Với bể sâu → gắn cố định, tránh rung

📌 JSN-SR04T rất phù hợp cho giám sát mực nước dài ngày.

9. Ứng dụng thực tế

Sau bài này, bạn có thể làm:

  • Giám sát mực nước bể/ao
  • Cảnh báo tràn / cạn
  • Kết hợp Rule Engine trên IoTLabs Cloud
  • Tạo dashboard outdoor bền bỉ

10. Tổng kết Bài 25

Bạn đã:

  • Đọc cảm biến siêu âm chống nước
  • Hiểu sự khác biệt HC-SR04 vs JSN-SR04T
  • Gửi telemetry realtime lên IoTLabs Cloud
  • Sẵn sàng cho các bài automation outdoor