MQTT — Умный дом в облаке
Научитесь отправлять данные с ESP32 в облако через протокол MQTT и управлять устройствами удалённо из любой точки мира.
Подготовка оборудования
ESP32 DevKit
Любая версия с WiFi (30/38 пинов)
WiFi роутер
2.4 ГГц с доступом в интернет
Компьютер
С Arduino IDE и MQTT Explorer
USB кабель
Для загрузки кода и питания
Как работает 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 Выбор MQTT-брокера
MQTT-брокер — это сервер, который принимает и пересылает сообщения. Выбор брокера влияет на адрес сервера, порт и наличие шифрования. Вот самые популярные бесплатные брокеры:
HiveMQ
Рекомендуемый
broker.hivemq.com 1883 (TCP) / 8883 (TLS) Стабильный, быстрый, с TLS. Подходит для учебных проектов.
Mosquitto
Классический
test.mosquitto.org 1883 / 8883 (TLS) Популярный тестовый брокер от Eclipse. Иногда бывает недоступен.
EMQX
Производительный
broker.emqx.io 1883 / 8883 (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);
Схема подключения
ESP32 Подключите плату к компьютеру через USB
WiFi Убедитесь, что роутер работает на 2.4 ГГц
GPIO 2 Встроенный LED (индикация подключения)
Интернет Брокер MQTT доступен через сеть (порт 1883)
⚠️ Важно о безопасности
Публичные брокеры отправляют данные открытым текстом (без шифрования на порту 1883). Не отправляйте пароли и личную информацию. Для реальных проектов используйте TLS (порт 8883) или разворачивайте свой брокер.
Программирование
Установка библиотек
Откройте Sketch → Include Library → Manage Libraries
Установите PubSubClient от Nick OLeary
Библиотека WiFi.h уже встроена в ESP32 core
Код в Arduino IDE
Монитор порта
MQTT Explorer
Подключение
Укажите адрес брокера broker.hivemq.com и порт 1883 (или 8883 для TLS).
Публикация
Отправьте сообщение ON или OFF в топик home/light/cmd.
Подписка
Подпишитесь на home/temp и наблюдайте за данными от ESP32 в реальном времени.
Возможные проблемы
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.
Цех Испытаний
Отточите мастерство работы с IoT и облачными протоколами. Каждая задача — шаг к созданию умного дома.
Телеметрия
Отправка данных с ESP32 в облако
Каждые 3 секунды ESP32 отправляет случайное число (0–100) в топик home/random, а вы видите значения в MQTT Explorer.
Только USB-подключение. WiFi — встроен в ESP32.
- 1 Установите библиотеку PubSubClient через Manage Libraries.
- 2 В setup() подключитесь к WiFi: WiFi.begin(ssid, password); дождитесь подключения через while.
- 3 Настройте MQTT-клиент: client.setServer(mqtt_server, 1883); и подключитесь: client.connect("ESP32_001");
- 4 В loop() сгенерируйте случайное число: int val = random(0, 101);
- 5 Опубликуйте число: client.publish("home/random", String(val).c_str()); и добавьте delay(3000);
Как проверить
В MQTT Explorer откройте подключение к broker.hivemq.com, подпишитесь на топик home/random — каждые 3 секунды появляются новые числа.
Удалённый выключатель
Управление LED через MQTT с телефона или компьютера
Отправляйте ON или OFF из MQTT Explorer, а встроенный LED на ESP32 (GPIO 2) загорается или гаснет.
Встроенный LED на GPIO 2. Никаких внешних компонентов не нужно.
- 1 Настройте pinMode(2, OUTPUT) в setup() для встроенного LED.
- 2 Создайте функцию callback(char* topic, byte* payload, unsigned int length) — она вызывается при получении сообщения.
- 3 В callback() преобразуйте payload в String: String msg = ""; for (int i=0; i<length; i++) msg += (char)payload[i];
- 4 Если msg == "ON" — digitalWrite(2, HIGH); если "OFF" — digitalWrite(2, LOW);
- 5 В setup() после подключения подпишитесь: client.subscribe("home/light/cmd"); и задайте callback: client.setCallback(callback);
Как проверить
Откройте MQTT Explorer, подключитесь к брокеру, опубликуйте ON в топик home/light/cmd — LED загорится. Отправьте OFF — LED погаснет.
MQTT-термостат
Автоматическое управление на основе данных сенсора
ESP32 публикует случайную температуру (20–40°C) каждые 5 секунд и автоматически отправляет команду ON/OFF в топик home/heater/cmd в зависимости от температуры.
Встроенный LED на GPIO 2 (индикация состояния «обогревателя»).
- 1 Начните с кода из задания «Телеметрия» — это основа для отправки температуры.
- 2 В loop() после публикации температуры добавьте условие: if (temp > 30) client.publish("home/heater/cmd", "OFF");
- 3 Добавьте второе условие: else if (temp < 22) client.publish("home/heater/cmd", "ON");
- 4 В loop() после публикации добавьте Serial.printf для вывода температуры и состояния обогревателя в монитор порта.
- 5 Подпишитесь в MQTT Explorer на оба топика: home/temp и home/heater/cmd — наблюдайте автоматическое управление.
Как проверить
В MQTT Explorer видны два потока данных: температура в home/temp и команды ON/OFF в home/heater/cmd. Когда температура > 30°C — отправляется OFF. Когда < 22°C — ON.
MQTT логгер
Отправка структурированных данных в формате JSON
ESP32 каждые 5 секунд отправляет JSON-строку в топик home/telemetry с полями: time (millis), temp (случайная), humidity (случайная), status ("ok"), а в Serial выводит отправленную строку.
Только USB-подключение. Никаких внешних компонентов.
- 1 Начните с базового кода подключения к WiFi и MQTT-брокеру из урока.
- 2 В loop() сгенерируйте данные: unsigned long t = millis(); int temp = random(20, 41); int hum = random(40, 81);
- 3 Соберите JSON-строку с помощью String-конкатенации: String json = строка с полями time, temp, humidity, status. Отправьте через client.publish.
- 4 Опубликуйте: client.publish("home/telemetry", json.c_str()); и выведите в Serial текущую строку для проверки.
- 5 Подпишитесь в MQTT Explorer на home/telemetry — убедитесь, что JSON валидный (проверьте через jsonlint.com).
Как проверить
MQTT Explorer показывает JSON-объекты в топике home/telemetry каждые 5 секунд. Формат: {"time":12345,"temp":25,"humidity":60,"status":"ok"}. Строка валидна и парсится JSON-парсерами.
Умный дом
Комплексная IoT-система с автоматикой
ESP32 публикует температуру и влажность каждые 5 сек, управляет LED по команде из облака, автоматически включает «вентилятор» при T > 30°C, и выводит все события в Serial с millis()-таймштампом.
GPIO 2 — встроенный LED (свет). GPIO 4 — второй LED или просто Serial-вывод для вентилятора.
- 1 Создайте полный проект: WiFi-подключение, MQTT-клиент с callback-функцией, подписка на home/livingroom/light/cmd.
- 2 В callback() обрабатывайте команды ON/OFF для LED: если топик home/livingroom/light/cmd — управляйте GPIO 2.
- 3 В loop() публикуйте температуру в home/sensor/temp и влажность в home/sensor/hum каждые 5 секунд.
- 4 Добавьте автоматику: если температура > 30 — публикуйте ON в home/livingroom/fan/cmd; если < 22 — OFF.
- 5 Выводите все события в Serial с таймштампом millis(), чтобы отслеживать порядок действий.
Как проверить
В MQTT Explorer видны 4 топика с данными. LED的管理 через home/livingroom/light/cmd работает (ON/OFF). Автоматика включает вентилятор при T > 30°C. Serial выводит структурированный лог всех событий.
Свой Проект
Создайте собственную IoT-систему с датчиками, дисплеем и облачным управлением. Ограничений нет!
Поздравляем! 🎉
Вы освоили протокол MQTT и научились отправлять данные в облако! Теперь вы можете создавать умные дома, метеостанции и системы удалённого мониторинга.