Датчик DHT11, обеспечивающий -999 выходов

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

Моя проблема заключается в том, что я получаю периодические показания -999,0 от 3-контактного датчика температуры и влажности DHT11 между фактическими показаниями. Я не могу найти ничего в Интернете, объясняющего это, но, возможно, я недостаточно внимательно искал. Прилагается скриншот, содержащий как код, так и показания последовательного монитора. Опыт работы в области машиностроения, поэтому не разбираетесь в электронике, но не стесняйтесь обращаться к техническим специалистам в своем ответе.

если изображение не загружается, это код;

#include <dht.h>

dht DHT;

#define DHT11_PIN 7

void setup(){
  Serial.begin(9600);
}

void loop()
{
  int chk = DHT.read11(DHT11_PIN);
  constrain (DHT.temperature, -25, 70);
  constrain (DHT.humidity, 0, 90);


  if((DHT.temperature || DHT.humidity) > -25)
  {
  Serial.print("Temperature, Humidity = ");
  Serial.print(DHT.temperature);
  Serial.print(", ");
  Serial.println(DHT.humidity);
  delay(1000);
  }
}

Заранее спасибо за помощь или указание помочь.Скриншот кода и показания последовательного монитора

, 👍0


3 ответа


1

-999 означает, что результат от DHT не получен. Вам нужно их отфильтровать, что вы и пытаетесь сделать, но неправильно.

Ваша строка кода:

if((DHT.temperature || DHT.humidity) > -25) {

не делает то, что вы думаете.

Если вы начнете с самых внутренних квадратных скобок и "уменьшите", вы получите:

Is DHT.temperature or DHT.humidity?

Это не имеет никакого смысла — за исключением C, любое число, отличное от 0, является «истинным», а 0 — «ложным», так что на самом деле это означает:

Is DHT.temperature not 0 or DHT.humidity not 0?

И, конечно же, это будет "верно" в 99,99999 % случаев. Так что снова вставьте это в if:

if (true > -25) {

Верно ли больше -25? Что ж, обратное тому, что я сказал выше, также верно: «истина» равна 1, а «ложь» — 0. Значит, 1 больше, чем -25? Да. Это так.

Вместо этого следует тестировать каждое значение отдельно:

if ((DHT.temperature > -25) && (DHT.humidity > -25)) {

Кроме того, ваши ограничения ничего не делают. constrain() не изменяет (ограничивает) переменную, которую вы ему передаете. Вместо этого он принимает значение этой переменной, ограничивает его и возвращает вам новое ограниченное значение, которое вы можете присвоить новой переменной. Итак, вы должны:

float temperature = constrain (DHT.temperature, -25, 70);     

И тогда вы можете использовать переменную temperature вместо DHT.temperature, и вы можете гарантировать, что она будет между -25 и +70.

,

0

Насколько я помню, вы не должны читать с DHT11 или DHT22 чаще, чем каждые 2 секунды. Если вы подождете, пока не пройдет 2 секунды, прежде чем читать снова, вам следует избегать показаний -999.

В ответе Маженко показано, как проверять и пропускать показания, выходящие за пределы диапазона, но только чтение раз в 2 секунды должно позволить вам полностью их избежать.

Обратите внимание, что вам также следует проверять возвращаемые значения NaN (не числа). Это означает, что произошла ошибка чтения, которая время от времени случается.

,

0

Попробуйте использовать подтягивающий резистор. Подключите резистор 4,7 кОм параллельно 5 В (если ваш источник питания для DHT11 5 В, 4,7 кОм подходит, для другого напряжения вам нужен другой номинал резистора) и контакту данных.

,