通過本文,可以了解到以下內容:
- DHT11 溫濕度傳感器接線與使用
- DHT11 Arduino 測試程序編寫
- DHT11 溫濕度轉換顯示
DHT11 溫濕度傳感器接線與使用
DHT11 是一款溫濕度傳感器,可以用來測試環境溫濕度,該傳感器的的溫度測量范圍為 0 ~ 50°C,誤差為 2 °C;濕度測量范圍為在 0°C時為30%-90%RH,環境溫度為 25°C時,濕度測量范圍為20%-90%RH,在50°C時,測量范圍是20%-80%。
DHT11 傳感器接線方法并不復雜,DHT11封裝有4個引腳,各個引腳說明如下:
Pin | 名稱 | 注釋 |
---|---|---|
1 | VDD | 供電 3-5.5 VDC |
2 | DATA | 串行數據,單總線 |
3 | NC | 空腳 |
4 | GND | 接地,電源負極 |
一般從網上買的 Arduino 傳感器套件版本的 DHT11,會有一個帶 LED 的焊好的板,上面有三個接線引腳,分別是 VCC, GND, DATA,接線時,只要將 VCC 接到 Arduino 5V上,GND 接到 Arduino GND 上,DATA 引腳接 Arduino Pin8上即可。
DHT11 Arduino 測試程序編寫
DHT11 Arduino 的測試程序也很簡單,主要分幾個部分:
- 引入 dht11 庫
- 設置端口
- 檢查 DHT11 是否正確連接
- 獲取 DHT11 測量數據
程序詳細如下:
// 引入 DHT 庫文件,如果沒有,先從網上下載好,在 Arduino 中導入
#include <dht11.h>
dht11 DHT11;
// 設置 DHT 引腳 為 Pin 8
#define DHT11PIN 8
void setup() {
Serial.begin(9600);
Serial.println("DHT11 TEST PROGRAM");
Serial.print("LIBRARY");
// 輸出 DHT 庫的版本號
Serial.println(DHT11LIB_VERSION);
Serial.println();
}
void loop() {
Serial.println("\n");
int chk = DHT11.read(DHT11PIN);
// 測試 DHT 是否正確連接
Serial.print("Read sensor: ");
switch (chk)
{
case DHTLIB_OK:
Serial.println("OK");
break;
case DHTLIB_ERROR_CHECKSUM:
Serial.println("Checksum error");
break;
case DHTLIB_ERROR_TIMEOUT:
Serial.println("Time out error");
break;
default:
Serial.println("Unknown error");
break;
}
// 獲取測量數據
Serial.print("Humidity (%): ");
Serial.println((float)DHT11.humidity, 2);
Serial.print("Temperature °C): ");
Serial.println((float)DHT11.temperature, 2);
delay(2000);
程序編寫完成后,上傳到 Arduino,重啟 Arduino ,再在 Arduino IDE 的串口監視器中可以看到測量數據。
DHT11 溫濕度測量數據單位轉換
我們習慣常用的溫度單位是攝氏度,濕度單位是百分比。但實際生產中,有可能需要用到其他的單位,以下是參考 arduino.cc 上提供的溫度轉換函數供參考。
//Celsius to Fahrenheit conversion
double Fahrenheit(double celsius)
{
return 1.8 * celsius + 32;
}
// fast integer version with rounding
//int Celcius2Fahrenheit(int celcius)
//{
// return (celsius * 18 + 5)/10 + 32;
//}
//Celsius to Kelvin conversion
double Kelvin(double celsius)
{
return celsius + 273.15;
}
// dewPoint function NOAA
// reference (1) : http://wahiduddin.net/calc/density_algorithms.htm
// reference (2) : http://www.colorado.edu/geography/weather_station/Geog_site/about.htm
//
double dewPoint(double celsius, double humidity)
{
// (1) Saturation Vapor Pressure = ESGG(T)
double RATIO = 373.15 / (273.15 + celsius);
double RHS = -7.90298 * (RATIO - 1);
RHS += 5.02808 * log10(RATIO);
RHS += -1.3816e-7 * (pow(10, (11.344 * (1 - 1/RATIO ))) - 1) ;
RHS += 8.1328e-3 * (pow(10, (-3.49149 * (RATIO - 1))) - 1) ;
RHS += log10(1013.246);
// factor -3 is to adjust units - Vapor Pressure SVP * humidity
double VP = pow(10, RHS - 3) * humidity;
// (2) DEWPOINT = F(Vapor Pressure)
double T = log(VP/0.61078); // temp var
return (241.88 * T) / (17.558 - T);
}
// delta max = 0.6544 wrt dewPoint()
// 6.9 x faster than dewPoint()
// reference: http://en.wikipedia.org/wiki/Dew_point
double dewPointFast(double celsius, double humidity)
{
double a = 17.271;
double b = 237.7;
double temp = (a * celsius) / (b + celsius) + log(humidity*0.01);
double Td = (b * temp) / (a - temp);
return Td;
}
上面的代碼可以根據實際情況,將 DHT11 的測量數據帶入函數進行轉換即可。
小結
本文介紹了如果連接、使用 DHT11 溫濕度傳感器,并且介紹了 DHT11 的測試程序如何編寫。另外,有一點自己在實驗的時候遇到的一個小問題,就是我所使用的 UNO R3 Arduino 主板的 DIGITAL 引線排從小到大分別是 RX0 TX1 PIN2 ……,我開始沒有認真看清楚,以為 RX0 TX1 之后是 Pin0,我最初設置使用的引腳是 Pin 2,因此我錯誤的把引線接到 Pin 3上,串口監視器一直沒有信息,我以為是傳感器壞了,后來更換 Pin 口,才發現了這個小失誤,所以希望讀者在接線的時候要注意,我之前也是因為接線錯誤導致一個 HC05 藍牙模塊損壞。
參考資料
溫濕度傳感器DHT11
A DHT11 Class for Arduino.
KY-015 TEMPERATURE AND HUMIDITY SENSOR MODULE
數字溫濕度傳感器