我有一个来自WiringPi的DHT11传感器库,我需要修改条件,检查从传感器读取的值是否良好。
有时库读取的错误值为255.255,255.255或55,255.255等。
图书馆有条件:
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;
}
答案 0 :(得分: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的值似乎是无限循环的结果,它通过在counter = 255处提前中断来检测。所以我非常确定检查“最后三位数”是一个比已经实现的更精确的检查。