2017-07-05 26 views
-2

我有一個來自WiringPi的用於DHT11傳感器的庫,我需要修改檢查從傳感器讀取的值是否良好的條件。只檢查傳感器輸出的最後3位數

有時候庫讀取錯誤值這是255.255,255.255或55,255.255等

sample output

有一個在庫中的條件:

if(counter==255) 
     break; 

但它不工作,如果該值是例如55,255.255

如何修改此條件,檢查輸出的最後3位數字? 如果輸出錯誤,則值的末尾總是有「255」。 我嘗試添加條件像

if(counter==255) 
     break; 
     else if(counter==255.255) 
     break; 

但它並不能解決所有可能的情況,我真的不知道任何有關C/C++

這裏是全庫:

#include <wiringPi.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <stdint.h> 
#define MAX_TIME 85 
#define DHT11PIN 7 
#define ATTEMPTS 5 
int dht11_val[5]={0,0,0,0,0}; 

int dht11_read_val() 
{ 
    uint8_t lststate=HIGH; 
    uint8_t counter=0; 
    uint8_t j=0,i; 
    for(i=0;i<5;i++) 
    dht11_val[i]=0; 
    pinMode(DHT11PIN,OUTPUT); 
    digitalWrite(DHT11PIN,LOW); 
    delay(18); 
    digitalWrite(DHT11PIN,HIGH); 
    delayMicroseconds(40); 
    pinMode(DHT11PIN,INPUT); 
    for(i=0;i<MAX_TIME;i++) 
    { 
    counter=0; 
    while(digitalRead(DHT11PIN)==lststate){ 
     counter++; 
     delayMicroseconds(1); 
     if(counter==255) 
     break; 
    } 
    lststate=digitalRead(DHT11PIN); 
    if(counter==255) 
     break; 
    // top 3 transistions are ignored 
    if((i>=4)&&(i%2==0)){ 
     dht11_val[j/8]<<=1; 
     if(counter>16) 
     dht11_val[j/8]|=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("%d.%d,%d.%d\n",dht11_val[0],dht11_val[1],dht11_val[2],dht11_val[3]); 
    return 1; 
    } 
    else 
    return 0; 
} 

int main(void) 
{ 
    int attempts=ATTEMPTS; 
    if(wiringPiSetup()==-1) 
    exit(1); 
    while(attempts) 
    { 
    int success = dht11_read_val(); 
    if (success) { 
     break; 
    } 
    attempts--; 
    delay(500); 
    } 
    return 0; 
} 
+1

計數器是uint8,它永遠不會包含「255.255」。 – Yunnosch

+3

我建議你學習C,不要忽略,C++標籤是不必要的。 – eyllanesc

+0

@Yunnosch - 請看看我添加的屏幕 – joeedit

回答

0

代碼中沒有任何單個變量可以容納「255.255」,這需要一個字符串或一個浮點數。您顯然是指
printf("%d.%d,%d.%d\n",dht11_val[0],dht11_val[1],dht11_val[2],dht11_val[3]);的輸出。

這個printf永遠不會產生像55,255.255這樣的三值輸出。 我假設你的輸出是55.255,255.255
這意味着如果出現錯誤,您可以在dht11_val [3]中找到「最後三位數字」。

如果我的假設不正確,請提供更詳細的錯誤情況。

另一方面,我懷疑尋找這個價值並不是解決問題的方法。功能更復雜。 255的值似乎是一個無限循環的結果,這是通過在計數器= 255處早期檢測到的。因此,我非常確定,檢查「最後三位數」是比已經實現的更少的精確檢查。