Перейти к содержимому

Dimmer with ESP8266/ESP32 MQTT – Publish and Subscribe with Arduino IDE. Connecting to Home Assistant, Node-RED, Amazon AWS, and openHAB

28 марта 2025 г. от
Dimmer with ESP8266/ESP32 MQTT – Publish and Subscribe with Arduino IDE. Connecting to Home Assistant, Node-RED, Amazon AWS, and openHAB
Administrator
| Комментариев пока нет

В этом проекте показано, как использовать протокол связи 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-брокера.


  1. #include <RBDdimmer.h>
  2. #define outputPin 4
  3. #define zerocross 5
  4. dimmerLamp dimmer(outputPin, zerocross); //инициализация порта для диммера для плат ESP8266, ESP32, Arduino Due
  5. #include <WiFi.h> // Для ESP8266 #include <ESP8266WiFi.h>
  6. #include <PubSubClient.h>
  7. // Учётные данные WiFi-сети
  8. const char *ssid = "REPLACE_WITH_YOUR_SSID"; // имя вашей WiFi-сети
  9. const char *password = "REPLACE_WITH_YOUR_PASSWORD"; // пароль WiFi-сети
  10. // Учётные данные MQTT-сервера.
  11. // const char *HA_USER = "_____";
  12. // const char *HA_PASS = "_____";
  13. IPAddress broker(XXX,XXX,XXX,XXX); // IP-адрес вашего MQTT-брокера, например
  14. const char *ID = "Example_Dimmer"; // Имя нашего устройства, должно быть уникальным!!!
  15. char *STATE_TOPIC = "dimmer/power/state"; // Топик для публикации состояния освещения
  16. char msg[50];
  17. WiFiClient wclient;
  18. PubSubClient client(wclient); // Настройка MQTT-клиента
  19. // Обработка входящих сообщений от брокера
  20. void callback(char* topic, byte* payload, unsigned int length) {
  21. String response;
  22. int power_L;
  23. for (int i = 0; i < length; i++) {
  24. response += (char)payload[i];
  25. }
  26. Serial.print("Message arrived [");
  27. Serial.print(topic);
  28. Serial.print("] ");
  29. Serial.println(response);
  30. power_L=response.toInt();
  31. dimmer.setPower(power_L);
  32. delay(50);
  33. snprintf (msg, 50, "%ld", dimmer.getPower());
  34. client.publish(STATE_TOPIC, msg);
  35. Serial.print("State ");
  36. Serial.println(msg);
  37. }
  38. // Подключение к WiFi-сети
  39. void setup_wifi() {
  40. Serial.print("\nConnecting to ");
  41. Serial.println(ssid);
  42. WiFi.mode(WIFI_STA);
  43. WiFi.begin(ssid, password);
  44. while (WiFi.status() != WL_CONNECTED) { // Ожидание подключения
  45. delay(500);
  46. Serial.print(".");
  47. }
  48. Serial.println();
  49. Serial.println("WiFi connected");
  50. Serial.print("IP address: ");
  51. Serial.println(WiFi.localIP());
  52. }
  53. // Переподключение к клиенту
  54. void reconnect() {
  55. // Цикл до успешного переподключения
  56. while (!client.connected()) {
  57. Serial.print("Attempting MQTT connection...");
  58. // Попытка подключения
  59. if(client.connect(ID,HA_USER,HA_PASS)) {
  60. client.subscribe(TOPIC);
  61. Serial.println("connected");
  62. Serial.print("Subcribed to: ");
  63. Serial.println(TOPIC);
  64. Serial.println('\n');
  65. } else {
  66. Serial.println(" try again in 5 seconds");
  67. // Повторная попытка через 5 секунд
  68. delay(5000);
  69. }
  70. }
  71. }
  72. void setup() {
  73. dimmer.begin(NORMAL_MODE, OND); //Инициализация диммера
  74. Serial.begin(115200); // Запуск последовательной связи на скорости 115200 бод
  75. delay(100);
  76. setup_wifi(); // Подключение к сети
  77. client.setServer(broker, 1883);
  78. client.setCallback(callback);// Инициализация процедуры обратного вызова
  79. }
  80. void loop() {
  81. if (!client.connected()) // Переподключение при потере связи
  82. {
  83. reconnect();
  84. }
  85. client.loop();
  86. }

MQTT-брокер публикует значение диммера (0~100) в топик dimmer/power/state. ESP32 подписан на эти топики. Таким образом, ESP32 получает значение диммирования (0~100).

Для использования диммера на 2–4 или более каналов необходимо добавить топики и изменить функцию callback для чтения топиков:

  1. char *STATE_TOPIC1 = "dimmer/power1/state";
  2. char *STATE_TOPIC2 = "dimmer/power2/state";
  3. char *STATE_TOPIC3 = "dimmer/power3/state";
  4. char *STATE_TOPIC4 = "dimmer/power4/state";
Поделиться этой записью
Войти оставить комментарий