Датчик температуры и влажности (DHT)

А что если датчик умнее простого резистора и сам присылает готовые цифры? Знакомься с DHT — и с миром библиотек, которые делают сложное простым.

DHT11/DHT22 — цифровые датчики: они сами измеряют температуру и влажность и шлют готовые числа по одному проводу. Тебе не нужен делитель — нужна библиотека.

Сейчас подключим датчик DHT и выведем в монитор порта температуру в градусах и влажность в процентах. Заодно научимся ставить и подключать библиотеки — навык на весь курс.

Схема подключения

   DHT датчик          Arduino
   [+]  ------------- 5V
   [OUT] -----------  пин 2  (данные)
   [-]  ------------- GND

   (между + и OUT иногда ставят резистор 10кОм - "подтяжка")

Всего три используемых ножки: питание, земля и один провод данных. Никакой аналоговой математики — датчик всё считает сам.

Библиотеки: чужой код в одну строку

Чтобы говорить с DHT, нужна библиотека. В Arduino IDE 2: Sketch → Include Library → Manage Libraries, найди «DHT sensor library» от Adafruit, установи (она потянет «Adafruit Unified Sensor»).

#include <DHT.h>

#define DHTPIN 2
#define DHTTYPE DHT11      // или DHT22

DHT dht(DHTPIN, DHTTYPE);

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

void loop() {
  float t = dht.readTemperature();   // градусы Цельсия
  float h = dht.readHumidity();      // проценты

  if (isnan(t) || isnan(h)) {        // не прочиталось
    Serial.println("Ошибка чтения датчика");
  } else {
    Serial.print("t = "); Serial.print(t);
    Serial.print(" C, влажность = "); Serial.print(h);
    Serial.println(" %");
  }
  delay(2000);                       // DHT медленный - не чаще раза в 2 сек
}

Как работает под капотом

Внутри DHT — крошечный микроконтроллер, термистор и датчик влажности. Когда ты вызываешь dht.readTemperature(), библиотека шлёт датчику запрос и принимает серию цифровых импульсов по проводу данных — это собственный протокол DHT. Библиотека расшифровывает импульсы в число. Поэтому датчик «медленный»: один обмен занимает время, и чаще раза в секунду-две его опрашивать нельзя — иначе получишь NaN (не-число).

# Та же логика на Python: проверяем чтение и считаем "ощущается как"
def report(t, h):
    if t is None or h is None:       # аналог isnan() в Arduino
        return "Ошибка чтения датчика"
    comfort = "комфортно"
    if t > 27 and h > 60:
        comfort = "душно"
    elif t < 18:
        comfort = "прохладно"
    return f"t={t}C, влажность={h}%, ощущается: {comfort}"

print(report(24.0, 45.0))
print(report(29.0, 70.0))
print(report(None, None))           # датчик не ответил

Частые ошибки

  • Опрашивают датчик слишком часто — получают NaN. Ставь delay не меньше 2 секунд.
  • Не проверяют isnan. Иногда чтение срывается — всегда проверяй, прежде чем использовать.
  • Перепутали DHT11 и DHT22 в коде. У них разный тип в #define — иначе значения мусорные.

Best practices

  • Всегда оборачивай чтение в проверку isnan — это спасает от случайных сбоев.
  • DHT22 точнее и работает с минусовыми температурами; DHT11 дешевле и грубее. Выбирай под задачу.
  • Используй Library Manager, а не ручное копирование — так библиотека обновляется и не конфликтует.

Откуда берётся NaN и как с ним жить

Слово NaN расшифровывается как «not a number» — «не число». Библиотека возвращает его, когда обмен с датчиком сорвался: помехи на проводе, слишком частый опрос, плохой контакт. Это не поломка, а нормальная ситуация в реальной электронике — иногда данные просто не приходят. Поэтому проверка isnan(t) — не перестраховка, а обязательный элемент: без неё мусорное значение попадёт в логику порогов и устройство поведёт себя странно.

Грамотная реакция на NaN — не падать, а сохранять последнее хорошее значение и спокойно ждать следующего удачного чтения. Например: если новое чтение — NaN, показываем то, что было пару секунд назад, и не трогаем светодиоды. Через 2 секунды датчик почти наверняка ответит нормально. Этот принцип «пропусти сбой, дождись валидных данных» делает устройство устойчивым: оно не дёргается из-за единичной помехи, а ведёт себя плавно, как качественный прибор.

Итоги

DHT — умный цифровой датчик: библиотека общается с ним по протоколу и отдаёт готовые градусы и проценты. Главные правила — не опрашивать чаще раза в 2 секунды и проверять isnan. Теперь, когда устройство «чувствует», пора научить его измерять расстояние.

Проверьте себя
1. Почему датчик DHT нельзя опрашивать чаще, чем раз в ~2 секунды?
AСгорит
BОбмен по его протоколу медленный, иначе вернётся NaN
CКончится память
DПерегреется Arduino
2. Что нужно установить, чтобы Arduino понимала DHT?
AНовый процессор
BБиблиотеку (например, DHT sensor library)
CВнешний резистор 220 Ом
DАналоговый пин