Некорректное чтение с 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

Похоже, это датчик.

, 👍-1

Обсуждение

поменять местами два датчика, @jsotola

Спасибо, @jsotola, я это сделал и опубликовал результаты., @nick

другое, что нужно сделать, это подключить только один датчик за раз, @jsotola

Один датчик за раз дает те же результаты, что и выше (в зависимости от того, какой датчик подключен). IDUINO-DHT22 по-прежнему имеет очень низкое значение возвращаемой влажности., @nick


1 ответ


0

Разница в показаниях влажности может быть связана с любым количеством причин, включая неисправные детали, неправильное программирование или низкое напряжение (укажите, при каком напряжении вы используете датчики), и это лишь некоторые из них.

Предположим, что один из датчиков сообщает об относительной влажности, а другой – об абсолютной. Абсолютная влажность не учитывает температуру, а относительная. На этом веб-сайте мы получаем следующее уравнение преобразования:

относительно уравнения абсолютной влажности

Это уравнение преобразует относительную влажность в абсолютную. Найти давление насыщенного пара, измеряемое в паскалях, непросто. Поэтому мы будем использовать этот веб-сайт для расчета этого значения.

Давайте воспользуемся примером:

  • Температура 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