失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 树莓派dht11 python_树莓派使用DHT11温湿度传感器

树莓派dht11 python_树莓派使用DHT11温湿度传感器

时间:2020-07-14 01:46:09

相关推荐

树莓派dht11 python_树莓派使用DHT11温湿度传感器

使用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温湿度传感器》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。