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
| DS18B20 | ESP32-C3 |
|---|---|
| VCC | 3.3 V |
| DATA | GPIO4 |
| GND | GND |
👉 Đ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ến | Giao tiếp | Độ chính xác | Đặc điểm |
|---|---|---|---|
| DHT22 | Digital | Trung bình | Rẻ, dễ |
| AHT20 | I2C | Tốt | Ổn định |
| SHT31 | I2C | Rất tốt | Cao cấp |
| DS18B20 | 1-Wire | Tốt | Nhiề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


