仅检查传感器输出的最后3位数

时间:2017-07-05 04:56:22

标签: c

我有一个来自WiringPi的DHT11传感器库,我需要修改条件,检查从传感器读取的值是否良好。

有时库读取的错误值为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 个答案:

答案 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处提前中断来检测。所以我非常确定检查“最后三位数”是一个比已经实现的更精确的检查。