Розумний дім #3: ESP32 + датчик температури та вологості (DHT22/SHT21)

Контроль температури та вологості — одне з найбільш затребуваних завдань у розумному домі. Саме ці параметри визначають комфорт, а також безпосередньо впливають на здоров’я, збереження продуктів, меблів та електроніки. У цій статті ми розглянемо, як підключити датчики DHT22 або SHT21 до контролера ESP32, зчитувати показання та відображати їх у браузері, а також передавати дані на MQTT брокер для інтеграції з системами автоматизації, такими як Home Assistant.

Список обладнання та компонентів

  • Модуль ESP32 DevKit (з підтримкою Wi-Fi).
  • Датчик температури та вологості DHT22 (AM2302) або цифровий сенсор SHT21 (I2C).
  • Резистор 10 кОм (тільки для DHT22, як підтягувальний).
  • З’єднувальні дроти.
  • Блок живлення для ESP32 (5 В, 1 А).
  • Макетна плата (за бажанням).

Схема підключення та принцип роботи

Підключення залежить від використаного датчика:

DHT22:

  • VCC → 3.3 В ESP32.
  • GND → GND ESP32.
  • DATA → GPIO 4 (наприклад). Між DATA та VCC ставиться підтягувальний резистор 10 кОм.

SHT21:

  • VCC → 3.3 В ESP32.
  • GND → GND ESP32.
  • SDA → GPIO 21.
  • SCL → GPIO 22.

Принцип роботи простий: датчик вимірює температуру та вологість, ESP32 отримує ці дані та відображає їх у веб-інтерфейсі. При підключенні MQTT брокера значення відправляються на сервер або локальну систему автоматизації, що дозволяє будувати графіки, зберігати історію та використовувати показання у сценаріях керування.

Приклад коду для ESP32

Нижче наведено приклад програми на Arduino IDE, що працює з датчиком DHT22. Код можна адаптувати для SHT21, використовуючи бібліотеку Wire.h та спеціалізовані драйвери.


// Підключаємо бібліотеки
#include <WiFi.h>
#include <PubSubClient.h>
#include "DHT.h"

// Параметри Wi-Fi
const char* ssid = "YOUR_SSID";
const char* password = "YOUR_PASSWORD";

// Параметри MQTT
const char* mqtt_server = "192.168.1.100"; // IP брокера
const int mqtt_port = 1883;
const char* mqtt_topic_temp = "home/livingroom/temperature";
const char* mqtt_topic_hum = "home/livingroom/humidity";

WiFiClient espClient;
PubSubClient client(espClient);

// Налаштування DHT22
#define DHTPIN 4
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);

// Веб-сервер
WiFiServer server(80);

void setup() {
  Serial.begin(115200);
  dht.begin();

  // Підключення до Wi-Fi
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("\nWi-Fi підключено!");
  Serial.println(WiFi.localIP());

  // Налаштування MQTT
  client.setServer(mqtt_server, mqtt_port);

  // Запуск веб-сервера
  server.begin();
}

void reconnect() {
  while (!client.connected()) {
    if (client.connect("ESP32Client")) {
      Serial.println("MQTT підключено");
    } else {
      delay(2000);
    }
  }
}

void loop() {
  if (!client.connected()) {
    reconnect();
  }
  client.loop();

  // Зчитування даних з датчика
  float h = dht.readHumidity();
  float t = dht.readTemperature();

  if (isnan(h) || isnan(t)) {
    Serial.println("Помилка зчитування з датчика DHT22");
    return;
  }

  // Публікація в MQTT
  client.publish(mqtt_topic_temp, String(t).c_str());
  client.publish(mqtt_topic_hum, String(h).c_str());

  // Обробка веб-запитів
  WiFiClient clientWeb = server.available();
  if (clientWeb) {
    String request = clientWeb.readStringUntil('\r');
    clientWeb.flush();

    clientWeb.println("HTTP/1.1 200 OK");
    clientWeb.println("Content-type:text/html");
    clientWeb.println();

    clientWeb.println("<!DOCTYPE html><html>");
    clientWeb.println("<head><meta charset='utf-8'><title>Температура та вологість</title></head>");
    clientWeb.println("<body style='font-family:Verdana; text-align:center;'>");
    clientWeb.println("<h1>Показання датчика DHT22</h1>");
    clientWeb.print("<p>Температура: ");
    clientWeb.print(t);
    clientWeb.println(" &deg;C</p>");
    clientWeb.print("<p>Вологість: ");
    clientWeb.print(h);
    clientWeb.println(" %</p>");
    clientWeb.println("</body></html>");
    clientWeb.println();
  }

  delay(5000); // опитування кожні 5 секунд
}

Пояснення коду

Програма виконує кілька завдань одночасно:

  • Підключення до Wi-Fi та запуск веб-сервера для відображення даних у браузері.
  • Зчитування показань температури та вологості з датчика DHT22.
  • Публікація цих значень у MQTT брокер за вказаними топіками.
  • Формування мінімального HTML-інтерфейсу для перегляду даних з будь-якого пристрою в мережі.

Таким чином, ESP32 виступає в ролі мосту між фізичним світом (датчиком) та цифровими сервісами (веб і MQTT).

Застосування та розширення проєкту

  • Інтеграція в Home Assistant для побудови графіків та сценаріїв керування кліматом.
  • Додавання датчиків у різних кімнатах із публікацією в різні MQTT-топіки.
  • Збереження даних на SD-карту або відправка в хмару (наприклад, ThingsBoard, InfluxDB, Grafana).
  • Розширення веб-інтерфейсу з історією значень і керуванням іншими пристроями.
  • Створення автоматичних сценаріїв: при високій вологості вмикати вентиляцію, при низькій — зволожувач.

Висновок

У цій статті ми реалізували один із ключових елементів розумного дому — контроль температури та вологості за допомогою ESP32 і датчиків DHT22 або SHT21. Ми підключили датчик, навчилися зчитувати показання, відображати їх у браузері та передавати на MQTT брокер для подальшої інтеграції. Такий проєкт можна використати як базу для більш складних систем клімат-контролю.

Якщо вам потрібен індивідуальний проєкт на ESP32 — розробка електроніки, схеми, друкованої плати та програмного забезпечення, ми можемо допомогти. Ми створюємо унікальні рішення та виготовляємо плати під завдання клієнтів. Ознайомтеся з прикладами проєктів у нашому портфоліо.

<< Проекти << Усі товари >> Статті, уроки >>

Написати відгук

Примітка: HTML размітка не підтримується! Використовуйте звичайтий текст.
    Погано           Добре
LM317 лінійний регулятор напруги

LM317 лінійний регулятор напруги

Популярна мікросхема - регульований регулятор напругиВихідна напруга 1,25 ... 37 ВВихідний струм до ..

14.47грн.

Arduino Nano I2C двохсторонній зв'язок між контролерами

Arduino Nano I2C двохсторонній зв'язок між контролерами

Продолжаем разбор технологии обмена данными по коммуникации I2CВ попередній статті розглядався ..

Символьний LCD індикатор 16х2 синій

Символьний LCD індикатор 16х2 синій

Символьний двохрядний рідкокристалічний індикатор. 16 символів в одному рядку.Синя підсвіткаЗ'єднува..

83.25грн.

Тестуємо WEB-інструмент програмування Arduino на офіційному сайті

Тестуємо WEB-інструмент програмування Arduino на офіційному сайті

Подивимось ближче на веб-редакторНа офіційному сайті  Arduino в розділі скачування засобів прог..

Електромагнітне реле 12 В

Електромагнітне реле 12 В

Має одну групу перемикаючих контактівСтрум комутації за змінної напруги 250 В - 10 А,за постійної на..

32.69грн.