Потенциометр из третьего занятия был моделью датчика — сигнал менялся только руками. Сегодня подключаем настоящий обучающий датчик среды DHT22: он реально измеряет температуру и влажность воздуха. Впервые используем готовую библиотеку — код, который написал кто-то другой, а мы просто им пользуемся.

После урока сможешь: подключить библиотеку через #include, создать объект датчика, считать температуру и влажность методами dht.readTemperature()/dht.readHumidity(), проверить сбой чтения через isnan(). В конце — станция с настоящим датчиком среды.
#include — подключаем библиотеку
В Wokwi открой вкладку библиотек (значок книги слева) и добавь «DHT sensor library» (Adafruit). На схеме добавь компонент DHT22, подключи его к пину 4, VCC и GND. В самом верху файла sketch.ino пишем #include — это подключает готовый код библиотеки, написанный кем-то другим. Похоже на import math в Python: там ты тоже пользовался чужим готовым кодом, не написанным тобой.

#include <DHT.h>
#define PIN_DHT 4
#define TIP_DHT DHT22
DHT dht(PIN_DHT, TIP_DHT);
void setup() {
Serial.begin(9600);
dht.begin();
}
DHT dht(PIN_DHT, TIP_DHT);создаёт объект датчика с именемdht— как ты заводил переменную, только это не число и не текст, а «умная штука», которая умеет измерять.dht.begin()в setup() запускает датчик один раз, перед началом работы.
Читаем показания: методы объекта dht
У объекта dht есть готовые методы — команды через точку, как slovo.upper() у строки в Python-курсе. dht.readTemperature() возвращает температуру в градусах Цельсия, dht.readHumidity() — влажность в процентах. Оба возвращают дробное число (float).
void loop() {
float temperatura = dht.readTemperature();
float vlazhnost = dht.readHumidity();
Serial.print("Температура: ");
Serial.println(temperatura);
Serial.print("Влажность: ");
Serial.println(vlazhnost);
delay(2000);
}
Температура: 24.00
Влажность: 45.00
Иерархия: библиотека -> объект -> методы
#include <DHT.h> (подключили библиотеку целиком)
|
v
DHT dht(4, DHT22); (создали объект dht на пине 4)
|
v
dht.readTemperature() -> число (температура)
dht.readHumidity() -> число (влажность)
Точка перед именем метода — как slovo.upper() у строк в Python
Проверка сбоя: isnan()
Настоящий датчик иногда не успевает измерить и возвращает специальное «не число» — NaN (Not a Number). Если использовать такое значение в пороговой логике не проверив, программа поведёт себя непредсказуемо. Команда isnan(значение) возвращает true, если чтение провалилось — тогда лучше пропустить этот проход и попробовать снова на следующем.
float temperatura = dht.readTemperature();
if (isnan(temperatura)) {
Serial.println("Ошибка чтения датчика");
} else {
Serial.println(temperatura);
}
Миссия: станция с настоящим датчиком
Подключи DHT22 к пину 4. Считывай температуру и влажность КАЖДЫЕ 2000 миллисекунд через millis() (не delay!) — датчику DHT22 физически нужно не меньше 2 секунд между измерениями. Перед выводом проверяй isnan().
#include <DHT.h>
#define PIN_DHT 4
DHT dht(PIN_DHT, DHT22);
unsigned long previousMillis = 0;
const long interval = 2000;
void setup() {
Serial.begin(9600);
dht.begin();
}
void loop() {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
float temperatura = dht.readTemperature();
float vlazhnost = dht.readHumidity();
if (isnan(temperatura) || isnan(vlazhnost)) {
Serial.println("Ошибка чтения датчика");
} else {
Serial.print("Температура: ");
Serial.println(temperatura);
Serial.print("Влажность: ");
Serial.println(vlazhnost);
}
}
}
Проверь себя
Контрольный вопрос. Что делает строка #include в начале файла?
Подсказка: Сравнение из блока «#include — подключаем библиотеку»: это похоже на import в Python.
Проверить ответ →
Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →
Контрольный вопрос. Что делает строка DHT dht(4, DHT22);?
Подсказка: Это объявление объекта — как переменная, только «умная», с готовыми методами.
Проверить ответ →
Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →
Контрольный вопрос. Что возвращает dht.readTemperature()?
Подсказка: Название метода прямо называет, что он измеряет — Temperature.
Проверить ответ →
Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →
Контрольный вопрос. Где должна стоять команда dht.begin()?
Подсказка: Запуск датчика — это настройка перед началом работы, как pinMode.
Проверить ответ →
Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →
Контрольный вопрос. dht.readHumidity() вернул ровно 45. Что выведет Serial.println(vlazhnost)? Впиши вывод точно, как он появится (Serial.println у float всегда показывает две цифры после точки).
Исходный код для этого задания:
float vlazhnost = dht.readHumidity(); // вернул 45 Serial.println(vlazhnost);Подсказка: Обрати внимание на пример вывода в блоке «Читаем показания» — там температура 24 напечаталась как 24.00.
Проверить ответ →
Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →
Контрольный вопрос. Для чего нужна проверка isnan(temperatura) перед использованием значения в пороговой логике?
Подсказка: Обратись к блоку «Проверка сбоя: isnan()».
Проверить ответ →
Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →
Контрольный вопрос. Чтение провалилось, dht.readTemperature() вернул NaN. Что выведется?
Исходный код для этого задания:
float temperatura = dht.readTemperature(); if (isnan(temperatura)) { Serial.println("Ошибка чтения датчика"); } else { Serial.println(temperatura); }Подсказка: isnan(temperatura) вернёт true при провальном чтении — какая ветка сработает?
Проверить ответ →
Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →
Задание. Напиши код сам. Допиши команду вместо ___, которая считывает влажность с датчика dht в переменную vlazhnost.
Исходный код для этого задания:
float vlazhnost = dht.___();Подсказка: Название метода прямо называет, что он измеряет — Humidity.
✅ Готово, если: программа запускается без ошибок и выводит то, что просят в задании.
Проверить ответ →
Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →
Задание. Напиши код сам (if/else, 5 строк). В переменной temperatura — результат dht.readTemperature(). Если isnan(temperatura) истинно — выведи «Датчик молчит», иначе выведи само значение temperatura.
Исходный код для этого задания:
float temperatura = dht.readTemperature(); // напиши if/else по описанию вышеПодсказка: Шаблон: if (isnan(переменная)) { Serial.println(«…»); } else { Serial.println(переменная); }
✅ Готово, если: программа запускается без ошибок и выводит то, что просят в задании.
Проверить ответ →
Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →
Контрольный вопрос. Программа компилируется, но dht.readTemperature() всегда возвращает NaN, даже в исправном симуляторе. В setup() пропущена одна строка. Какая?
Исходный код для этого задания:
DHT dht(4, DHT22); void setup() { Serial.begin(9600); // не хватает одной строки }Подсказка: Датчик нужно запустить перед первым чтением — эта команда разбиралась в блоке про #include.
Онлайн-проверка ответа появится позже
Контрольный вопрос. Почему для DHT22 показания читают раз в 2000 миллисекунд через millis(), а не на каждом проходе loop() без ограничения?
Подсказка: Вспомни занятие про millis() — там речь шла об отзывчивости программы. Здесь ограничение идёт со стороны самого ДАТЧИКА, а не только программы.
Онлайн-проверка ответа появится позже
Задание. Напиши программу целиком (около 15 строк). Датчик DHT22 на пине 4. Читай температуру и влажность каждые 2000 миллисекунд через millis() (без delay). Перед выводом проверь isnan() для обоих значений сразу (через ||) — если хотя бы одно провалилось, выведи «Ошибка чтения датчика», иначе выведи оба значения по отдельности с подписями.
Исходный код для этого задания:
// напиши #include, DHT dht(...), previousMillis/interval, setup()+loop() по описаниюПодсказка: Собери из трёх уже знакомых частей: объявление dht сверху (как в блоке про #include), неблокирующий интервал (занятие про millis), проверка isnan с || (занятие про пороговую логику).
✅ Готово, если: программа запускается без ошибок и выводит то, что просят в задании.
Онлайн-проверка ответа появится позже
Что дальше
Теперь станция читает настоящий датчик среды через библиотеку. На следующем занятии научимся копить показания в массиве и считать по ним скользящее среднее — как в «Анализе лога датчика» из Python-курса, только на потоковых данных.
Итог: ты подключаешь библиотеку через #include, создаёшь объект датчика и читаешь его методами, проверяешь сбой чтения через isnan(). Дальше — массивы и агрегация серии показаний.
