Ошибка контрольной суммы с датчиком температуры DHT11 и arduino - PullRequest
0 голосов
/ 24 апреля 2019

У меня есть датчик DHT11, один на печатной плате с 3 разъемами, подключенный к Arduino. Когда я пытаюсь прочитать значения с этого датчика, я получаю их, но чаще всего я получаю ошибку контрольной суммы. Датчик работает, если я игнорирую эту ошибку, но я хотел бы знать, почему эта ошибка есть.

Это просто для того, чтобы опробовать датчик и изучить Arduino, так что ничего критичного. Я только что получил Arduino, так что я новичок в этом. Я уже запрограммировал целый веб-интерфейс для взаимодействия с адресуемой светодиодной лентой на Raspberry Pi в Python. «

void start_test()
    {
    digitalWrite(DHpin, LOW); //Pull down the bus to send the start signal
  delay(30); //The delay is greater than 18 ms so that DHT 11 can detect the start signal
  digitalWrite(DHpin, HIGH);
  delayMicroseconds(40); //Wait for DHT11 to respond
  pinMode(DHpin, INPUT);
  while(digitalRead(DHpin) == HIGH);
  delayMicroseconds(80); //The DHT11 responds by pulling the bus low for 80us;

  if(digitalRead(DHpin) == LOW)
    delayMicroseconds(80); //DHT11 pulled up after the bus 80us to start sending data;
  for(int i = 0; i < 5; i++) //Receiving temperature and humidity data, check bits are not considered;
    dat[i] = read_data();
  pinMode(DHpin, OUTPUT);
  digitalWrite(DHpin, HIGH); //After the completion of a release of data bus, waiting for the host to start the next signal
}

byte read_data()
{
  byte i = 0;
  byte result = 0;
  for (i = 0; i < 8; i++) {
      while (digitalRead(DHpin) == LOW); // wait 50us
      delayMicroseconds(30); //The duration of the high level is judged to determine whether the data is '0' or '1'
      if (digitalRead(DHpin) == HIGH)
        result |= (1 << (8 - i)); //High in the former, low in the post
    while (digitalRead(DHpin) == HIGH); //Data '1', waiting for the next bit of reception
    }
  return result;
}

void loop()
{
  start_test();

  //Serial.println(total);

  humidone = dat[0];
  humiddec = dat[1];

  tempone = dat[2];
  tempdec = dat[3];

  checksum = dat[0] + dat[1] + dat[2] + dat[3];
  Serial.print(checksum, BIN);
  Serial.println("checksum ");
  Serial.print(dat[4], BIN);
  Serial.println("dat4 ");
  if ((dat[4]) != checksum){
    Serial.println("-- Checksum Error!");
    delay(100);
  }
  else{
    //Serial.println("-- OK");
    temp = tempone + '.' + tempdec;
    humid = humidone + '.' + humiddec;
    Serial.print(humid);
    Serial.print(",");
    Serial.println(temp);
    humidprev = humid;
    tempprev = temp;

    tempint = temp.toInt() * 10;
    ledbright = map(tempint, 250, 290, 0, 255);
    Serial.println(ledbright, DEC);
    analogWrite(ledpin, ledbright);

    Serial.println(' ');
    delay(3000);
  }
}

Выше я поставил код. Это пример, который я получил из интернета, но они ничего не сказали об этой ошибке. Я также пробовал другие примеры, но они не работали вообще или имели ту же ошибку. Проблема заключается в том, что программа контролирует контрольную сумму (dat [0] + dat [1] + dat [3]) для dat [4]. Они должны быть одинаковыми, но часто это не так. dat [4] - это 8-битное двоичное число. Если я регистрирую контрольную сумму и данные [4] в Serial.monitor как binairy, я вижу, что часто это просто 1, которая не изменяется в контрольной сумме, а изменяется в dat [4]. Но я не могу понять, почему это так.

Кто-нибудь знает, почему я получаю эту ошибку контрольной суммы и как я могу ее исправить? Я очень ценю помощь, поскольку я новичок в Arduino и электронике, и я хотел бы учиться.

Заранее спасибо!

...