#117Средний

Температура и влажность с DHT22 на ESP32 (с LCD-дисплеем)

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

4.8(38)
56 собрано
Температура и влажность с DHT22 на ESP32 (с LCD-дисплеем)
Интересно, насколько тепло или влажно в твоей комнате? Этот маленький измеритель для тебя. Датчик DHT22 измеряет воздух, а ESP32 каждые две секунды выводит температуру и влажность с точностью до десятой на LCD-экран. Если датчик не удаётся прочитать, экран сообщает и об этом; это основа проектов вроде уголка растений или домашней метеостанции.

Видео

Схема

Температура и влажность с DHT22 на ESP32 (с LCD-дисплеем) - Circuit

Исходный код

C++ (Arduino IDE)
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 или на свой сервер и смотреть графики на телефоне.