Урок 14 Средний 45 минут

MQTT — Умный дом в облаке

Научитесь отправлять данные с ESP32 в облако через протокол MQTT и управлять устройствами удалённо из любой точки мира.

1

Подготовка оборудования

Компоненты для урока

ESP32 DevKit

Любая версия с WiFi (30/38 пинов)

📶

WiFi роутер

2.4 ГГц с доступом в интернет

💻

Компьютер

С Arduino IDE и MQTT Explorer

🔌

USB кабель

Для загрузки кода и питания

2

Как работает MQTT

Архитектура протокола

Архитектура MQTT

MQTT (Message Queuing Telemetry Transport) — лёгкий протокол обмена сообщениями по принципу издатель-подписчик. В центре системы стоит брокер, который маршрутизирует сообщения между устройствами.

Publish

Отправить сообщение

Subscribe

Подписаться на топик

Топики и QoS

QoS Название Описание
0 At most once Отправка без подтверждения. Быстро, но сообщение может потеряться.
1 At least once Гарантированная доставка, но возможны дубликаты.
2 Exactly once Строго один раз. Медленнее, но надёжнее.

💡 Примеры топиков

home/sensor/temperature home/livingroom/light/cmd home/bedroom/humidity
2.1

Выбор MQTT-брокера

MQTT-брокер — это сервер, который принимает и пересылает сообщения. Выбор брокера влияет на адрес сервера, порт и наличие шифрования. Вот самые популярные бесплатные брокеры:

☁️

HiveMQ

Рекомендуемый

Адрес: broker.hivemq.com
Порт: 1883 (TCP) / 8883 (TLS)
Шифрование: TLS доступен

Стабильный, быстрый, с TLS. Подходит для учебных проектов.

🦟

Mosquitto

Классический

Адрес: test.mosquitto.org
Порт: 1883 / 8883 (TLS)
Шифрование: TLS доступен

Популярный тестовый брокер от Eclipse. Иногда бывает недоступен.

🔄

EMQX

Производительный

Адрес: broker.emqx.io
Порт: 1883 / 8883 (TLS)
Шифрование: TLS доступен

Высокая производительность. Отличный для IoT-проектов.

Как сменить брокер в коде

Достаточно поменять одну строку — адрес сервера. Порт, логин и пароль (если нужны) указываются при подключении:

// HiveMQ (по умолчанию в уроках)

const char* mqtt_server = "broker.hivemq.com";

client.setServer(mqtt_server, 1883);

// Mosquitto

const char* mqtt_server = "test.mosquitto.org";

client.setServer(mqtt_server, 1883);

// EMQX

const char* mqtt_server = "broker.emqx.io";

client.setServer(mqtt_server, 1883);

3

Схема подключения

Схема подключения ESP32 для работы с MQTT
1

ESP32 Подключите плату к компьютеру через USB

2

WiFi Убедитесь, что роутер работает на 2.4 ГГц

3

GPIO 2 Встроенный LED (индикация подключения)

4

Интернет Брокер MQTT доступен через сеть (порт 1883)

⚠️ Важно о безопасности

Публичные брокеры отправляют данные открытым текстом (без шифрования на порту 1883). Не отправляйте пароли и личную информацию. Для реальных проектов используйте TLS (порт 8883) или разворачивайте свой брокер.

4

Программирование

Установка библиотек

📦

Откройте Sketch → Include Library → Manage Libraries

🔍

Установите PubSubClient от Nick OLeary

Библиотека WiFi.h уже встроена в ESP32 core

MQTT_Publisher.ino
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <WiFi.h>
#include <PubSubClient.h>
const char* ssid = "YOUR_WIFI_SSID";
const char* password = "YOUR_WIFI_PASSWORD";
const char* mqtt_server = "broker.hivemq.com";
WiFiClient espClient;
PubSubClient client(espClient);
void setup() {
  Serial.begin(115200);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  client.setServer(mqtt_server, 1883);
  Serial.println("Connected!");
}
void loop() {
  if (!client.connected()) client.connect("ESP32Client");
  int temp = random(20, 35);
  client.publish("home/temp", String(temp).c_str());
  delay(5000);
}

Код в Arduino IDE

Код программы в Arduino IDE

Монитор порта

Данные в мониторе порта
4.1

MQTT Explorer

MQTT Explorer — публикация и подписка
🌐

Подключение

Укажите адрес брокера broker.hivemq.com и порт 1883 (или 8883 для TLS).

📤

Публикация

Отправьте сообщение ON или OFF в топик home/light/cmd.

📥

Подписка

Подпишитесь на home/temp и наблюдайте за данными от ESP32 в реальном времени.

5

Возможные проблемы

WiFi не подключается

Проверьте правильность SSID и пароля (регистр важен!). Убедитесь, что роутер работает на частоте 2.4 ГГц (ESP32 не поддерживает 5 ГГц). Проверьте расстояние до роутера.

Не подключается к MQTT брокеру

Убедитесь, что ESP32 подключена к интернету (проверьте WiFi.status()). Попробуйте другой публичный брокер: test.mosquitto.org или broker.emqx.io. Проверьте, что порт 1883 открыт в вашей сети.

Сообщения не приходят в MQTT Explorer

Проверьте, что топик для публикации и подписки совпадает точно (регистр важен!). Убедитесь, что client.connect() возвращает true перед публикацией. Добавьте client.loop() в loop().

Память заканчивается (Out of memory)

Используйте client.setBufferSize(512) для увеличения буфера. Отправляйте короткие сообщения. Отключайте ненужные Serial выводы. Перезапускайте ESP32 при потере соединения.

Клиент отключается от брокера

Каждый клиент должен иметь уникальный ID. Если два устройства используют одинаковый client ID, брокер будет отключать предыдущее. Используйте уникальные имена: ESP32_001, ESP32_002.

6

Цех Испытаний

Отточите мастерство работы с IoT и облачными протоколами. Каждая задача — шаг к созданию умного дома.

Время прохождения
~120 минут суммарно
📡
Уровень: Start 10m

Телеметрия

Отправка данных с ESP32 в облако

Цель

Каждые 3 секунды ESP32 отправляет случайное число (0–100) в топик home/random, а вы видите значения в MQTT Explorer.

Что собираем
ESP32 DevKit USB кабель WiFi роутер с интернетом
Подключение

Только USB-подключение. WiFi — встроен в ESP32.

Шаги
  1. 1 Установите библиотеку PubSubClient через Manage Libraries.
  2. 2 В setup() подключитесь к WiFi: WiFi.begin(ssid, password); дождитесь подключения через while.
  3. 3 Настройте MQTT-клиент: client.setServer(mqtt_server, 1883); и подключитесь: client.connect("ESP32_001");
  4. 4 В loop() сгенерируйте случайное число: int val = random(0, 101);
  5. 5 Опубликуйте число: client.publish("home/random", String(val).c_str()); и добавьте delay(3000);

Как проверить

В MQTT Explorer откройте подключение к broker.hivemq.com, подпишитесь на топик home/random — каждые 3 секунды появляются новые числа.

01
💡
Уровень: Easy 15m

Удалённый выключатель

Управление LED через MQTT с телефона или компьютера

Цель

Отправляйте ON или OFF из MQTT Explorer, а встроенный LED на ESP32 (GPIO 2) загорается или гаснет.

Что собираем
ESP32 DevKit USB кабель WiFi роутер MQTT Explorer на компьютере
Подключение

Встроенный LED на GPIO 2. Никаких внешних компонентов не нужно.

Шаги
  1. 1 Настройте pinMode(2, OUTPUT) в setup() для встроенного LED.
  2. 2 Создайте функцию callback(char* topic, byte* payload, unsigned int length) — она вызывается при получении сообщения.
  3. 3 В callback() преобразуйте payload в String: String msg = ""; for (int i=0; i<length; i++) msg += (char)payload[i];
  4. 4 Если msg == "ON" — digitalWrite(2, HIGH); если "OFF" — digitalWrite(2, LOW);
  5. 5 В setup() после подключения подпишитесь: client.subscribe("home/light/cmd"); и задайте callback: client.setCallback(callback);

Как проверить

Откройте MQTT Explorer, подключитесь к брокеру, опубликуйте ON в топик home/light/cmd — LED загорится. Отправьте OFF — LED погаснет.

02
🌡️
Уровень: Normal 25m

MQTT-термостат

Автоматическое управление на основе данных сенсора

Цель

ESP32 публикует случайную температуру (20–40°C) каждые 5 секунд и автоматически отправляет команду ON/OFF в топик home/heater/cmd в зависимости от температуры.

Что собираем
ESP32 DevKit USB кабель WiFi роутер MQTT Explorer
Подключение

Встроенный LED на GPIO 2 (индикация состояния «обогревателя»).

Шаги
  1. 1 Начните с кода из задания «Телеметрия» — это основа для отправки температуры.
  2. 2 В loop() после публикации температуры добавьте условие: if (temp > 30) client.publish("home/heater/cmd", "OFF");
  3. 3 Добавьте второе условие: else if (temp < 22) client.publish("home/heater/cmd", "ON");
  4. 4 В loop() после публикации добавьте Serial.printf для вывода температуры и состояния обогревателя в монитор порта.
  5. 5 Подпишитесь в MQTT Explorer на оба топика: home/temp и home/heater/cmd — наблюдайте автоматическое управление.

Как проверить

В MQTT Explorer видны два потока данных: температура в home/temp и команды ON/OFF в home/heater/cmd. Когда температура > 30°C — отправляется OFF. Когда < 22°C — ON.

03
📊
Уровень: Hard 30m

MQTT логгер

Отправка структурированных данных в формате JSON

Цель

ESP32 каждые 5 секунд отправляет JSON-строку в топик home/telemetry с полями: time (millis), temp (случайная), humidity (случайная), status ("ok"), а в Serial выводит отправленную строку.

Что собираем
ESP32 DevKit USB кабель WiFi роутер MQTT Explorer
Подключение

Только USB-подключение. Никаких внешних компонентов.

Шаги
  1. 1 Начните с базового кода подключения к WiFi и MQTT-брокеру из урока.
  2. 2 В loop() сгенерируйте данные: unsigned long t = millis(); int temp = random(20, 41); int hum = random(40, 81);
  3. 3 Соберите JSON-строку с помощью String-конкатенации: String json = строка с полями time, temp, humidity, status. Отправьте через client.publish.
  4. 4 Опубликуйте: client.publish("home/telemetry", json.c_str()); и выведите в Serial текущую строку для проверки.
  5. 5 Подпишитесь в MQTT Explorer на home/telemetry — убедитесь, что JSON валидный (проверьте через jsonlint.com).

Как проверить

MQTT Explorer показывает JSON-объекты в топике home/telemetry каждые 5 секунд. Формат: {"time":12345,"temp":25,"humidity":60,"status":"ok"}. Строка валидна и парсится JSON-парсерами.

04
🏠
Уровень: Expert 45m

Умный дом

Комплексная IoT-система с автоматикой

Цель

ESP32 публикует температуру и влажность каждые 5 сек, управляет LED по команде из облака, автоматически включает «вентилятор» при T > 30°C, и выводит все события в Serial с millis()-таймштампом.

Что собираем
ESP32 DevKit USB кабель WiFi роутер MQTT Explorer
Подключение

GPIO 2 — встроенный LED (свет). GPIO 4 — второй LED или просто Serial-вывод для вентилятора.

Шаги
  1. 1 Создайте полный проект: WiFi-подключение, MQTT-клиент с callback-функцией, подписка на home/livingroom/light/cmd.
  2. 2 В callback() обрабатывайте команды ON/OFF для LED: если топик home/livingroom/light/cmd — управляйте GPIO 2.
  3. 3 В loop() публикуйте температуру в home/sensor/temp и влажность в home/sensor/hum каждые 5 секунд.
  4. 4 Добавьте автоматику: если температура > 30 — публикуйте ON в home/livingroom/fan/cmd; если < 22 — OFF.
  5. 5 Выводите все события в Serial с таймштампом millis(), чтобы отслеживать порядок действий.

Как проверить

В MQTT Explorer видны 4 топика с данными. LED的管理 через home/livingroom/light/cmd работает (ON/OFF). Автоматика включает вентилятор при T > 30°C. Serial выводит структурированный лог всех событий.

05
🚀

Свой Проект

Создайте собственную IoT-систему с датчиками, дисплеем и облачным управлением. Ограничений нет!

Открыть Симулятор →

Поздравляем! 🎉

Вы освоили протокол MQTT и научились отправлять данные в облако! Теперь вы можете создавать умные дома, метеостанции и системы удалённого мониторинга.