DHT11溫濕度傳感器簡(jiǎn)介
DHT11是一款有已校準(zhǔn)數(shù)字信號(hào)輸出的溫濕度傳感器。 其精度濕度+-5%RH, 溫度+-2℃,量程濕度20-90%RH, 溫度0~50℃。
DHT11數(shù)字溫濕度傳感器是一款含有已校準(zhǔn)數(shù)字信號(hào)輸出的溫濕度復(fù)合傳感器,它應(yīng)用專(zhuān)用的數(shù)字模塊采集技術(shù)和溫濕度傳感技術(shù),確保產(chǎn)品具有極高的可靠性和卓越的長(zhǎng)期穩(wěn)定性。傳感器包括一個(gè)電阻式感濕元件和一個(gè)NTC測(cè)溫元件,并與一個(gè)高性能8位單片機(jī)相連接。因此該產(chǎn)品具有品質(zhì)卓越、超快響應(yīng)、抗干擾能力強(qiáng)、性?xún)r(jià)比極高等優(yōu)點(diǎn)。每個(gè)DHT11傳感器都在極為精確的濕度校驗(yàn)室中進(jìn)行校準(zhǔn)。校準(zhǔn)系數(shù)以程序的形式存在OTP內(nèi)存中,傳感器內(nèi)部在檢測(cè)信號(hào)的處理過(guò)程中要調(diào)用這些校準(zhǔn)系數(shù)。單線制串行接口,使系統(tǒng)集成變得簡(jiǎn)易快捷。超小的體積、極低的功耗,使其成為該類(lèi)應(yīng)用中,在苛刻應(yīng)用場(chǎng)合的最佳選擇。產(chǎn)品為4針單排引腳封裝,連接方便。
DHT11溫濕度傳感器電氣特性

溫濕度傳感器DHT11封裝形式及接口說(shuō)明
建議連接線長(zhǎng)度短于20米時(shí)用5K上拉電阻,大于20米時(shí)根據(jù)實(shí)際情況使用合適的上拉電阻(若購(gòu)買(mǎi)的是已集成的模塊,模塊上已加上拉電阻,以下請(qǐng)忽略),當(dāng)然,如果你想要精簡(jiǎn)電路的話, STC增強(qiáng)型單片機(jī)自帶的推挽輸出功能不失為一個(gè)選擇,其相當(dāng)于外接了一個(gè)2k的上拉電阻,但在設(shè)計(jì)電路時(shí)需注意:整個(gè)單片機(jī)的電流推薦不超過(guò)55mA,即從MCU-VCC流入的電流不超過(guò)55mA,從MCU-GND流出的電流不超過(guò)55mA,整體流入、流出電流均不超過(guò)55mA,封裝尺寸及典型應(yīng)用電路圖如下圖所示。
DHT11溫濕度傳感器典型應(yīng)用電路

DHT11溫濕度傳感器時(shí)序圖

DHT11溫濕度傳感器連接圖
如圖所示,將DHT11的正極與5V電源接口相連,負(fù)極與GND相連,中間的數(shù)據(jù)接口與2號(hào)引腳相連。
代碼
#include 《dht11.h》
dht11 DHT11;
#define DHT11PIN 2
void setup(){
Serial.begin(9600);
}
void loop(){
Serial.println(“/n”);
int chk = DHT11.read(DHT11PIN);
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 (oC): ”);
Serial.println((float)DHT11.temperature, 2);
delay(2000);
注意事項(xiàng)
1、代碼中引用了#include 《dht11.h》,這個(gè)是操作DHT11的庫(kù)文件,有了它,就可以輕松操作我們這個(gè)溫濕度傳感器了。但是引用這個(gè)庫(kù)文件的操作步驟是:
?。?)在網(wǎng)上找到并下載該庫(kù)文件,包括一個(gè)頭文件和一個(gè).cpp文件。
?。?)在arduinoIDE中點(diǎn)擊菜單:程序–導(dǎo)入庫(kù)–add library,然后選擇你存放庫(kù)文件的那個(gè)文件夾。
?。?)在代碼中引用#include 《dht11.h》,這樣就可以使用了。
2、#define DHT11PIN 2,表示定義引腳2的名字為DHT11PIN ,注意這個(gè)定義語(yǔ)句后面沒(méi)有分號(hào)。
原理分析
在硬件編程過(guò)程中,當(dāng)你拿到一個(gè)器件,首先要了解他的引腳定義,這會(huì)告訴你這個(gè)東西應(yīng)該怎么連接,在一個(gè)就是要看他的時(shí)序圖,看了時(shí)序圖你就知道主從設(shè)備之間進(jìn)行數(shù)據(jù)采集過(guò)程中的代碼應(yīng)該怎么寫(xiě),比如怎么啟動(dòng),如何握手,怎么采集真正的數(shù)據(jù)等等。
在我們這個(gè)試驗(yàn)中,DHT11的時(shí)序圖是這樣的:
DHT11溫濕度傳感器使用注意事項(xiàng)
DHT11的供電電壓為3-5.5V。傳感器上電后,要等待1s以越過(guò)不穩(wěn)定狀態(tài)在此期間無(wú)需發(fā)送任何指令。電源引腳(VDD,GND)之間可增加一個(gè)100nF的電容,用以去耦濾波。
微處理器與DHT11之間的通訊和同步,采用單總線數(shù)據(jù)格式,一次通訊時(shí)間4ms左右,數(shù)據(jù)分小數(shù)部分和整數(shù)部分,具體格式在下面說(shuō)明,當(dāng)前小數(shù)部分用于以后擴(kuò)展,現(xiàn)讀出為零。
操作流程如下:
一次完整的數(shù)據(jù)傳輸為40bit,高位先出。
數(shù)據(jù)格式:8bit濕度整數(shù)數(shù)據(jù)+8bit濕度小數(shù)數(shù)據(jù)
+8bi溫度整數(shù)數(shù)據(jù)+8bit溫度小數(shù)數(shù)據(jù)+8bit校驗(yàn)和
數(shù)據(jù)傳送正確時(shí)校驗(yàn)和數(shù)據(jù)等于8bit濕度整數(shù)數(shù)據(jù)+8bit濕度小數(shù)數(shù)據(jù)+8bi溫度整數(shù)數(shù)據(jù)+8bit溫度小數(shù)數(shù)據(jù)所得結(jié)果的末8位。
用戶MCU發(fā)送一次開(kāi)始信號(hào)后,DHT11從低功耗模式轉(zhuǎn)換到高速模式,等待主機(jī)開(kāi)始信號(hào)結(jié)束后,DHT11發(fā)送響應(yīng)信號(hào),送出40bit的數(shù)據(jù),并觸發(fā)一次信號(hào)采集,用戶可選擇讀取部分?jǐn)?shù)據(jù)。
從模式下,DHT11接收到開(kāi)始信號(hào)觸發(fā)一次溫濕度采集,如果沒(méi)有接收到主機(jī)發(fā)送開(kāi)始信號(hào),DHT11不會(huì)主動(dòng)進(jìn)行溫濕度采集。采集數(shù)據(jù)后轉(zhuǎn)換到低速模式。
通訊過(guò)程
總線空閑狀態(tài)為高電平,主機(jī)把總線拉低等待DHT11響應(yīng),主機(jī)把總線拉低必須大于18毫秒,保證DHT11能檢測(cè)到起始信號(hào)。DHT11接收到主機(jī)的開(kāi)始信號(hào)后,等待主機(jī)開(kāi)始信號(hào)結(jié)束,然后發(fā)送80us低電平響應(yīng)信號(hào)。主機(jī)發(fā)送開(kāi)始信號(hào)結(jié)束后,延時(shí)等待20-40us后,讀取DHT11的響應(yīng)信號(hào),主機(jī)發(fā)送開(kāi)始信號(hào)后,可以切換到輸入模式,或者輸出高電平均可,總線由上拉電阻拉高。
總線為低電平,說(shuō)明DHT11發(fā)送響應(yīng)信號(hào),DHT11發(fā)送響應(yīng)信號(hào)后,再把總線拉高80us,準(zhǔn)備發(fā)送數(shù)據(jù),每一bit數(shù)據(jù)都以50us低電平時(shí)隙開(kāi)始,高電平的長(zhǎng)短定了數(shù)據(jù)位是0還是1.格式見(jiàn)下面圖示。如果讀取響應(yīng)信號(hào)為高電平,則DHT11沒(méi)有響應(yīng),請(qǐng)檢查線路是否連接正常。當(dāng)最后一bit數(shù)據(jù)傳送完畢后,DHT11拉低總線50us,隨后總線由上拉電阻拉高進(jìn)入空閑狀態(tài)。
數(shù)字0信號(hào)表示方法
數(shù)字1信號(hào)表示方法
程序:
//DHT11temperature
//chriz_w@163.com
//arduinonano
//arduinolite
#include“arduino_lit.h”
#defineDHT11Pin2
//TesttheDHT11--chriz_w@163.com
bytedat[5];//存放濕度2byte,溫度2byte,checksum1byte
bytereadData(){//每次讀取8bits(onebyte)
bytedata;
for(inti=0;i《8;i++){
if(digitalRead(DHT11Pin)==LOW)
{
//一開(kāi)始要LOW才表示要傳過(guò)來(lái)
while(digitalRead(DHT11Pin)==LOW);//等待50us;
//現(xiàn)在已經(jīng)變成HIGH了
_delay_us(30);//判斷高電平持續(xù)時(shí)間,以判定資料是‘0’還是‘1’;
if(digitalRead(DHT11Pin)==HIGH)//根據(jù)時(shí)序持續(xù)了30us以上就是1
data|=(1《《(7-i));//高位在前,低位元在后;
//如果這時(shí)已經(jīng)是LOW,表示這bit是0,不必塞入data
//。。而且以下的while也會(huì)立即結(jié)束(因?yàn)長(zhǎng)OW),準(zhǔn)備接收下一個(gè)bit
while(digitalRead(DHT11Pin)==HIGH);//等待下一bit的接收;
//這時(shí)一定已經(jīng)變成LOW了
}
}
returndata;//收完8bit=onebyte=onechar
}
voidstart_dht11(){//每次要與DHT11溝通
DIGITAL_WRITE(DHT11Pin,LOW);//拉低到LOW,發(fā)表示要開(kāi)始溝通的信號(hào);
_delay_ms(30);//延時(shí)要大于18ms,以便DHT11能檢測(cè)到開(kāi)始信號(hào);這里用30ms
DIGITAL_WRITE(DHT11Pin,HIGH);//拉高HIGH,讓DHT11拉低到LOW告訴我們要傳送
_delay_us(40);//給40us等待DHT11響應(yīng);
PIN_MODE(DHT11Pin,INPUT);//改為輸入mode準(zhǔn)備digitalRead()
while(DIGITAL_READ(DHT11Pin)==HIGH);//必須等到LOW
_delay_us(80);//DHT11發(fā)出響應(yīng),會(huì)拉低80us;所以至少等80us
while(DIGITAL_READ(DHT11Pin)==LOW);//繼續(xù)等到變HIGH
_delay_us(80);//DHT11會(huì)拉高到HIGH80us后開(kāi)始發(fā)送資料;
///以下連續(xù)讀入5bytes(40bits),最后的byte是checksum校驗(yàn)值
for(inti=0;i《5;i++)
dat[i]=readData();//接收溫濕度資料,校驗(yàn);
PIN_MODE(DHT11Pin,OUTPUT);//改為Outputmode,準(zhǔn)備拉高HIGH
DIGITAL_WRITE(DHT11Pin,HIGH);//發(fā)送完一次資料后釋放bus,等待下一次開(kāi)始信號(hào);
}
voidsetup(){
SERIAL_BEGIN();
PIN_MODE(DHT11Pin,OUTPUT);
}
voidloop(){
start_dht11();//讀取濕度溫度和檢核位到dat[];其中dat[4]是checkSum
//根據(jù)datasheet規(guī)定,dat[4]要==(dat[0]+dat[1]+dat[2]+dat[3])%256
//否則表示溝通有錯(cuò)誤??!
PRINT(“currenthumidity=”);
println(dat[0]&0xff,10,serial_puts);
PRINT(“currenttemperature=”);
println(dat[2]&0xff,10,serial_puts);//顯示溫度的整數(shù)部分;
_delay_ms(2000);
}
intmain()
{
setup();
while(1)
loop();
}
評(píng)論