Arduino 溫溼度感測器DHT11模組實驗
阿新 • • 發佈:2019-01-03
網上有很多DHT11的測試,試了N個程式,總是不得要領,各種報錯,最後終於找到一套可用的庫。
首先是DHT11.h檔案
#ifndef __DHT11_H__ #define __DHT11_H__ #include <Arduino.h> //DHT11 IO設定 #define DHT11_DQ 2 #define DHT11_DQ_0 digitalWrite(DHT11_DQ,LOW) #define DHT11_DQ_1 digitalWrite(DHT11_DQ,HIGH) //函式或者變數宣告 extern void DHT11_Init(); extern unsigned char DHT11_Read_Byte(); extern void DHT11_Read(); extern unsigned char HUMI_Buffer_Int; extern unsigned char TEM_Buffer_Int; #endif
其次是DHT11.cpp檔案
#include "DHT11.h" //定義變數 unsigned char HUMI_Buffer_Int = 0; unsigned char TEM_Buffer_Int = 0; //**************************************************** //初始化DHT11 //**************************************************** void DHT11_Init() { pinMode(DHT11_DQ,OUTPUT); DHT11_DQ_0; //拉低匯流排,發開始訊號; delay(30); //延時要大於 18ms,以便 DHT11 能檢測到開始訊號; DHT11_DQ_1; delayMicroseconds(40); //等待 DHT11 響應; pinMode(DHT11_DQ,INPUT); while(digitalRead(DHT11_DQ) == HIGH); delayMicroseconds(80); //DHT11 發出響應,拉低匯流排 80us; if(digitalRead(DHT11_DQ) == LOW); delayMicroseconds(80); //DHT11 拉高匯流排 80us 後開始傳送資料; } //**************************************************** //讀一個位元組DHT11資料 //**************************************************** unsigned char DHT11_Read_Byte() { unsigned char i,dat = 0; unsigned int j; pinMode(DHT11_DQ,INPUT); for( i=0; i<8; i++) { if(digitalRead(DHT11_DQ) == LOW) { while(digitalRead(DHT11_DQ) == LOW); //等待 50us; delayMicroseconds(30); //判斷高電平的持續時間,以判定資料是‘0’還是‘1’; if(digitalRead(DHT11_DQ) == HIGH) dat |= (1<<(7-i)); //高位在前,低位在後; while(digitalRead(DHT11_DQ) == HIGH); //資料‘1’,等待下一位的接收; } } return dat; } //**************************************************** //讀取溫溼度值,存放在TEM_Buffer和HUMI_Buffer //**************************************************** void DHT11_Read() { DHT11_Init(); HUMI_Buffer_Int = DHT11_Read_Byte(); //讀取溼度的整數值 DHT11_Read_Byte(); //讀取溼度的小數值 TEM_Buffer_Int = DHT11_Read_Byte(); //讀取溫度的整數值 DHT11_Read_Byte(); //讀取溫度的小數值 DHT11_Read_Byte(); //讀取校驗和 delayMicroseconds(50); //DHT11拉低匯流排50us pinMode(DHT11_DQ,OUTPUT); DHT11_DQ_1; //釋放匯流排 }
最後是主程式檔案
#include <Arduino.h> #include "DHT11.h" void setup() //Arduino程式初始化程式放在這裡,只在開機時候執行一次 { Serial.begin(9600); //設定通訊的波特率為9600 DHT11_Read(); //讀取溫溼度值 delay(200); //等待感測器穩定 } void loop() //Arduino程式的主程式部分,迴圈執行內部程式 { DHT11_Read(); //讀取溫溼度值 Serial.print("HUMI = "); Serial.print(HUMI_Buffer_Int); Serial.println(" %RH"); Serial.print("TMEP = "); Serial.print(TEM_Buffer_Int); Serial.println(" C"); delay(1000); //延時1s }
三個檔案儲存在同一個資料夾即可。