Блог
ESP32 + MQTT: отправляем данные датчиков в облако за 30 минут
Проблема
Вы собрали метеостанцию на ESP32. Температура и влажность отлично выводятся в последовательный монитор. Но вот в чём беда — эти данные заперты на вашем ноутбуке. С телефона их не посмотреть. В журнал не записать. Автоматизации на них не повесить.
MQTT это решает. Это протокол связи, на котором работает большинство IoT-систем в мире — от умных заводов до инсталляций Home Assistant.
Что вы соберёте
Узел датчиков на ESP32, который:
- Считывает температуру и влажность каждые 30 секунд
- Публикует данные в бесплатный облачный MQTT-брокер
- Позволяет следить за всем из любого браузера, откуда угодно
Сложность: для начинающих | Время: 30 минут | Стоимость: ~$23 за детали
Нужное железо (спецификация)
| Деталь | Модель | Кол-во | Цена | Купить |
|---|---|---|---|---|
| Микроконтроллер | ESP32 DevKitC V4 | 1 | $13.49 | Смотреть товар |
| Датчик температуры/влажности | DHT22 | 1 | $5.24 | Смотреть товар |
| Дисплей (опционально) | 0.96″ OLED SSD1306 | 1 | $5.99 | Смотреть товар |
| Макетная плата | 830 точек | 1 | $4.49 | Смотреть товар |
| Провода-перемычки | M-M, 40 шт. | 1 | $2.99 | Смотреть товар |
Шаг 1: Монтаж
ESP32 ↔ DHT22
| Пин DHT22 | Пин ESP32 | Примечание |
|---|---|---|
| VCC | 3V3 | Питание |
| GND | GND | Земля |
| DATA | GPIO 13 | Линия данных |
ESP32 ↔ OLED (опционально)
| Пин OLED | Пин ESP32 | Примечание |
|---|---|---|
| VCC | 3V3 | Питание |
| GND | GND | Земля |
| SDA | GPIO 21 | Данные I2C |
| SCL | GPIO 22 | Такт I2C |
Шаг 2: Установите библиотеки
Откройте Arduino IDE → Sketch → Include Library → Manage Libraries и установите:
- PubSubClient от Nick O’Leary (обмен по MQTT)
- DHT sensor library от Adafruit (драйвер DHT22)
- Adafruit SSD1306 (дисплей OLED, если используете)
Шаг 3: Загрузите код
#include <WiFi.h>
#include <PubSubClient.h>
#include "DHT.h"
// --- WiFi Settings ---
const char* ssid = "YOUR_WIFI_SSID";
const char* password = "YOUR_WIFI_PASSWORD";
// --- MQTT Settings ---
const char* mqtt_server = "broker.hivemq.com";
const int mqtt_port = 1883;
const char* temp_topic = "sensbench/home/temperature";
const char* hum_topic = "sensbench/home/humidity";
// --- Sensor Settings ---
#define DHTPIN 13
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// --- Globals ---
WiFiClient espClient;
PubSubClient client(espClient);
void setup_wifi() {
delay(10);
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("nWiFi connected! IP: ");
Serial.println(WiFi.localIP());
}
void reconnect() {
while (!client.connected()) {
Serial.print("Connecting to MQTT...");
String clientId = "sensbench-" + String(random(0xffff), HEX);
if (client.connect(clientId.c_str())) {
Serial.println("connected!");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" retrying in 5s");
delay(5000);
}
}
}
void setup() {
Serial.begin(115200);
dht.begin();
setup_wifi();
client.setServer(mqtt_server, mqtt_port);
}
void loop() {
if (!client.connected()) reconnect();
client.loop();
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t)) {
Serial.println("Sensor read failed!");
return;
}
char tempStr[8], humStr[8];
dtostrf(t, 4, 2, tempStr);
dtostrf(h, 4, 2, humStr);
client.publish(temp_topic, tempStr);
client.publish(hum_topic, humStr);
Serial.printf("Temp: %s°C Humidity: %s%%n", tempStr, humStr);
delay(30000);
}
Шаг 4: Смотрите данные в облаке
- Откройте https://www.hivemq.com/mqtt-web-client/ в браузере
- Нажмите Connect
- В разделе Subscriptions добавьте тему:
sensbench/home/# - Смотрите, как ваш ESP32 шлёт данные в реальном времени каждые 30 секунд
Что дальше?
Теперь, когда данные в облаке, можно:
- Собрать дашборд на Node-RED или Home Assistant для визуализации
- Добавить датчики — BME280 для давления, датчик влажности почвы для растений
- Запускать автоматизации — «если температура > 30°C, включи вентилятор»
- Перейти на батарейку — добавьте режим глубокого сна, и устройство проживёт месяцы