使用Arduino与DHT11监测温湿度
【原文】http://blog.****.net/micaroo/article/details/7239294
这两天开始一一测试之前买过的一些传感器,首先挑选的是DHT11,这个传感器用于粗略估计温湿度。
硬件连接很简单,只需要将DHT11传感器和数字针脚4相连,这里我用到了传感器扩展板,直接连在扩展板上。材料都是用的奥松机器人基地的。
第一件麻烦事儿就是DHT11的库文件,中文材料是木有滴,我到了官网,终于把一个可以用的库文件找出来了。这个库文件还可以测DHT22。如下两个文件,放在DHT文件夹中,然后放到ardunio的库文件夹。
dht.cpp
- //
- //FILE:dht.cpp
- //VERSION:0.1.01
- //PURPOSE:DHTTemperature&HumiditySensorlibraryforArduino
- //
- //DATASHEET:
- //
- //HISTORY:
- //0.1.01addedsupportforArduino1.0,fixedtypos(31/12/2011)
- //0.1.0byRobTillaart(01/04/2011)
- //inspiredbyDHT11library
- //
- #include"dht.h"
- #defineTIMEOUT10000
- /////////////////////////////////////////////////////
- //
- //PUBLIC
- //
- //returnvalues:
- //0:OK
- //-1:checksumerror
- //-2:timeout
- intdht::read11(uint8_tpin)
- {
- //READVALUES
- intrv=read(pin);
- if(rv!=0)returnrv;
- //CONVERTANDSTORE
- humidity=bits[0];//bit[1]==0;
- temperature=bits[2];//bits[3]==0;
- //TESTCHECKSUM
- uint8_tsum=bits[0]+bits[2];//bits[1]&&bits[3]both0
- if(bits[4]!=sum)return-1;
- return0;
- }
- //returnvalues:
- //0:OK
- //-1:checksumerror
- //-2:timeout
- intdht::read22(uint8_tpin)
- {
- //READVALUES
- intrv=read(pin);
- if(rv!=0)returnrv;
- //CONVERTANDSTORE
- humidity=word(bits[0],bits[1])*0.1;
- intsign=1;
- if(bits[2]&0x80)//negativetemperature
- {
- bits[2]=bits[2]&0x7F;
- sign=-1;
- }
- temperature=sign*word(bits[2],bits[3])*0.1;
- //TESTCHECKSUM
- uint8_tsum=bits[0]+bits[1]+bits[2]+bits[3];
- if(bits[4]!=sum)return-1;
- return0;
- }
- /////////////////////////////////////////////////////
- //
- //PRIVATE
- //
- //returnvalues:
- //0:OK
- //-2:timeout
- intdht::read(uint8_tpin)
- {
- //INITBUFFERVARTORECEIVEDATA
- uint8_tcnt=7;
- uint8_tidx=0;
- //EMPTYBUFFER
- for(inti=0;i<5;i++)bits[i]=0;
- //REQUESTSAMPLE
- pinMode(pin,OUTPUT);
- digitalWrite(pin,LOW);
- delay(20);
- digitalWrite(pin,HIGH);
- delayMicroseconds(40);
- pinMode(pin,INPUT);
- //GETACKNOWLEDGEorTIMEOUT
- unsignedintloopCnt=TIMEOUT;
- while(digitalRead(pin)==LOW)
- if(loopCnt--==0)return-2;
- loopCnt=TIMEOUT;
- while(digitalRead(pin)==HIGH)
- if(loopCnt--==0)return-2;
- //READTHEOUTPUT-40BITS=>5BYTES
- for(inti=0;i<40;i++)
- {
- loopCnt=TIMEOUT;
- while(digitalRead(pin)==LOW)
- if(loopCnt--==0)return-2;
- unsignedlongt=micros();
- loopCnt=TIMEOUT;
- while(digitalRead(pin)==HIGH)
- if(loopCnt--==0)return-2;
- if((micros()-t)>40)bits[idx]|=(1<<cnt);
- if(cnt==0)//nextbyte?
- {
- cnt=7;
- idx++;
- }
- elsecnt--;
- }
- return0;
- }
- //
- //ENDOFFILE
- //
dht.h
- //
- //FILE:dht.h
- //VERSION:0.1.01
- //PURPOSE:DHTTemperature&HumiditySensorlibraryforArduino
- //
- //URL:http://arduino.cc/playground/Main/DHTLib
- //
- //HISTORY:
- //seedht.cppfile
- //
- #ifndefdht_h
- #definedht_h
- #ifARDUINO<100
- #include<WProgram.h>
- #else
- #include<Arduino.h>
- #endif
- #defineDHT_LIB_VERSION"0.1.01"
- classdht
- {
- public:
- intread11(uint8_tpin);
- intread22(uint8_tpin);
- doublehumidity;
- doubletemperature;
- private:
- uint8_tbits[5];//buffertoreceivedata
- intread(uint8_tpin);
- };
- #endif
- //
- //ENDOFFILE
- //
库文件搞定之后,可以开始写ardunio程序了。这里因为只有DHT11,所以程序就不去测试22了。引入dht的库,然后编写如下代码:
- //
- //FILE:dht_test.pde
- //PURPOSE:DHTlibrarytestsketchforArduino
- //
- #include<dht.h>
- dhtDHT;
- #defineDHT11_PIN4//putthesensorinthedigitalpin4
- voidsetup()
- {
- Serial.begin(115200);
- Serial.println("DHTTESTPROGRAM");
- Serial.print("LIBRARYVERSION:");
- Serial.println(DHT_LIB_VERSION);
- Serial.println();
- Serial.println("Type,\tstatus,\tHumidity(%),\tTemperature(C)");
- }
- voidloop()
- {
- //READDATA
- Serial.print("DHT11,\t");
- intchk=DHT.read11(DHT11_PIN);
- switch(chk)
- {
- case0:Serial.print("OK,\t");break;
- case-1:Serial.print("Checksumerror,\t");break;
- case-2:Serial.print("Timeouterror,\t");break;
- default:Serial.print("Unknownerror,\t");break;
- }
- //DISPLATDATA
- Serial.print(DHT.humidity,1);
- Serial.print(",\t");
- Serial.println(DHT.temperature,1);
- delay(1000);
- }
- //
- //ENDOFFILE
- //
如果在控制台,出现了time out error,那么就是没读到数据,可能是引脚接错了。记得,我现在接的是数字引脚4。结果: