使用wiringpi编写C程序:
如下程序借鉴了网上一老外的程序,忘了原帖地址在哪。
#include
#include
#include
#include
#defineMAX_TIME85
#defineDHT11PIN7
#defineATTEMPTS5//retry5timeswhennoresponse
intdht11_val[5]={0,0,0,0,0};
intdht11_read_val(){
uint8_tlststate=HIGH;//laststate
uint8_tcounter=0;
uint8_tj=0,i;
for(i=0;i<5;i++)
dht11_val[i]=0;
//hostsendstartsignal
pinMode(DHT11PIN,OUTPUT);//setpintooutput
digitalWrite(DHT11PIN,LOW);//settolowatleast18ms
delay(18);
digitalWrite(DHT11PIN,HIGH);//settohigh20-40us
delayMicroseconds(40);
//startrecievedhtresponse
pinMode(DHT11PIN,INPUT);//setpintoinput
for(i=0;i
{
counter=0;
while(digitalRead(DHT11PIN)==lststate){//readpinstatetoseeifdhtresponsed.ifdhtalwayshighfor255+1times,breakthiswhilecircle
counter++;
delayMicroseconds(1);
if(counter==255)
break;
}
lststate=digitalRead(DHT11PIN);//readcurrentstateandstoreaslaststate.
if(counter==255)//ifdhtalwayshighfor255+1times,breakthisforcircle
break;
//top3transistionsareignored,maybeaimtowaitfordhtfinishresponsesignal
if((i>=4)&&(i%2==0)){
dht11_val[j/8]<<=1;//write1bitto0bymovingleft(autoadd0)
if(counter>16)//longmean1
dht11_val[j/8]|=1;//write1bitto1
j++;
}
}
//verifychecksumandprinttheverifieddata
if((j>=40)&&(dht11_val[4]==((dht11_val[0]+dht11_val[1]+dht11_val[2]+dht11_val[3])&0xFF))){
printf("RH:%d,TEMP:%d\n",dht11_val[0],dht11_val[2]);
return1;
}
else
return0;
}
intmain(void){
intattempts=ATTEMPTS;
if(wiringPiSetup()==-1)
exit(1);
while(attempts){//youhave5timestoretry
intsuccess=dht11_read_val();//getresultincludingprintingout
if(success){//ifgetresult,quitprogram;ifnot,retry5timesthenquit
break;
}
attempts--;
delay(2500);
}
return0;
} 上述程序保存为.c文件后编译成可执行文件,运行后会在屏幕打印温度和湿度。
程序中的数据接收处理部分细节如下:
if((i>=4)&&(i%2==0)){//前3次分别是:1低电平,2高电平(即响应信号),3低电平(即数据第一个低电平)
//i%2==0是因为每次都是循环读取低电平和高电平,每次要循环2次才读出一个bit处理
dht11_val[j/8]<<=1;//读到后,j/8可以限制一个数的8个位,左移1位自动补0,相当于读出0
if(counter>16)//counter计数如果超过16,则高电平长,应读1.
dht11_val[j/8]|=1;//故再将上面数与1位或,使最后一位变成1
j++;//j++8个换成下一个数据
}
if((j>=40)&&(dht11_val[4]==((dht11_val[0]+dht11_val[1]+dht11_val[2]+dht11_val[3])&0xFF))){
//这其中(dht11_val[0]+dht11_val[1]+dht11_val[2]+dht11_val[3])&0xFF)是将5个数相加,和1与。
//目的是防止读出数据都为0,和为0,0和1与后得0,所以if判断条件不成立,返回读取失败码。
//如果读出数据是不为0的正常数据,和1与后还得原数。
如果觉得《树莓派dht11 python_树莓派使用DHT11温湿度传感器》对你有帮助,请点赞、收藏,并留下你的观点哦!