
Questo progetto mostra come utilizzare il protocollo di comunicazione MQTT con l'ESP32 per pubblicare messaggi e sottoscrivere topic di un broker MQTT su server come Home Assistant, Node RED, Amazon AWS e openHAB. Come esempio, controlleremo il dimmer. Il server può essere locale o nel cloud.
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.
È possibile caricare il seguente codice sul proprio ESP32. Il codice è commentato nei punti in cui è necessario apportare modifiche.
È necessario modificare il codice con il proprio SSID, la password e l'indirizzo IP del broker MQTT.
- #include <RBDdimmer.h>
- #define outputPin 4
- #define zerocross 5
- dimmerLamp dimmer(outputPin, zerocross); //inizializzazione della porta per il dimmer per schede ESP8266, ESP32, Arduino Due
- #include <WiFi.h> // Per ESP8266 #include <ESP8266WiFi.h>
- #include <PubSubClient.h>
- // Credenziali della rete WiFi
- const char *ssid = "REPLACE_WITH_YOUR_SSID"; // nome della rete WiFi
- const char *password = "REPLACE_WITH_YOUR_PASSWORD"; // password della rete WiFi
- // Credenziali del server MQTT.
- // const char *HA_USER = "_____";
- // const char *HA_PASS = "_____";
- IPAddress broker(XXX,XXX,XXX,XXX); // Indirizzo IP del broker MQTT, es.
- const char *ID = "Example_Dimmer"; // Nome del nostro dispositivo, deve essere unico!!!
- char *STATE_TOPIC = "dimmer/power/state"; // Topic per pubblicare lo stato della luce
- char msg[50];
- WiFiClient wclient;
- PubSubClient client(wclient); // Configurazione del client MQTT
- // Gestione dei messaggi in arrivo dal broker
- 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);
- }
- // Connessione alla rete WiFi
- void setup_wifi() {
- Serial.print("\nConnecting to ");
- Serial.println(ssid);
- WiFi.mode(WIFI_STA);
- WiFi.begin(ssid, password);
- while (WiFi.status() != WL_CONNECTED) { // Attesa della connessione
- delay(500);
- Serial.print(".");
- }
- Serial.println();
- Serial.println("WiFi connected");
- Serial.print("IP address: ");
- Serial.println(WiFi.localIP());
- }
- // Riconnessione al client
- void reconnect() {
- // Ciclo fino alla riconnessione
- while (!client.connected()) {
- Serial.print("Attempting MQTT connection...");
- // Tentativo di connessione
- 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");
- // Attendere 5 secondi prima di riprovare
- delay(5000);
- }
- }
- }
- void setup() {
- dimmer.begin(NORMAL_MODE, OND); //Inizializzazione del dimmer
- Serial.begin(115200); // Avvio della comunicazione seriale a 115200 baud
- delay(100);
- setup_wifi(); // Connessione alla rete
- client.setServer(broker, 1883);
- client.setCallback(callback);// Inizializzazione della routine di callback
- }
- void loop() {
- if (!client.connected()) // Riconnessione in caso di perdita della connessione
- {
- reconnect();
- }
- client.loop();
- }
Il broker MQTT pubblica il valore del dimmer (0~100) nel topic dimmer/power/state. L'ESP32 è sottoscritto a questi topic. In questo modo, l'ESP32 riceve il valore di dimmerizzazione (0~100).
Per utilizzare il dimmer con 2–4 o più canali, è necessario aggiungere i topic e modificare la funzione callback per leggere i topic:
- char *STATE_TOPIC1 = "dimmer/power1/state";
- char *STATE_TOPIC2 = "dimmer/power2/state";
- char *STATE_TOPIC3 = "dimmer/power3/state";
- char *STATE_TOPIC4 = "dimmer/power4/state";