Датчик 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);
}
}
Заранее спасибо за помощь или указание помочь.
@T3MP35T, 👍0
3 ответа
-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.
Насколько я помню, вы не должны читать с DHT11 или DHT22 чаще, чем каждые 2 секунды. Если вы подождете, пока не пройдет 2 секунды, прежде чем читать снова, вам следует избегать показаний -999.
В ответе Маженко показано, как проверять и пропускать показания, выходящие за пределы диапазона, но только чтение раз в 2 секунды должно позволить вам полностью их избежать.
Обратите внимание, что вам также следует проверять возвращаемые значения NaN (не числа). Это означает, что произошла ошибка чтения, которая время от времени случается.
Попробуйте использовать подтягивающий резистор. Подключите резистор 4,7 кОм параллельно 5 В (если ваш источник питания для DHT11 5 В, 4,7 кОм подходит, для другого напряжения вам нужен другой номинал резистора) и контакту данных.
- DS18B20 дает высокие показания. Как заставить его вернуть правильную температуру?
- Проблема с датчиком температуры и влажности DHT11
- Что выбрать между датчиками температуры и влажности: AM230x или DHT22?
- Проблемы с подключением I2C на ESP8266 — 12F, какие контакты использовать?
- DHT11 возвращает неверные значения
- BMP280 возвращает 0
- Как заставить инфракрасный термодатчик MEMS - D6T-44-L06 работать с Arduino?
- Считывание температуры (DS18B20) с помощью ATtiny85