Библиотеки и реальный датчик DHT22

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

Датчик DHT22 на макетной плате, подписаны контакты, рядом окно с показаниями температуры и влажности

После урока сможешь: подключить библиотеку через #include, создать объект датчика, считать температуру и влажность методами dht.readTemperature()/dht.readHumidity(), проверить сбой чтения через isnan(). В конце — станция с настоящим датчиком среды.

#include — подключаем библиотеку

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

Library Manager в Wokwi с найденной DHT sensor library и подключённый датчик DHT22 к пину 4
#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 в начале файла?

АСчитывает температуру с датчика
БПодключает готовый код библиотеки для работы с датчиком
ВСоздаёт объект датчика на пине 4

Подсказка: Сравнение из блока «#include — подключаем библиотеку»: это похоже на import в Python.

Проверить ответ →

Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →

Контрольный вопрос. Что делает строка DHT dht(4, DHT22);?

АСоздаёт объект датчика dht на пине 4 типа DHT22
БСчитывает показание температуры и сохраняет его в dht
ВПодключает библиотеку DHT к проекту

Подсказка: Это объявление объекта — как переменная, только «умная», с готовыми методами.

Проверить ответ →

Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →

Контрольный вопрос. Что возвращает dht.readTemperature()?

Аtrue или false — исправен ли датчик
БТемпературу в градусах Цельсия дробным числом
ВВлажность воздуха в процентах

Подсказка: Название метода прямо называет, что он измеряет — Temperature.

Проверить ответ →

Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →

Контрольный вопрос. Где должна стоять команда dht.begin()?

АВ loop(), на каждом проходе
БВнутри if (isnan(…))
ВВ setup(), один раз перед началом работы

Подсказка: Запуск датчика — это настройка перед началом работы, как pinMode.

Проверить ответ →

Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →

Контрольный вопрос. dht.readHumidity() вернул ровно 45. Что выведет Serial.println(vlazhnost)? Впиши вывод точно, как он появится (Serial.println у float всегда показывает две цифры после точки).

Исходный код для этого задания:

float vlazhnost = dht.readHumidity(); // вернул 45
Serial.println(vlazhnost);

Подсказка: Обрати внимание на пример вывода в блоке «Читаем показания» — там температура 24 напечаталась как 24.00.

Проверить ответ →

Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →

Контрольный вопрос. Для чего нужна проверка isnan(temperatura) перед использованием значения в пороговой логике?

Аisnan нужен только для влажности, для температуры не нужен
БЭто обязательное требование компилятора C++ для типа float
ВДатчик иногда не успевает измерить и возвращает «не число» — без проверки логика поведёт себя непредсказуемо

Подсказка: Обратись к блоку «Проверка сбоя: isnan()».

Проверить ответ →

Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →

Контрольный вопрос. Чтение провалилось, dht.readTemperature() вернул NaN. Что выведется?

Исходный код для этого задания:

float temperatura = dht.readTemperature();
if (isnan(temperatura)) {
  Serial.println("Ошибка чтения датчика");
} else {
  Serial.println(temperatura);
}
АОшибка чтения датчика
Б24.00
Впустая строка

Подсказка: 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);
  // не хватает одной строки
}
АSerial.println(dht);
БpinMode(4, INPUT);
Вdht.begin();

Подсказка: Датчик нужно запустить перед первым чтением — эта команда разбиралась в блоке про #include.

Онлайн-проверка ответа появится позже

Контрольный вопрос. Почему для DHT22 показания читают раз в 2000 миллисекунд через millis(), а не на каждом проходе loop() без ограничения?

Аdelay(2000) работал бы точно так же, разницы с millis() тут нет
БУ DHT22 есть физическое ограничение — датчику нужно не меньше 2 секунд между измерениями, слишком частые запросы дадут сбои чтения
ВЭто стиль оформления кода, на работу датчика не влияет

Подсказка: Вспомни занятие про millis() — там речь шла об отзывчивости программы. Здесь ограничение идёт со стороны самого ДАТЧИКА, а не только программы.

Онлайн-проверка ответа появится позже

Задание. Напиши программу целиком (около 15 строк). Датчик DHT22 на пине 4. Читай температуру и влажность каждые 2000 миллисекунд через millis() (без delay). Перед выводом проверь isnan() для обоих значений сразу (через ||) — если хотя бы одно провалилось, выведи «Ошибка чтения датчика», иначе выведи оба значения по отдельности с подписями.

Исходный код для этого задания:

// напиши #include, DHT dht(...), previousMillis/interval, setup()+loop() по описанию

Подсказка: Собери из трёх уже знакомых частей: объявление dht сверху (как в блоке про #include), неблокирующий интервал (занятие про millis), проверка isnan с || (занятие про пороговую логику).

✅ Готово, если: программа запускается без ошибок и выводит то, что просят в задании.

Онлайн-проверка ответа появится позже

Что дальше

Теперь станция читает настоящий датчик среды через библиотеку. На следующем занятии научимся копить показания в массиве и считать по ним скользящее среднее — как в «Анализе лога датчика» из Python-курса, только на потоковых данных.

Итог: ты подключаешь библиотеку через #include, создаёшь объект датчика и читаешь его методами, проверяешь сбой чтения через isnan(). Дальше — массивы и агрегация серии показаний.

Назад  ·  ↑ В начало урока  ·  ⌂ В начало курса  ·  Вперёд →

Школа Виктора Комлева