Reference - Vọc vạch DHT11 lấy thông số Humidity & Temperature với thư viện DHT Lib


Ok, đến hẹn lại lên, hôm nay sẽ vọc vạch DHT11 có gì thú vị, ah thì ra nó là một sensor cảm biến lấy nhiệt độ và độ ẩm (Temperature & Humidity ) và có thư viện DHT Lib hỗ trợ.

Vậy nó ra sao, ah nó là một con sensor chút xíu ah, bằng ngón tay cái nhưng cũng hơi lợi hại :)


Lần đầu tiên đụng đến cũng chẳng biết nó ra sao nên phải học xem nó là gì, thế là phải đọc và đọc... không đọc biết gì về nó đâu mà làm

https://www.mouser.com/ds/2/758/DHT11-Technical-Data-Sheet-Translated-Version-1143054.pdf


Sau khi đọc xong cũng mườn tượng ra nó như thế nào, tới đây cũng hiểu hiểu một phần nào, nói chung nắm được thông số. Nhìn lại con sensor của mình thấy có gắn kèm bo mạch nhỏ và cho ra 3 chân thì coi như khoái khoái, đã khỏe rồi lôi ra dùng thôi.

Giờ code ư, cũng chả biết code gì với nó đây, sau khi đọc tài liệu thấy nó trả về cho độ C và độ Ẩm thì ngồi nghĩ ngay đến trên đời này người dùng đơn vị nào đo nhiệt độ, hồi đi học nghe độ C, độ F nè àm quan tâm làm gì đâu, quên cmn mất tiêu thế là google thần chưởng, cuối cùng ai ngờ học lại các công thức tính nhiệt độ kakak hồi nhỏ éo biết có học chưa mà có học thì bạn cùng lớp học chứ ăn ngủ không nhớ quái gì :( :(

Thế là tiện thể làm sẵn bảng công thức tính chuyển đồi luôn có gì lôi ra sài cũng được, nhỏ không học lớn học cũng được :)



OK, giờ bắt đầu tìm hiểu thư viện nó có cái gì theo link bên dưới

https://github.com/adafruit/DHT-sensor-library

Hầu như thư viện này đã làm hết và trả về cho ta độ C và độ ẩm, tới đây là tận răng rồi, khi có được 2 dữ liệu này thì muốn làm gì làm, nhiêu đó là đủ.

Giờ phần vật lý, DHT11 tích hợp vào 1 module QC Xinda, thấy tên Xinda nên tạm gọi là mudule Xinda đi cho dễ (tên của hãng Xinda hay sao)

Nó có 3 chân như hình trên, thì theo thứ tự từ trái qua phải như sau :
1 - S - Signal
2 -  VCC 
3 - GND



DHT Lib đã làm sẵn cho ta hết mọi thứ liên quan đến độ C và độ F, và  giờ chỉ cần gọi ra là dùng và viết thêm + - * / để làm luôn các độ còn lại

#include "Adafruit_Sensor.h"
#include "DHT.h"
#define DHTPIN 7   
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
void setup() {
  Serial.begin(9600);
  dht.begin();
}
void loop() {
  delay(2000);
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  float f = dht.readTemperature(true);
  float k = convertCtoK(t);
  float ra = convertCtoRa(t);
  float ro = convertCtoRo(t);
  float n = convertCtoN(t);
  float d = convertCtoD(t);
  float re = convertCtoRe(t);
  if (isnan(h) || isnan(t)) {
    Serial.println(F("Failed to read from DHT sensor!"));
    return;
  }
  Serial.print("Humidity: ");
  Serial.print(h);
  Serial.print("% \n");
  Serial.print("--------------- \n");
  Serial.print("  Temperature: ");
  Serial.print(t);
  Serial.print("°C \t");
  Serial.print(f);
  Serial.print("°F \t");
  Serial.print(k);
  Serial.print("°K \t");
  Serial.print(ra);
  Serial.print("°RA \t");
  Serial.print(ro);
  Serial.print("°Ro \t");
  Serial.print(n);
  Serial.print("°N \t");
  Serial.print(d);
  Serial.print("°D \t");
  Serial.print(re);
  Serial.print("°Re \n"); 
}
float convertCtoK(float c) 
{ 
  float result;
  result = c + 273.15; 
  return result;
}

float convertCtoRa(float c)
{ 
  float result;
  result = c + 273.15 * 1.8; 
  return result;
}

float convertCtoRo(float c)
{ 
  float result;
  result = (c * 0.525) + 7.5;
  return result;
}
float convertCtoN(float c)
{
  float result;
  result = c * 0.33; 
  return result;
}
float convertCtoD(float c)
{ 
  float result;
  result = (100 - c) * 1.5; 
  return result;
}
float convertCtoRe(float c)
{ 
  float result;
  result = c * 0.8; 
  return result;
}




Có một phần khá hay là Lib đã viết sẵn luôn là Compute Heat Index (Tính chỉ số nhiệt) tham khảo link sau


https://www.weather.gov/ama/heatindex



Heat Index = -42.379 + 2.04901523T + 10.14333127R - 0.22475541TR - 6.83783 x 10-3T2 - 5.481717 x 10-2R2 + 1.22874 x 10-3T2R + 8.5282 x 10-4TR2 - 1.99 x 10-6T2R2

Note:
T - air temperature (F) 
R - relative humidity (percentage)

#include "Adafruit_Sensor.h"
#include "DHT.h"
#define DHTPIN 7   
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
void setup() {
  Serial.begin(9600);
  dht.begin();
}
void loop() {
   delay(2000);
   float h = dht.readHumidity();
   float t = dht.readTemperature();
   float f = dht.readTemperature(true);
   float hi_f = dht.computeHeatIndex(f, h);
   float hi_c = dht.computeHeatIndex(t, h, false);
  if (isnan(h) || isnan(t)) {
    Serial.println(F("Failed to read from DHT sensor!"));
    return;
  }
  Serial.print("Heat index: ");
  Serial.print(hi_c);
  Serial.print("°C \t");
  Serial.print(hi_f);
  Serial.println("°F");
}



Hầu như thư viện đã hỗ trợ tận răng rồi, chỉ cần chuyển đổi tí và có xíu ý tưởng sẽ ráp lại thành một project nho nhỏ, hoặc có thể kết nối với Esp8266 và nạp code trực tiếp vào esp8266 không cần dùng adruino cũng được ... 


Nhãn: