树莓派dht11 python_树莓派使用DHT11温湿度传感器
使用wiringpi編寫C程序:
如下程序借鑒了網(wǎng)上一老外的程序,忘了原帖地址在哪。
#include?
#include?
#include?
#include?
#define?MAX_TIME?85
#define?DHT11PIN?7
#define?ATTEMPTS?5?????????????????//retry?5?times?when?no?response
int?dht11_val[5]={0,0,0,0,0};
int?dht11_read_val(){
uint8_t?lststate=HIGH;?????????//last?state
uint8_t?counter=0;
uint8_t?j=0,i;
for(i=0;i<5;i++)
dht11_val[i]=0;
//host?send?start?signal
pinMode(DHT11PIN,OUTPUT);??????//set?pin?to?output
digitalWrite(DHT11PIN,LOW);????//set?to?low?at?least?18ms
delay(18);
digitalWrite(DHT11PIN,HIGH);???//set?to?high?20-40us
delayMicroseconds(40);
//start?recieve?dht?response
pinMode(DHT11PIN,INPUT);???????//set?pin?to?input
for(i=0;i
{
counter=0;
while(digitalRead(DHT11PIN)==lststate){?????//read?pin?state?to?see?if?dht?responsed.?if?dht?always?high?for?255?+?1?times,?break?this?while?circle
counter++;
delayMicroseconds(1);
if(counter==255)
break;
}
lststate=digitalRead(DHT11PIN);?????????????//read?current?state?and?store?as?last?state.
if(counter==255)????????????????????????????//if?dht?always?high?for?255?+?1?times,?break?this?for?circle
break;
//?top?3?transistions?are?ignored,?maybe?aim?to?wait?for?dht?finish?response?signal
if((i>=4)&&(i%2==0)){
dht11_val[j/8]<<=1;?????????????????????//write?1?bit?to?0?by?moving?left?(auto?add?0)
if(counter>16)??????????????????????????//long?mean?1
dht11_val[j/8]|=1;??????????????????//write?1?bit?to?1
j++;
}
}
//?verify?checksum?and?print?the?verified?data
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]);
return?1;
}
else
return?0;
}
int?main(void){
int?attempts=ATTEMPTS;
if(wiringPiSetup()==-1)
exit(1);
while(attempts){????????????????????????//you?have?5?times?to?retry
int?success?=?dht11_read_val();?????//get?result?including?printing?out
if?(success)?{??????????????????????//if?get?result,?quit?program;?if?not,?retry?5?times?then?quit
break;
}
attempts--;
delay(2500);
}
return?0;
} 上述程序保存為.c文件后編譯成可執(zhí)行文件,運行后會在屏幕打印溫度和濕度。
程序中的數(shù)據(jù)接收處理部分細節(jié)如下:
if((i>=4)&&(i%2==0)){?????????//前3次分別是:1低電平,2高電平(即響應(yīng)信號),3低電平(即數(shù)據(jù)第一個低電平)
//i%2==0?是因為每次都是循環(huán)讀取低電平和高電平,每次要循環(huán)2次才讀出一個bit處理
dht11_val[j/8]<<=1;???????//讀到后,j/8可以限制一個數(shù)的8個位,左移1位自動補0,相當于讀出0
if(counter>16)????????????//counter計數(shù)如果超過16,則高電平長,應(yīng)讀1.
dht11_val[j/8]|=1;????//故再將上面數(shù)與1位或,使最后一位變成1
j++;??????????????????????//j++8個換成下一個數(shù)據(jù)
}
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個數(shù)相加,和1與。
//目的是防止讀出數(shù)據(jù)都為0,和為0,0和1與后得0,所以if判斷條件不成立,返回讀取失敗碼。
//如果讀出數(shù)據(jù)是不為0的正常數(shù)據(jù),和1與后還得原數(shù)。
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的树莓派dht11 python_树莓派使用DHT11温湿度传感器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: win7连接sftp_SFTP远程连接服
- 下一篇: vivo X Fold官宣冲击吉尼斯世界