Hướng dẫn sử dụng cảm biến nhiệt độ DS18B20 với Arduino
Cảm biến nhiệt độ DS18B20 là một cảm biến được sử dụng rất nhiều trong quá trình học tập, đặt biệt cho những ai mới nhập môn học lập trình Arduino. Nó là một nền tảng giúp cho bạn có thể xử lý các cảm biến nhiệt độ phức tạp hơn. Thông qua bài viết các bạn sẽ nắm được cảm biến DS18B20 là gì? cách thức hoạt động và ứng dụng của nó vào thực tế như thế nào?
Tổng quan về cảm biến nhiệt độ DS18B20
Cảm biến nhiệt độ DS18B20 Arduino là một cảm biến Digital có tính chính xác rất cao và dễ sử dụng để đo nhiệt độ. Nó sử dụng giao tiếp 1 Dây (1-Wire) để truyền dữ liệu và hiển thị giá trị nhiệt độ dưới dạng số.
Cấu tạo và hoạt động của cảm biến DS18B20
- Cảm biến bao gồm một cục silicon chứa các thành phần quan trọng bên trong.
- Nó có một đầu dẹp dùng để cắm vào mạch hoặc nơi cần đo nhiệt độ.
- DS18B20 có khả năng đo nhiệt độ từ -55°C đến +125°C với độ chính xác cao.
- Cảm biến này có thể hoạt động với nguồn cấp từ 3V đến 5.5V.
Đặc điểm và lợi ích của cảm biến nhiệt độ DS18B20
- Giao tiếp dễ dàng: Cảm biến DS18B20 sử dụng giao tiếp 1 Dây, giúp giảm số lượng chân kết nối và dễ dàng tích hợp vào hệ thống.
- Độ chính xác cao: Cảm biến này có độ chính xác rất cao trong việc đo nhiệt độ, đảm bảo kết quả chính xác và tin cậy.
- Đo nhiệt độ rộng: DS18B20 có khả năng đo nhiệt độ trong khoảng rộng từ -55°C đến +125°C, phù hợp với nhiều ứng dụng khác nhau.
- Độ tin cậy và ổn định: Cảm biến DS18B20 có tính ổn định cao trong quá trình đo và ít bị ảnh hưởng bởi điều kiện môi trường.
- Tiết kiệm năng lượng: Cảm biến này tiêu thụ ít năng lượng, cho phép hoạt động trong thời gian dài.
Giao tiếp nhiều cảm biến nhiệt độ DS18B20 trên cùng 1 dây
Tính năng nổi bất của cảm biến nhiệt độ DS18B20 giao tiếp nhiều cảm biến một lúc trên cùng một dây, bằng cách sử dụng giao tiếp 1-Dây (OneWire) và gán địa chỉ duy nhất cho từng cảm biến. Dưới đây là quy trình tổng quan để giao tiếp với nhiều cảm biến DS18B20 trên cùng một dây:
- Kết nối cảm biến: Kết nối chân GND và VCC của tất cả các cảm biến DS18B20 với nguồn cấp và đảm. Chân DQ (Data) của tất cả các cảm biến được kết nối lại với nhau trên cùng một dây.
- Gán địa chỉ duy nhất cho từng cảm biến: Mỗi cảm biến DS18B20 được gán một địa chỉ duy nhất. Trong quá trình khởi động, sử dụng lệnh tìm thiết bị (search devices) để phát hiện và gán địa chỉ cho từng cảm biến. Mỗi cảm biến có một địa chỉ 64-bit dài.
- Đọc nhiệt độ từ các cảm biến: Sau khi gán địa chỉ cho từng cảm biến, để đọc nhiệt độ từng cảm biến bằng cách gửi các lệnh đúng thông qua giao tiếp 1-Dây. Mỗi cảm biến sẽ trả về giá trị nhiệt độ của nó.
Xem thêm: Bài 7: Cảnh báo nhiệt độ (LM35) bằng còi báo sử dụng Arduino Uno
Sơ đồ chân cảm biến nhiệt độ DS18B20
- VDD: Chân nguồn, kết nối với nguồn cấp từ 3.3V – 5V.
- GND: Chân mát, kết nối với đất (GND).
- DQ: Chân dữ liệu, kết nối với chân Digital của vi điều khiển thông qua chuẩn giao tiếp 1-Write.
Các linh kiện cần thiết cho dự án
TÊN LINH KIỆN | SỐ LƯỢNG | NƠI BÁN |
Arduino Uno R3 | 1 | Shopee | Cytron |
Cảm biến nhiệt độ DS18B20 | 1 | Shopee | Cytron |
Cảm biến nhiệt độ DS18B20 chống nước | 1 | Shopee | Cytron |
Dây cắm | 1 | Shopee | Cytron |
Breadboard | 1 | Shopee | Cytron |
Điện trở 4.7k | 1 | Shopee | Cytron |
Sơ đồ đấu nối cảm biến nhiệt độ DS18B20 với Arduino
Các đấu nối khá là đơn giản phù hợp cho những bạn mới bắt đầu tiếp cận với Arduino. Chân VDD của cảm biến nối với chân 5V của Arduino và GND với GND.
Chân tín hiệu DQ nối với chân số 2 của Arduino. Để giữ cho quá trình truyền dữ liệu ổn định, các bạn cần mắc thêm một điện trở kéo lên 4,7k giữa chân tín hiệu và chân nguồn.
Trường hợp, nếu bạn đang sử dụng phiên bản DS18B20 chống nước, hãy nối dây màu đỏ với 5V, dây màu đen với đất (GND) và dây màu vàng với chân số 2 trên Arduino. Mắc một điện trở pullup 4,7K giữa chân dữ liệu và 5V.
Cài đặt thư viện cho DS18B20
Giao thức 1 dây (1-Write) khá phức tạp và cần viết rất nhiều đoạn Code để có thể giao tiếp và hoạt động được. Vì vậy, thư viện DallasTemperature.h ra đời để giải quyết vấn đề này, bằng những câu lệnh đơn giản việc đọc dữ liệu từ cảm biến nhiệt độ trở nên đơn giản.
Mở phần mềm Arduino IDE và làm theo các bước sau: Sketch > Include Library > Manage Libraries…
Nhập vào ô tìm kiếm từ khóa ‘ds18b20’. Ở đây sẽ xuất hiện nhiều thư viện khác nhau, các bạn tìm đến DallasTemperature của Miles Burton. Chọn Version mới nhất và tiến hành cài đặt
Vì cảm biến nhiệt độ DS18B20 Arduino truyền nhận dữ liệu thông qua giao tiếp 1 dây. Các bạn nhập vào ô tìm kiếm “onewrite”. Chọn Version mới nhất và tiến hành cài đặt
Code cảm biến DS18B20
Đoạn code bên dưới là một ví dụ đơn giản về cách sử dụng cảm biến nhiệt độ DS18B20 với Arduino và thư viện OneWire và DallasTemperature.
#include <OneWire.h> #include <DallasTemperature.h> // Data wire is plugged into digital pin 2 on the Arduino #define ONE_WIRE_BUS 2 // Setup a oneWire instance to communicate with any OneWire device OneWire oneWire(ONE_WIRE_BUS); // Pass oneWire reference to DallasTemperature library DallasTemperature sensors(&oneWire); void setup(void) { sensors.begin(); // Start up the library Serial.begin(9600); } void loop(void) { // Send the command to get temperatures sensors.requestTemperatures(); //print the temperature in Celsius Serial.print("Temperature: "); Serial.print(sensors.getTempCByIndex(0)); Serial.print((char)176);//shows degrees character Serial.print("C | "); //print the temperature in Fahrenheit Serial.print((sensors.getTempCByIndex(0) * 9.0) / 5.0 + 32.0); Serial.print((char)176);//shows degrees character Serial.println("F"); delay(500); }
Kết quả, được trả về khi đo nhiệt độ từ cảm biến DS18B20.
Giải thích Code
#include <OneWire.h> #include <DallasTemperature.h> // Data wire is plugged into digital pin 2 on the Arduino #define ONE_WIRE_BUS 2
Khai báo thư viện OneWire và DallasTemperature để đọc nhiệt độ từ cảm biến DS18B20 và được kết nối với Arduino thông qua chân số 2 (được định nghĩa là ONE_WIRE_BUS).
void setup(void) { sensors.begin(); // Start up the library Serial.begin(9600); }
Trong hàm setup(), thư viện DallasTemperature được khởi động thông qua lệnh sensors.begin()
. Thư viện này sẽ sử dụng thư viện OneWire để giao tiếp với cảm biến.
void loop(void) { // Send the command to get temperatures sensors.requestTemperatures(); //print the temperature in Celsius Serial.print("Temperature: "); Serial.print(sensors.getTempCByIndex(0)); Serial.print((char)176);//shows degrees character Serial.print("C | "); //print the temperature in Fahrenheit Serial.print((sensors.getTempCByIndex(0) * 9.0) / 5.0 + 32.0); Serial.print((char)176);//shows degrees character Serial.println("F"); delay(500); }
Trong hàm loop(), lệnh sensors.requestTemperatures()
được sử dụng để yêu cầu đọc nhiệt độ từ cảm biến. Sau đó, nhiệt độ được đọc bằng cách sử dụng hàm sensors.getTempCByIndex(0)
để lấy giá trị nhiệt độ được lưu trữ tại vị trí đầu tiên (0) trong mảng giá trị nhiệt độ đọc được từ các cảm biến. Nhiệt độ này được hiển thị trên Serial Monitor với đơn vị Celsius (℃) và Fahrenheit (°F) thông qua các lệnh Serial.print()
. Cuối cùng, delay(500) trước khi đọc lại nhiệt độ từ cảm biến.
Các chức năng hữu ích trong thư viện DallasTemperature.h
- Hàm
setResolution()
: Cảm biến DS18B20 có thể được đặt với ba độ phân giải khác nhau: 9-bit, 10-bit và 12-bit tương ứng với 0,5°C, 0,25°C, 0,125°C và 0,0625°C.
- Hàm
getWaitForConversion()
: được sử dụng để lấy giá trị hiện tại của cờwaitForConversion
. CờwaitForConversion
được sử dụng để xác định xem thư viện DallasTemperature có chờ cảm biến hoàn thành quá trình chuyển đổi nhiệt độ hay không trước khi đọc giá trị.
- Hàm
setHighAlarmTemp()
vàsetLowAlarmTemp()
: Được sử dụng để thiết lập giá trị ngưỡng cảnh báo nhiệt độ cao và nhiệt độ thấp trên cảm biến nhiệt độ DS18B20.
- Hàm
bool hasAlarm()
: được sử dụng để kiểm tra xem có cảnh báo nhiệt độ nào được kích hoạt trên cảm biến nhiệt độ DS18B20 hay không.