Thứ Hai, Tháng Mười Một 30, 2020
Trang chủ DIY Đọc Cảm Biến DHT11/DHT21/DHT22 không bị DELAY chương trình

Đọc Cảm Biến DHT11/DHT21/DHT22 không bị DELAY chương trình

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

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

Source code

#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:

#include

Đị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

#define DHT_SENSOR_TYPE DHT_TYPE_11
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 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( “%” );
}

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 😀

 

Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments

Most Popular

Hướng dẫn lắp ráp Khung Xe Robot Chasiss Black Cat Mecanum (P2)

Giới thiệu Chào các bạn, trong bài này mình sẽ hướng dẫn cách hàn dây motor, và cách đấu dây motor với driver cho đúng. Sỡ...

Hướng dẫn lắp ráp Khung Xe Robot Chasiss Black Cat Mecanum (P1)

Giới thiệu Chào các bạn, trong bài viết này mình sẽ giải thích sơ qua về bánh xe Mecanum, cũng như nguyên lý hoạt động...

Hướng dẫn sử dụng Mạch đóng ngắt tải không tiếp xúc chế tạo Thiết bị vệ sinh tự động

Từ ngày 03/08/2020 mạch chuyển sang phiên bản mới tuy nhiên kích thước, vị trí linh kiện và chức năng của mạch giống và...

Lưu trữ nhật ký dữ liệu Online với ESP32 và Google Spreadsheets

Giới Thiệu Chào các bạn, trong các dự án IoT nhỏ gọn thì việc lưu trữ  và kiểm soát dữ liệu trên đám mây cũng...

Recent Comments

0
Would love your thoughts, please comment.x
()
x