Bạn đã từng tự hỏi làm thế nào để đo nhiệt độ một cách chính xác, tiết kiệm chi phí và dễ dàng tích hợp vào các dự án điện tử của mình? Cảm biến nhiệt độ DS18B20 chính là câu trả lời. Đây là một trong những cảm biến nhiệt độ kỹ thuật số phổ biến nhất hiện nay, nổi bật với độ chính xác cao, giao tiếp đơn giản qua một dây tín hiệu duy nhất, và khả năng đo nhiệt độ trong khoảng rộng từ -55°C đến +125°C.
Trong bài viết này, chúng ta sẽ cùng nhau tìm hiểu cách lập trình cảm biến nhiệt độ DS18B20 với Arduino một cách chi tiết và dễ hiểu nhất, từ khâu kết nối phần cứng, cài đặt thư viện, viết code đến xử lý dữ liệu thực tế. Bạn sẽ không chỉ nắm bắt được lý thuyết mà còn có thể áp dụng ngay vào các dự án IoT, hệ thống tự động hóa hay các ứng dụng đo nhiệt độ khác.
DS18B20 là cảm biến nhiệt độ kỹ thuật số do Dallas Semiconductor (nay là Maxim Integrated) phát triển. Điểm nổi bật của DS18B20 bao gồm:
Arduino là nền tảng vi điều khiển phổ biến, dễ sử dụng, với cộng đồng lớn và nhiều thư viện hỗ trợ. Việc kết hợp Arduino với DS18B20 tạo nên một bộ đôi hoàn hảo để đo nhiệt độ trong các dự án DIY, tự động hóa nhà cửa, thiết bị y tế, hoặc các hệ thống giám sát môi trường.
DS18B20 Arduino
---------------------------------
VDD (pin 3) -> 5V (Arduino 5V)
GND (pin 1) -> GND (Arduino GND)
DQ (pin 2) -> Digital Pin 2 (Arduino)
Điện trở 4.7kΩ giữa VDD và DQ
Lưu ý: Nếu bạn muốn sử dụng chế độ cấp nguồn parasite, bạn có thể bỏ qua kết nối VDD và nối pin VDD của DS18B20 vào GND.
Để lập trình DS18B20 với Arduino, bạn cần cài đặt thư viện "OneWire" và "DallasTemperature" trong Arduino IDE:
Thư viện OneWire giúp Arduino giao tiếp với các thiết bị sử dụng giao tiếp 1-Wire, còn DallasTemperature hỗ trợ trực tiếp cho cảm biến DS18B20.
Dưới đây là ví dụ code đầy đủ, có chú thích rõ ràng:
#include <OneWire.h>
#include <DallasTemperature.h>
// Chân kết nối data của DS18B20
#define ONE_WIRE_BUS 2
// Khởi tạo đối tượng OneWire
OneWire oneWire(ONE_WIRE_BUS);
// Khởi tạo đối tượng DallasTemperature
DallasTemperature sensors(&oneWire);
void setup() {
Serial.begin(9600);
sensors.begin(); // Khởi động cảm biến
Serial.println("DS18B20 Temperature Sensor Initialized");
}
void loop() {
sensors.requestTemperatures(); // Yêu cầu đo nhiệt độ
float temperatureC = sensors.getTempCByIndex(0); // Lấy nhiệt độ cảm biến đầu tiên
if (temperatureC == DEVICE_DISCONNECTED_C) {
Serial.println("Error: Could not read temperature data");
} else {
Serial.print("Temperature: ");
Serial.print(temperatureC);
Serial.println(" °C");
}
delay(1000); // Đợi 1 giây trước khi đo lại
}
OneWire oneWire(ONE_WIRE_BUS); tạo giao tiếp 1-Wire trên chân số 2.DallasTemperature sensors(&oneWire); tạo đối tượng cảm biến DS18B20.sensors.begin(); khởi tạo cảm biến.sensors.requestTemperatures(); gửi lệnh đo nhiệt độ.sensors.getTempCByIndex(0); lấy giá trị nhiệt độ của cảm biến đầu tiên trên bus.Nếu có nhiều cảm biến, bạn có thể dùng getTempC(DeviceAddress deviceAddress) để lấy nhiệt độ từng cảm biến riêng biệt.
DS18B20 cho phép kết nối nhiều cảm biến trên cùng một dây dữ liệu, rất thuận tiện cho việc giám sát nhiệt độ ở nhiều vị trí.
DeviceAddress tempDeviceAddress;
void printAddress(DeviceAddress deviceAddress) {
for (uint8_t i = 0; i < 8; i++) {
if (deviceAddress[i] < 16) Serial.print("0");
Serial.print(deviceAddress[i], HEX);
}
}
void setup() {
Serial.begin(9600);
sensors.begin();
Serial.print("Found ");
Serial.print(sensors.getDeviceCount());
Serial.println(" devices.");
for (int i = 0; i < sensors.getDeviceCount(); i++) {
if (sensors.getAddress(tempDeviceAddress, i)) {
Serial.print("Device ");
Serial.print(i);
Serial.print(" Address: ");
printAddress(tempDeviceAddress);
Serial.println();
} else {
Serial.println("Unable to find address for Device ");
Serial.println(i);
}
}
}
void loop() {
sensors.requestTemperatures();
for (int i = 0; i < sensors.getDeviceCount(); i++) {
if (sensors.getAddress(tempDeviceAddress, i)) {
float tempC = sensors.getTempC(tempDeviceAddress);
Serial.print("Sensor #");
Serial.print(i);
Serial.print(" Temperature: ");
Serial.print(tempC);
Serial.println(" °C");
}
}
delay(2000);
}
getDeviceCount() trả về số lượng cảm biến trên bus.getAddress() lấy địa chỉ 64-bit của cảm biến.getTempC(deviceAddress) lấy nhiệt độ theo địa chỉ.Việc này giúp bạn kiểm soát từng cảm biến riêng biệt, thuận tiện cho các hệ thống giám sát nhiều điểm nhiệt độ.
Bạn có thể xây dựng hệ thống theo dõi nhiệt độ trong nhà, kho lạnh, hoặc nông nghiệp thông minh. Kết hợp DS18B20 với Arduino và module hiển thị LCD hoặc gửi dữ liệu lên Internet qua module WiFi.
Dựa trên nhiệt độ đo được, Arduino có thể điều khiển quạt, máy sưởi hoặc thiết bị làm lạnh để duy trì nhiệt độ ổn định.
Kết hợp nhiều cảm biến DS18B20 đo nhiệt độ các vị trí khác nhau cùng với các cảm biến khác như độ ẩm, áp suất để xây dựng trạm dự báo thời tiết cá nhân.
Áp dụng trong các thiết bị điện tử, máy móc để phát hiện và cảnh báo khi nhiệt độ vượt ngưỡng an toàn.
Việc lập trình cảm biến nhiệt độ DS18B20 với Arduino không chỉ đơn giản mà còn mở ra rất nhiều cơ hội sáng tạo trong các dự án điện tử và tự động hóa. Qua bài viết này, bạn đã nắm rõ cách kết nối phần cứng, cài đặt thư viện, viết code đo nhiệt độ chính xác và xử lý nhiều cảm biến cùng lúc.
Để dự án thành công, hãy chú ý đến phần cứng, đặc biệt là điện trở kéo lên và nguồn cấp cho cảm biến. Đồng thời, tận dụng các thư viện chuẩn để giảm thiểu lỗi và tối ưu hóa hiệu năng.
Cuối cùng, đừng ngại thử nghiệm và mở rộng ứng dụng của DS18B20 trong các hệ thống IoT, giúp cuộc sống và công việc của bạn trở nên thông minh hơn. Chúc bạn thành công với dự án đo nhiệt độ Arduino của mình!