Датчик температуры и влажности (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. Теперь, когда устройство «чувствует», пора научить его измерять расстояние.