DHT11 là một cảm biến nhiệt độ và độ ẩm, nó xuất tín hiệu số được hiệu chuẩn ở ngõ ra. DHT11 có thể được giao tiếp với bất kỳ vi điều khiển như Arduino, Raspberry Pi, v.v.. và có được kết quả tức thời. DHT11 là cảm biến nhiệt độ và độ ẩm giá rẻ, mang lại độ tin cậy cao và ổn định lâu dài.
Trong dự án này, chúng ta sẽ xây dựng một mạch nhỏ để giao tiếp Arduino với cảm biến nhiệt độ và độ ẩm DHT11. Một trong những ứng dụng chính của kết nối cảm biến DTH11 với Arduino là theo dõi thời tiết.
Chuẩn bị
Phần cứng
Linh kiện | Số lượng |
Arduino | 1 |
Cảm biến DHT11 | 1 |
Màn hình LCD 16×2 | 1 |
Biến trở 10kΩ | 1 |
Điện trở 5kΩ | 1 |
Breadboard | 1 |
Dây cắm breadboard |
Phần mềm: Arduino IDE
Cảm biến nhiệt độ và độ ẩm DHT11
DHT11 là cảm biến nhiệt độ, độ ẩm rất thông dụng hiện nay vì chi phí rẻ và rất dễ lấy dữ liệu thông qua giao tiếp 1-wire ( sử dụng 1 dây data để truyền dữ liệu). Cảm biến được tích hợp bộ tiền xử lý tín hiệu giúp dữ liệu nhận về được chính xác mà không cần phải qua bất kỳ tính toán nào.
Cảm biến nhiệt độ và độ ẩm DHT11 bao gồm 3 thành phần chính. Một cảm biến độ ẩm loại điện trở, một điện trở nhiệt NTC (Negative Temperature Coefficient – hệ số nhiệt âm) để đo nhiệt độ và một vi điều khiển 8 bit có nhiệm vụ chuyển đổi tín hiệu tương tự từ cảm biến và gửi ra tín hiệu số duy nhất.
Tín hiệu số này có thể được đọc bởi bất kỳ vi điều khiển hoặc bộ vi xử lý nào để phân tích.
Sơ đồ chân
Cảm biến DHT11 gồm 2 chân cấp nguồn (VCC và GND), và 1 chân tín hiệu (DATA). Hiện nay, thông dụng ngoài thị trường có hai loại đóng gói cho DHT11: 3 chân và 4 chân như hình bên dưới
Thông số kĩ thuật
- Điện áp hoạt động: 3-5VDC.
- Dải nhiệt độ đo: 0-50°C. Sai số ±2°C.
- Dải độ ẩm đo: 20-80%. Sai số ±5%.
- Tần số lấy mẫu: 1Hz(mỗi giây một lần).
- Để dữ liệu chính xác thì khoảng cách dây từ vi điều khiển đến cảm biến không quá 20m.
Hình ảnh sau đây cho thấy một mạch ứng dụng điển hình cho cảm biến độ ẩm và nhiệt độ DHT11. Cảm biến DHT11 có thể đo giá trị độ ẩm trong khoảng 20 – 90% Độ ẩm tương đối (RH) và nhiệt độ trong khoảng 0 – 500C. Khoảng thời gian lấy mẫu của cảm biến là 1 giây.
Tất cả các cảm biến DHT11 được hiệu chuẩn chính xác trong phòng thí nghiệm và kết quả được lưu trữ trong bộ nhớ.
DHT11 gửi và nhận dữ liệu với một dây tín hiệu DATA, với chuẩn dữ liệu truyền 1 dây này, chúng ta phải đảm bảo sao cho ở chế độ chờ (idle) dây DATA có giá trị ở mức cao, nên trong mạch sử dụng DHT11, dây DATA phải được mắc với một điện trở kéo bên ngoài (thông thường giá trị là 4.7kΩ).
Ngoài ra, chiều dài của cáp có thể dài tới 20 mét. Dữ liệu từ cảm biến bao gồm các bộ phận tích phân và thập phân cho cả độ ẩm tương đối (RH) và nhiệt độ.
Dữ liệu truyền về từ cảm biến DHT11 bao gồm 40 bit và định dạng như sau:
8 bit biểu thị phần nguyên của độ ẩm + 8 bit biểu thị phần thập phân của độ ẩm + 8 bit biểu thị phần nguyên của nhiệt độ + 8 bit biểu thị phần thập phân của nhiệt độ + 8 bit checksum.
Ví dụ:
Xem xét dữ liệu nhận được từ cảm biến DHT11 là
00100101 00000000 00011001 00000000 00111110.
Dữ liệu này có thể được phân tách dựa trên cấu trúc nêu trên như sau
Để kiểm tra xem liệu dữ liệu nhận được có chính xác hay không, chúng ta cần thực hiện một phép tính nhỏ. Cộng tất cả các giá trị nguyên và thập phân của độ ẩm và nhiệt độ và kiểm tra xem tổng có bằng giá trị checksum hay không, tức là dữ liệu 8 bit cuối cùng.
00100101 + 00000000 + 00011001 + 00000000 = 00111110
Giá trị này giống như 8 bit checksum và do đó dữ liệu nhận được là hợp lệ. Bây giờ để có được giá trị độ ẩm và nhiệt độ, chỉ cần chuyển đổi dữ liệu nhị phân thành dữ liệu thập phân.
Độ ẩm = Giá trị thập phân của 00100101 = 37%
Nhiệt độ = Giá trị thập phân của 00011001 = 250C
Sơ đồ mạch
Sơ đồ mạch sau đây cho thấy tất cả các kết nối cần thiết cần thiết để thực hiện dự án này.
Chương trình
#include <DHT.h>
#include <LiquidCrystal.h>
#define DHTPIN 8
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
byte degree[8] =
{
0b00011,
0b00011,
0b00000,
0b00000,
0b00000,
0b00000,
0b00000,
0b00000
};
void setup() {
Serial.begin(9600);
Serial.println(“Cam bien nhiet do va do am DHT11”);
lcd.begin(16, 2);
lcd.createChar(1, degree);
lcd.clear();
lcd.setCursor(0,0);
lcd.print(“Do nhiet do va”);
lcd.setCursor(0,1);
lcd.print(“do am dung DHT11”);
delay(1000);
lcd.clear();
lcd.print(“dientuadenz.com”);
delay(1000);
dht.begin();
}
void loop() {
// Chờ một vài giây giữa các lần đo.
delay(2000);
// Đọc nhiệt độ và độ ẩm
float h = dht.readHumidity();
// Đọc nhiệt độ bằng độ C
float t = dht.readTemperature();
// Đọc nhiệt độ theo độ F
float f = dht.readTemperature(true);
// Kiểm tra xem có bất kỳ lần đọc nào không thành công và thoát sớm (để thử lại).
if (isnan(h) || isnan(t) || isnan(f)) {
Serial.println(“Khong doc duoc tu cam bien DHT!”);
return;
}
float hi = dht.computeHeatIndex(f, h);
lcd.setCursor(0,0);
lcd.print(“Nhiet do: “);
lcd.print(t);
lcd.print(“C”);
lcd.setCursor(0,2);
lcd.print(“Do am: “);
lcd.print(h);
lcd.print(” %\t”);
/* In kết quả ra Serial Monitor */
Serial.print(“Nhiet do:”);
Serial.print(t);
Serial.print(“*C\n”);
Serial.print(“Do am:”);
Serial.print(h);
Serial.print(“%\n”);
Serial.println();
delay(1000);
}