Температура и влажность с DHT22 на ESP32 (с LCD-дисплеем)
Этот проект измеряет температуру и влажность воздуха датчиком DHT22 и в реальном времени показывает данные на I2C LCD 16x2. Данные читаются с датчика по однопроводному протоколу через библиотеку Adafruit DHT. Проект служит основой для IoT-метеостанций, умного дома или систем мониторинга среды в теплицах. Связь с DHT22 идёт через пин GPIO 4 у ESP32.

Видео
Схема

Исходный код
1// ─────────────────────────────────────────
2// BlueGrays · bluegrays.com
3// Температура и влажность с DHT22 на ESP32 (с LCD-дисплеем)
4// ─────────────────────────────────────────
5// Каждые 2 с читает температуру и влажность с DHT22 и показывает их на I2C
6// LCD 16x2. Если чтение не удалось, на экране предупреждение о проводке и
7// подтяжке.
8//
9// Пины:
10// GPIO 4 -> DHT22 DATA
11// Подтяжка 10k между DATA и VCC
12// GPIO 21 -> LCD SDA, GPIO 22 -> LCD SCL
13// DHT22 VCC -> 3V3, LCD VCC -> 5V (VIN)
14// Все GND общие
15
16#include <Wire.h>
17#include <LiquidCrystal_I2C.h>
18#include <DHT.h>
19
20// Определения пинов
21const int DHT_PIN = 4;
22#define DHT_TYPE DHT22
23
24DHT dht(DHT_PIN, DHT_TYPE);
25
26// Адрес LCD 0x27 или 0x3F
27LiquidCrystal_I2C lcd(0x27, 16, 2);
28
29// DHT22 нужно не меньше 2 с между чтениями
30const unsigned long READ_INTERVAL = 2000;
31unsigned long lastRead = 0;
32
33void setup() {
34 // Пины I2C DevKit V1 по умолчанию
35 Wire.begin(21, 22);
36 lcd.init();
37 lcd.backlight();
38
39 // Заставка 3 с
40 lcd.setCursor(3, 0);
41 lcd.print("BlueGrays");
42 lcd.setCursor(3, 1);
43 lcd.print("DHT22 v1.0");
44 delay(3000);
45 lcd.clear();
46
47 dht.begin();
48}
49
50void loop() {
51 // Читать каждые 2 с без delay()
52 if (millis() - lastRead >= READ_INTERVAL) {
53 lastRead = millis();
54
55 float h = dht.readHumidity();
56 float t = dht.readTemperature();
57
58 lcd.clear();
59
60 // NaN = проблема с проводкой/подтяжкой
61 if (isnan(h) || isnan(t)) {
62 lcd.setCursor(0, 0);
63 lcd.print("Sensor okunamadi");
64 lcd.setCursor(0, 1);
65 lcd.print("Kablo+10k pullup");
66 } else {
67 // Температура
68 lcd.setCursor(0, 0);
69 lcd.print("Sicaklik:");
70 lcd.print(t, 1);
71 lcd.print("C");
72 // Влажность, DHT22 даёт дробные значения
73 lcd.setCursor(0, 1);
74 lcd.print("Nem :");
75 lcd.print(h, 1);
76 lcd.print("%");
77 }
78 }
79}
80
Частые вопросы
Чем DHT22 отличается от DHT11?
DHT22 точнее (±0,5 °C, ±2–5% влажности), измеряет в более широком диапазоне (от −40 до 80 °C) и даёт разрешение 0,1. DHT11 дешевле, но ограничен точностью ±2 °C и целочисленным разрешением.
Нужен ли подтягивающий резистор 10 kΩ?
Голому датчику DHT22 на линии данных нужен подтягивающий резистор 10 kΩ. В 3-выводных модулях на плате резистор обычно уже есть.
LCD на 5 V, ESP32 на 3,3 V — работают ли они вместе?
Модули I2C LCD дают более чёткую картинку от 5 V. Если подтягивающие резисторы на линиях SDA/SCL модуля с питанием 5 V подключены к 5 V, безопаснее всего использовать преобразователь уровней; многие подключают напрямую, но это доводит ESP32 до предела.
Можно ли отправлять данные через интернет?
Да, через Wi-Fi у ESP32 можно отправлять измерения в ThingSpeak, Blynk или на свой сервер и смотреть графики на телефоне.
