Некорректное чтение с DHT22 (на плате Nano)
Я подключил два разных датчика DHT22 к плате Arduino Nano. Оба значения температуры более или менее сопоставимы, но они дают очень разные показания влажности.
Датчики:
- Датчик № 1 — это IDUINO- версия DHT22 на PIN-коде 2
- Датчик № 2 — это DHT22 в версии Grove от Seeeds Studio на PIN-коде 3.
Простой код основан на одном из следующих базовых примеров:
#include "DHT.h"
#define DHTPIN_2 2 // Цифровой вывод, подключенный к датчику DHT_1
#define DHTPIN_3 3 // Цифровой вывод, подключенный к датчику DHT_2
#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
#define DHTTYPE_11 DHT11 // DHT 11 (AM2302), AM2321
DHT dht_1(DHTPIN_2, DHTTYPE);
DHT dht_2(DHTPIN_3, DHTTYPE);
void setup() {
Serial.begin(9600); //учитываем скорость в последовательном мониторе!
Serial.println(F("DHT22 test!"));
dht_1.begin();
dht_2.begin();
}
void loop() {
delay(5000);
float h_1 = dht_1.readHumidity();
float t_1 = dht_1.readTemperature();
float h_2 = dht_2.readHumidity();
float t_2 = dht_2.readTemperature();
//Проверяем, не удалось ли какое-либо чтение, и выходим раньше (чтобы повторить попытку).
if (isnan(h_1) || isnan(t_1)) {
Serial.println(F("Failed to read from DHT sensor_1!"));
return;
}
// Проверяем, не удалось ли какое-либо чтение, и выходим раньше (чтобы повторить попытку).
if (isnan(h_2) || isnan(t_2)) {
Serial.println(F("Failed to read from DHT sensor_2!"));
return;
}
Serial.print(F("Humidities: "));
Serial.print('\n');
Serial.print(F("s_1: "));
Serial.print(h_1);
Serial.print(F(" s_2: "));
Serial.print(h_2);
Serial.print('\n');
Serial.print(F("Temperatures: "));
Serial.print('\n');
Serial.print(F("s_1: "));
Serial.print(t_1);
Serial.print(F(" s_2: "));
Serial.print(t_2);
Serial.print('\n');
}
Результат вывода на последовательном мониторе:
Temperatures:
s_1: 25.30 s_2: 23.40
Humidities:
s_1: 6.20 s_2: 66.40
Temperatures:
s_1: 25.20 s_2: 23.40
Humidities:
s_1: 6.00 s_2: 66.10
Temperatures:
s_1: 25.10 s_2: 23.40
.
.
.
Показания влажности от датчика_1 кажутся ошибочными: они составляют лишь 10-ю часть значения датчика_2. Есть ли это исправление? Можно ли перекалибровать датчик_1 или он сломан?
Спасибо!
Изменить: поменять местами датчики (предложено jsotola)
Результаты:
Temperatures:
s_1: 22.60 s_2: 24.70
Humidities:
s_1: 67.80 s_2: 7.30
Похоже, это датчик.
@nick, 👍-1
Обсуждение1 ответ
Разница в показаниях влажности может быть связана с любым количеством причин, включая неисправные детали, неправильное программирование или низкое напряжение (укажите, при каком напряжении вы используете датчики), и это лишь некоторые из них.
Предположим, что один из датчиков сообщает об относительной влажности, а другой – об абсолютной. Абсолютная влажность не учитывает температуру, а относительная. На этом веб-сайте мы получаем следующее уравнение преобразования:
Это уравнение преобразует относительную влажность в абсолютную. Найти давление насыщенного пара, измеряемое в паскалях, непросто. Поэтому мы будем использовать этот веб-сайт для расчета этого значения.
Давайте воспользуемся примером:
- Температура 1: 22,60 C
- Температура 2: 24,70 C
- (предполагаемая) Относительная влажность: 67,80 %
- (предполагаемая) Абсолютная влажность: 7,30
Итак, средняя температура составляет 23,65°С. Используя эту температуру и приведенную выше веб-страницу, давление пара составляет 2923 Па.
AH = (67,80 x 2923) / (462,5 x (273,15 + 23,65) x 100) AH = 0,014437 кг/(метр кубический)
Поскольку абсолютная влажность обычно выражается в граммах на кубический метр:
AH г/(кубический метр) = 0,014437 * 1000 = 14,43 г/(кубический метр)
14,43 — это не 7,30. Рассмотрите свои варианты. Проверьте свою схему, напряжение и программное обеспечение (изменение времени между выборками приводит к разным значениям). Также рассмотрите возможность проведения большего количества тестов в лучших условиях (поместив оба датчика в один и тот же герметичный контейнер на длительный период времени, чтобы снизить воздействие различных условий).
Добавлено позже...
Очевидно, проблемы с датчиком влажности DHT11 – это известная проблема:
- Форум Arduino.cc
- Форум Partical.io
- Форум Raspberry Pi
- Ещё из формы Arduino.cc
Огромное спасибо @st2000 за этот подробный ответ и хорошие советы о том, как действовать! Что я проверил: Напряжение на USB-порте Nano составляет 5,06 В при токе 0,023 А (без разницы, подключен ли один или оба датчика). Пробовал USB хаб с дополнительным питанием, эффекта нет. Я установил задержку (10000), что увеличило время вдвое, но не дало никакого эффекта. Всю установку я положил в пластиковый контейнер. После 30 минут уравновешивания показания влажности сохраняют эту разницу. Однако теперь разница в температуре составляет 0,1° :) . Вы явно исключили, что датчик сообщает AH вместо RH., @nick
В характеристиках этого датчика по ссылке выше указано, что он сообщает об относительной влажности. Это оставляет программирование. Не уверен, смогу ли я зайти в DHT.h. Я так понимаю, проблема все еще в датчике. Возвращаясь к моему первоначальному вопросу: можно ли переделать калибровку на этом?, @nick
Я хотел проверить напряжение, подаваемое на датчики DHT22. Некоторые Arduino работают от напряжения 3,3 В, а другие — от 5 В. Где-то я читал, что DHT22 работает лучше при более высоком напряжении. Я вижу, что на веб-странице Alexnd указано 5 В, а на веб-странице Grove указано от 3,3 до 5 В. РЖУ НЕ МОГУ. Также у вас может быть неисправен датчик. У вас есть другой, на который можно поменяться? Наконец, мне тоже не повезло с датчиками DHT22, и я переключился на датчики [Sillicon Lab Si7021](https://www.sparkfun.com/products/13763)., @st2000
Ой! Что-то, что вы могли бы попробовать. Вы не предоставили схему. Но если судить по Интернету, около 33% опубликованных проектов DHT22 размещают повышающий резистор 10 кОм на выводе данных DHT22. Это связано с тем, что большинство последовательных интерфейсов, подобных этому, используют выход с открытым коллектором, поэтому несколько устройств могут использовать один цифровой провод. А как насчет остальных 77%? Что ж, драйвер должен активировать подтягивающий резистор внутреннего процессора. Но эти резисторы очень широко распространены. Итак, попробуйте добавить подтягивающий резистор номиналом 10 кОм к цифровому выводу проблемного DHT22… просто чтобы посмотреть, что произойдет., @st2000
Я добавил несколько ссылок на обсуждения на форуме датчика влажности DHT22. В некоторых из них есть и другие хорошие предложения, если вы хотите пройти дистанцию. Но я бы проверил напряжение на датчиках, мог бы попробовать подтянуть (но я думаю, что вероятность того, что это сработает, очень мал), наконец, я бы переключился на некоторые из рекомендованных датчиков и купил их у хорошо зарекомендовавшей себя компании, у которой есть сообщество пользователей, которым вы можете задавать вопросы., @st2000
Спасибо @st2000 за дополнительный вклад. Что касается дополнительного резистора 10 кОм: версия DHT22 для IDUINO поставляется с небольшой коммутационной платой, которая, как я полагаю, позаботится об этом. Как на схеме [здесь с сайта makerguides.com](https://www.makerguides.com/wp-content/uploads/2019/08/DHT22-3-pin-with-Arduino-UNO-wiring-diagram-schematic- 1024x580.jpg), такой не нужен. На выходных я попробую подать на этот датчик другое напряжение и проверю предложенные вами ссылки. Все же я думаю, что он просто сломан., @nick
- MAX30100 не работает
- Использование библиотеки емкостных датчиков с мультиплексором 74HC4067
- Проблема с сигналом датчика пульса
- Считывание значений с емкостного сенсорного датчика TTP229 на arduino
- Подключение двух Arduino через I2C, когда контакты I2C A4/A5 уже используются.
- Два датчика расхода, один ESP32, ЖК-дисплей и/или Arduino
- Arduino nano 33 ble vs ble sense. Потребляемая мощность и т.д.
- Как добавить калибровку контроллера влажности с помощью датчика UNO и DHT22?
поменять местами два датчика, @jsotola
Спасибо, @jsotola, я это сделал и опубликовал результаты., @nick
другое, что нужно сделать, это подключить только один датчик за раз, @jsotola
Один датчик за раз дает те же результаты, что и выше (в зависимости от того, какой датчик подключен). IDUINO-DHT22 по-прежнему имеет очень низкое значение возвращаемой влажности., @nick