Giới Thiệu
Chào các bạn, hôm nay mình giới thiệu và hướng dẫn cách đọc cảm biến các dòng DHT11/DHT21/DHT22 ở bài này mình sử dụng Cảm Biến Độ Ẩm, Nhiệt Độ DHT11 Ra Chân. Mình sẽ nói sơ lược qua về loại cảm biến này :
+ Tích hợp sẵn điện trở 5,1k, vì vậy các bạn không cần trở kéo như DHT11 loại chưa ra chân
+ Giao tiếp 1 Wire
+ Đo tốt ở độ ẩm 20- 80%RH với sai số 5%.
+ Khoảng đo nhiệt độ:0-50 °C sai số ± 2°C
+ Tần số lấy mẫu tối đa 1Hz (1 giây / lần)
+ Theo nhà sản xuất điện áp hoạt động ở mức 5V. Tuy nhiên mình test với 3.3V của ESP32 vẫn thấy chạy phà phà :))
Nhìn chung thì cảm biến này sai số cực kì lớn tới 5% đối với độ ẩm và 2°C với nhiệt độ. Nhưng với giá thành cực kì rẻ, còn đọc được cả nhiệt độ lẫn độ ẩm. Thời gian đọc lấy mẫu thấp nhất là 1s nên khi đọc cảm biến này chúng ta thường phải delay chương trình khoảng 2s. Mình thì lại muốn chương trình phải chạy liên tục và không được delay. Thế nên mới có cái bài này nè :)).
Nếu muốn đọc dữ liệu chính xác hơn thì các bạn có thể mua Cảm Biến Độ Ẩm, Nhiệt Độ DHT22 Ra Chân , hoặc Cảm Biến Độ Ẩm, Nhiệt Độ DHT21 AM2301 mình thấy hai loại cảm biến này khả là ổn và tốt hơn nhiều so với DHT11
Hôm nay mình sẽ giới thiệu tới thư viện DHT11- Nonblocking mình hay gọi là thư viện DHT không cần delay :D. OK bắt đầu thôi nào !
Chuẩn Bị
1. Phần cứng
- Board tương thích với Arduino IDE. Vì đang có sẵn trong tay Kit RF Thu Phát Wifi BLE ESP32 NodeMCU LuaNode32 nên mình sẽ sử dụng KIT này 😀
- Cảm Biến Độ Ẩm, Nhiệt Độ DHT11 Ra Chân
Lưu ý : như phân tích ở trên các bạn nên sử dụng cảm biến DHT11 loại ra chân để thuận tiện kết nối hơn
2. Phần mềm
- Arduino IDE đã cài đặt tương thích với ESP32.
- Library DHT_nonblocking hỗ trợ cho DHT11/DHT21/DHT22
Hướng dẫn
Các bạn kết nối chân cảm biến với chân đọc của VĐK. Chân các bạn có thể tự quy định, mình thì sử dụng chân D2 trên Kit NodeMCU ESP32
Kit RF Thu Phát Wifi BLE ESP32 NodeMCU LuaNode32 | Cảm Biến Độ Ẩm, Nhiệt Độ DHT11 |
VCC | + |
GND | – |
D2 | OUT |
Tiền đâu à lộn Đầu tiên :)) các bạn cần tải thư viện DHT_nonblocking về và add vào thư viện của Arduino IDE
Các bạn nạp code sau để đọc dữ liệu cảm biến DHT11 với tần số lấy mẫu 2s
#include <dht_nonblocking.h> #define DHT_SENSOR_TYPE DHT_TYPE_11 static const int DHT_SENSOR_PIN = 2; DHT_nonblocking dht_sensor( DHT_SENSOR_PIN, DHT_SENSOR_TYPE ); void setup( ) { Serial.begin( 115200 ); Serial.println("Makerlab demo DHT nonblocking"); } static bool measure_environment( float *temperature, float *humidity ) { static unsigned long measurement_timestamp = millis( ); if( millis( ) - measurement_timestamp > 2000ul ) { if( dht_sensor.measure( temperature, humidity ) == true ) { measurement_timestamp = millis( ); return( true ); } } return( false ); } void loop( ) { float temperature; float humidity; if( measure_environment( &temperature, &humidity ) == true ) { Serial.print( "Temperature = " ); Serial.print( temperature, 1 ); Serial.print( " *C,tHumidity = " ); Serial.print( humidity, 1 ); Serial.println( "%" ); } }
Các bạn lưu ý các phần sau :
Khai báo thư viện:
Định nghĩa chân cảm biến và loại cảm biến đọc. Ở phần trên chân số 2 trên NodeMCU ESP32 mình nối chân D2 với chân DATA của DHT11
static const int DHT_SENSOR_PIN = 2;
DHT_nonblocking dht_sensor( DHT_SENSOR_PIN, DHT_SENSOR_TYPE );
Thư viện này sẽ dùng static bool lấy giá trị về true khi đọc cảm biến thành công và trả lại false nếu lỗi và đọc cảm biến không được. Thay vì sử dụng delay tác giả đã sử dụng hàm millis() để đọc giá trị cảm biến sau mỗi 2s. Các bạn có thể thay thế “2000ul” – 2s thành thời gian bạn muốn cảm biến được đọc lại ví dụ : “4000ul” – 4s.
static bool measure_environment( float *temperature, float *humidity )
{
static unsigned long measurement_timestamp = millis( );
if( millis( ) – measurement_timestamp > 2000ul )
{
if( dht_sensor.measure( temperature, humidity ) == true )
{
measurement_timestamp = millis( );
return( true );
}
}
return( false );
}
Như mình đã giải thích ở trên static bool sẽ trả về true hoặc false nên trong hàm loop sẽ kiểm tra xem đã đọc được chưa, nếu đọc thành công rồi thì sẽ hiển thị lên Serial Monitor
float humidity;
if( measure_environment( &temperature, &humidity ) == true )
{
Serial.print( “Temperature = ” );
Serial.print( temperature, 1 );
Serial.print( ” *C,tHumidity = ” );
Serial.print( humidity, 1 );
Serial.println( “%” );
}
Tổng Kết
Hi vọng với bài viết này sẽ giúp các bạn cách đọc các dòng cảm biến DHT11/DHT21/DHT22 mà không bị delay chương trình. Giúp chương trình của các bạn chạy một cách tối ưu hơn và hạn chế delay hết mức có thể!
Chúc các bạn thành công với dự án của mình 😀