IoTLabs

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

Series ESP32 & Cảm biến: Bài 19 – Đọc cảm biến DS18B20: đo nhiệt độ (1-Wire) & theo dõi realtime

Sau khi hoàn thành Level 2 với I2C + RTC, chúng ta tiếp tục mở rộng sang một giao thức rất phổ biến khác trong IoT: 1-Wire.

Cảm biến tiêu biểu nhất cho giao thức này là DS18B20 – cảm biến đo nhiệt độ chính xác, ổn định và có thể gắn nhiều sensor trên cùng một dây.

Bài này tập trung vào:

  • Làm quen 1-Wire protocol
  • Đọc nhiệt độ với DS18B20
  • Gửi dữ liệu realtime lên IoTLabs Cloud MQTT

1. Vì sao DS18B20 rất được ưa chuộng?

DS18B20 được dùng rất nhiều trong:

  • Giám sát nhiệt độ kho lạnh
  • Đo nhiệt độ nước, môi trường ẩm
  • Hệ thống nhiều điểm đo nhiệt

Ưu điểm nổi bật:

  • Độ chính xác tốt (±0.5 °C)
  • Chỉ cần 1 dây data
  • Có thể nhiều cảm biến chung 1 GPIO
  • Mỗi cảm biến có ID riêng (ROM code)

👉 Đây là cảm biến “kinh điển” cho IoT đo nhiệt.

2. Giới thiệu nhanh về giao thức 1-Wire

Khác với I2C:

  • I2C: nhiều dây, address logic
  • 1-Wire: 1 dây data + GND

Đặc điểm:

  • Tốc độ chậm hơn I2C
  • Nhưng wiring rất gọn
  • Phù hợp sensor phân tán

📌 DS18B20 yêu cầu điện trở kéo lên 4.7kΩ trên chân data.

3. Chuẩn bị phần cứng & nối dây

Thiết bị

  • ESP32-C3 SuperMini
  • DS18B20 (dạng TO-92 hoặc waterproof)
  • Điện trở 4.7kΩ

Kết nối

DS18B20ESP32-C3
VCC3.3 V
DATAGPIO4
GNDGND

👉 Điện trở 4.7kΩ nối DATA ↔ VCC.

4. Thư viện sử dụng

Cài 2 thư viện phổ biến:

  • OneWire
  • DallasTemperature

5. Ví dụ 1: Đọc DS18B20 local (Serial)

#include <OneWire.h>
#include <DallasTemperature.h>

#define ONE_WIRE_BUS 4

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

void setup() {
  Serial.begin(115200);
  sensors.begin();
}

void loop() {
  sensors.requestTemperatures();
  float tempC = sensors.getTempCByIndex(0);

  if (tempC != DEVICE_DISCONNECTED_C) {
    Serial.print("Temperature: ");
    Serial.print(tempC);
    Serial.println(" °C");
  } else {
    Serial.println("Sensor not found");
  }

  delay(2000);
}

📌 Với nhiều DS18B20, bạn có thể đọc theo index hoặc address.

6. Chuẩn payload gửi IoTLabs Cloud

{
  "ts": 1760000000,
  "metrics": {
    "temperature": 4.8
  }
}

7. Ví dụ 2: Gửi dữ liệu DS18B20 realtime qua MQTT

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

#define ONE_WIRE_BUS 4

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

// ===== CONFIG =====
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);

unsigned long lastSend = 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-ds18b20", MQTT_USER, MQTT_PASS);
    delay(1000);
  }
}

void setup() {
  Serial.begin(115200);
  sensors.begin();
  connectWiFi();
  connectMQTT();
}

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

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

    sensors.requestTemperatures();
    float t = sensors.getTempCByIndex(0);
    if (t == DEVICE_DISCONNECTED_C) return;

    long ts = millis() / 1000;

    String payload = "{";
    payload += "\"ts\":" + String(ts) + ",";
    payload += "\"metrics\":{";
    payload += "\"temperature\":" + String(t, 2);
    payload += "}}";

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

8. Kinh nghiệm thực tế với DS18B20

  • Rất phù hợp đo:
    • Nhiệt độ nước
    • Kho lạnh
    • Ngoài trời
  • Dùng loại waterproof nếu môi trường ẩm
  • Có thể gắn nhiều sensor chung 1 dây
  • Khi nhiều sensor → nên đọc theo ROM address

9. So sánh DS18B20 với các sensor nhiệt khác

Cảm biếnGiao tiếpĐộ chính xácĐặc điểm
DHT22DigitalTrung bìnhRẻ, dễ
AHT20I2CTốtỔn định
SHT31I2CRất tốtCao cấp
DS18B201-WireTốtNhiều sensor / 1 dây

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

Sau bài này, bạn đã:

  • Hiểu giao thức 1-Wire
  • Đọc DS18B20 ổn định
  • Gửi dữ liệu realtime lên IoTLabs Cloud
  • Mở rộng tư duy sang multi-sensor topology khác I2C