
В этом проекте показано, как использовать протокол связи MQTT с ESP32 для публикации сообщений и подписки на топики MQTT-брокера на серверах, таких как Home Assistant, Node RED, Amazon AWS и openHAB. В качестве примера мы будем управлять диммером. Сервер может быть как локальным, так и облачным.
The ESP32 we’ll be programmed using Arduino IDE. The PubSubClient library provides a client for doing simple publish/subscribe messaging with a server that supports MQTT.
Вы можете загрузить следующий код на свой ESP32. Код содержит комментарии в тех местах, где необходимо внести изменения.
Вам нужно отредактировать код, указав свои SSID, пароль и IP-адрес MQTT-брокера.
- #include <RBDdimmer.h>
- #define outputPin 4
- #define zerocross 5
- dimmerLamp dimmer(outputPin, zerocross); //инициализация порта для диммера для плат ESP8266, ESP32, Arduino Due
- #include <WiFi.h> // Для ESP8266 #include <ESP8266WiFi.h>
- #include <PubSubClient.h>
- // Учётные данные WiFi-сети
- const char *ssid = "REPLACE_WITH_YOUR_SSID"; // имя вашей WiFi-сети
- const char *password = "REPLACE_WITH_YOUR_PASSWORD"; // пароль WiFi-сети
- // Учётные данные MQTT-сервера.
- // const char *HA_USER = "_____";
- // const char *HA_PASS = "_____";
- IPAddress broker(XXX,XXX,XXX,XXX); // IP-адрес вашего MQTT-брокера, например
- const char *ID = "Example_Dimmer"; // Имя нашего устройства, должно быть уникальным!!!
- char *STATE_TOPIC = "dimmer/power/state"; // Топик для публикации состояния освещения
- char msg[50];
- WiFiClient wclient;
- PubSubClient client(wclient); // Настройка MQTT-клиента
- // Обработка входящих сообщений от брокера
- void callback(char* topic, byte* payload, unsigned int length) {
- String response;
- int power_L;
- for (int i = 0; i < length; i++) {
- response += (char)payload[i];
- }
- Serial.print("Message arrived [");
- Serial.print(topic);
- Serial.print("] ");
- Serial.println(response);
- power_L=response.toInt();
- dimmer.setPower(power_L);
- delay(50);
- snprintf (msg, 50, "%ld", dimmer.getPower());
- client.publish(STATE_TOPIC, msg);
- Serial.print("State ");
- Serial.println(msg);
- }
- // Подключение к WiFi-сети
- void setup_wifi() {
- Serial.print("\nConnecting to ");
- Serial.println(ssid);
- WiFi.mode(WIFI_STA);
- WiFi.begin(ssid, password);
- while (WiFi.status() != WL_CONNECTED) { // Ожидание подключения
- delay(500);
- Serial.print(".");
- }
- Serial.println();
- Serial.println("WiFi connected");
- Serial.print("IP address: ");
- Serial.println(WiFi.localIP());
- }
- // Переподключение к клиенту
- void reconnect() {
- // Цикл до успешного переподключения
- while (!client.connected()) {
- Serial.print("Attempting MQTT connection...");
- // Попытка подключения
- if(client.connect(ID,HA_USER,HA_PASS)) {
- client.subscribe(TOPIC);
- Serial.println("connected");
- Serial.print("Subcribed to: ");
- Serial.println(TOPIC);
- Serial.println('\n');
- } else {
- Serial.println(" try again in 5 seconds");
- // Повторная попытка через 5 секунд
- delay(5000);
- }
- }
- }
- void setup() {
- dimmer.begin(NORMAL_MODE, OND); //Инициализация диммера
- Serial.begin(115200); // Запуск последовательной связи на скорости 115200 бод
- delay(100);
- setup_wifi(); // Подключение к сети
- client.setServer(broker, 1883);
- client.setCallback(callback);// Инициализация процедуры обратного вызова
- }
- void loop() {
- if (!client.connected()) // Переподключение при потере связи
- {
- reconnect();
- }
- client.loop();
- }
MQTT-брокер публикует значение диммера (0~100) в топик dimmer/power/state. ESP32 подписан на эти топики. Таким образом, ESP32 получает значение диммирования (0~100).
Для использования диммера на 2–4 или более каналов необходимо добавить топики и изменить функцию callback для чтения топиков:
- char *STATE_TOPIC1 = "dimmer/power1/state";
- char *STATE_TOPIC2 = "dimmer/power2/state";
- char *STATE_TOPIC3 = "dimmer/power3/state";
- char *STATE_TOPIC4 = "dimmer/power4/state";