溫濕度傳感器DHT11程式示例
DHT11概述
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIx0DciV2dmADM30zd-cmbw5CRzUCRzUydaVnQux0MjRVTy0keNpXRE5EewkXT0sGRPBTW61keFpXT5dGRNRTRE1UewMVT4VlaOpXUU1kdnRUT0UERNlHOT1EeVpmT6FFVNZ3YyI2cKJDT0ljMZVXTzold41WW15UbMRTRE1UeNhlWuZ0ViBXO5xkNNh0YwIFSh9CXt92YuM3YltWas5iclN3Ztl2Lc9CX6MHc0RHaiojIsJye.png)
HT11數字溫濕度傳感器是一款含有已校準數字信号輸出的溫濕度複合傳感器。 它應用專用的數字子產品采集技術和溫濕度傳感技術,確定産品具有極高的可靠性與卓越的長期穩定性。傳感器包括一個電阻式感濕元件和一個NTC測溫元件,并與一個高性能8位單片機相連接配接。是以該産品具有品質卓越、超快響應、抗幹擾能力強、成本效益極高等優點。每個DHT11傳感器都在極為精确的濕度校驗室中進行校準。校準系數以程式的形式儲存在OTP記憶體中,傳感器内部在檢測信号的處理過程中要調用這些校準系數。 單線制串行接口,使系統內建變得簡易快捷。超小的體積、極低的功耗,信号傳輸距離可達20米以上,使其成為各類應用甚至最為苛刻的應用場合的最佳選則。産品為 4 針單排引腳封裝。連接配接友善,特殊封裝形式可根據使用者需求而提供。
主要應用
典型接線
引腳定義
電氣特性
單線雙向串行通信協定
DATA 用于微處理器與 DHT11之間的通訊和同步,采用單總線資料格式,一次通訊時間4ms左右,資料分小數部分和整數部分,具體格式在下面說明,目前小數部分用于以後擴充,現讀出為零。操作流程如下:
一次完整的資料傳輸為40bit,高位先出。資料格式:8bit濕度整數資料+8bit濕度小數資料+8bi溫度整數資料+8bit溫度小數資料+8bit校驗和資料,傳送正确時校驗和資料等于“ 8bit濕度整數資料+8bit濕度小數資料+8bi溫度整數資料+8bit溫度小數資料”所得結果的末8位。
使用者MCU發送一次開始信号後,DHT11從低功耗模式轉換到高速模式,等待主機開始信号結束後,DHT11發送響應信号,送出40bit的資料,并觸發一次信号采集,使用者可選擇讀取部分資料。從模式下,DHT11接收到開始信号觸發一次溫濕度采集,如果沒有接收到主機發送開始信号,DHT11不會主動進行溫濕度采集,采集資料後轉換到低速模式。
通訊過程如圖1,2所示
圖1
圖2
總線空閑狀态為高電平,主機把總線拉低等待DHT11響應,主機把總線拉低必須大于18毫秒,保證DHT11能檢測到起始信号。主機發送開始信号結束後, 可以切換到輸入模式,或者輸出高電平,延時等待20-40us後, 讀取DHT11的響應信号。 DHT11接收到主機的開始信号後,等待主機開始信号結束,然後發送80us低電平響應信号。如果讀取響應信号為高電平,則DHT11沒有響應,請檢查線路是否連接配接正常。
DHT11發送響應信号後,再把總線拉高80us,準備發送資料。每一bit資料都以50us低電平時隙開始,高電平的長短決定了資料位是0還是1。格式見下面圖示。當最後一bit資料傳送完畢後,DHT11拉低總線50us,随後總線由上拉電阻拉高進入空閑狀态。
數字0信号表示方法如圖4所示
圖3
數字1信号表示方法.如圖5所示
圖4
DHT11的Arduino程式示例
1 double Fahrenheit(double celsius)
2 {
3 return 1.8 * celsius + 32; //攝氏溫度度轉化為華氏溫度
4 }
5
6 double Kelvin(double celsius)
7 {
8 return celsius + 273.15; //攝氏溫度轉化為開氏溫度
9 }
10
11 // 露點(點在此溫度時,空氣飽和并産生露珠)
12 // 參考: http://wahiduddin.net/calc/density_algorithms.htm
13 double dewPoint(double celsius, double humidity)
14 {
15 double A0= 373.15/(273.15 + celsius);
16 double SUM = -7.90298 * (A0-1);
17 SUM += 5.02808 * log10(A0);
18 SUM += -1.3816e-7 * (pow(10, (11.344*(1-1/A0)))-1) ;
19 SUM += 8.1328e-3 * (pow(10,(-3.49149*(A0-1)))-1) ;
20 SUM += log10(1013.246);
21 double VP = pow(10, SUM-3) * humidity;
22 double T = log(VP/0.61078); // temp var
23 return (241.88 * T) / (17.558-T);
24 }
25
26 // 快速計算露點,速度是5倍dewPoint()
27 // 參考: http://en.wikipedia.org/wiki/Dew_point
28 double dewPointFast(double celsius, double humidity)
29 {
30 double a = 17.271;
31 double b = 237.7;
32 double temp = (a * celsius) / (b + celsius) + log(humidity/100);
33 double Td = (b * temp) / (a - temp);
34 return Td;
35 }
36
37 #include <dht11.h> //加入dht11類庫
38 dht11 DHT11; //定義DHT11
39 #define DHT11PIN 2 // DHT11的數字口接控制闆的2号引腳
40
41 void setup()
42 {
43 Serial.begin(9600);
44 Serial.println("DHT11 TEST PROGRAM ");
45 Serial.print("LIBRARY VERSION: ");
46 Serial.println(DHT11LIB_VERSION);
47 Serial.println();
48 }
49
50 void loop()
51 {
52 Serial.println("\n");
53 int chk = DHT11.read(DHT11PIN); // 庫函數DHT11.read()的傳回值
54 Serial.print("Read sensor: ");
55 switch (chk)
56 {
57 case DHTLIB_OK: //沒有錯誤
58 Serial.println("OK");
59 break;
60 case DHTLIB_ERROR_CHECKSUM: //校驗錯誤
61 Serial.println("Checksum error");
62 break;
63 case DHTLIB_ERROR_TIMEOUT: //逾時錯誤
64 Serial.println("Time out error");
65 break;
66 default: //未名的錯誤
67 Serial.println("Unknown error");
68 break;
69 }
70
71 Serial.print("Humidity (%): ");
72 Serial.println((float)DHT11.humidity, 2);
73
74 Serial.print("Temperature (oC): ");
75 Serial.println((float)DHT11.temperature, 2);
76
77 Serial.print("Temperature (oF): ");
78 Serial.println(Fahrenheit(DHT11.temperature), 2);
79
80 Serial.print("Temperature (K): ");
81 Serial.println(Kelvin(DHT11.temperature), 2);
82
83 Serial.print("Dew Point (oC): ");
84 Serial.println(dewPoint(DHT11.temperature, DHT11.humidity));
85
86 Serial.print("Dew PointFast (oC): ");
87 Serial.println(dewPointFast(DHT11.temperature, DHT11.humidity));
88
89 delay(2000);
90 }
運作效果:
發表于
2018-08-23 13:42
MyAutomation
閱讀(7960)
評論(0)
編輯
收藏
舉報