Først basis koden, her er et generisk basis skjelett for MQTT:
Sitat#include <EspMQTTClient.h>
//MQTTEspMQTTClient MQTTclient("ThePromisedLAN", // SSID"Hallelujah!", // WiFi Password"192.168.1.2", // MQTT Broker server ip"", // MQTTUsername Can be omitted if not needed"", // MQTTPassword Can be omitted if not needed"hjemmeautomasjonClient", // Client name that uniquely identify your device1883 // The MQTT port, default to 1883. this line can be omitted);
// *********************************************************************void setup() {MQTTclient.setKeepAlive(60);}
// *********************************************************************void loop() {MQTTclient.loop();
// Can test for this if you needif (!MQTTclient.isMqttConnected() && MQTTclient.isWifiConnected() ) {// Connected to WiFi only}if (MQTTclient.isMqttConnected() ) {// Connected to MQTT}
if ( 1 == 2 ) { // her legger du testen på når du skal sende MQTT dataMQTTclient.publish("hjemmeautomasjonClient/switch", "1"); // Publish something}}
// ********************** SUBS ***********************************************void onConnectionEstablished(){Serial.println("onConnectionEstablished");MQTTclient.publish("hjemmeautomasjonClient/status", "started"); // You can activate the retain flag by setting the third parameter to true
MQTTclient.subscribe("hjemmeautomasjonClient/LED", [](const String & payload) {Serial.print("Led: ");Serial.println(payload);if (payload.toInt()==0) {// Turn off} else {// Turn on}});}
Så til saken; La oss starte med noe enkelt og tenne onboad LED'en med en MQTT kommando.
Sitat#include <EspMQTTClient.h>
#define ONBOARD_LED 2
//MQTTEspMQTTClient MQTTclient("ThePromisedLAN", // SSID"Hallelujah!", // WiFi Password"192.168.1.2", // MQTT Broker server ip"", // MQTTUsername Can be omitted if not needed"", // MQTTPassword Can be omitted if not needed"hjemmeautomasjonClient", // Client name that uniquely identify your device1883 // The MQTT port, default to 1883. this line can be omitted);
// *********************************************************************void setup() {MQTTclient.setKeepAlive(60);}
// *********************************************************************void loop() {MQTTclient.loop();
}
// ********************** SUBS ***********************************************void onConnectionEstablished(){Serial.println("onConnectionEstablished");MQTTclient.publish("hjemmeautomasjonClient/status", "started"); // You can activate the retain flag by setting the third parameter to true
MQTTclient.subscribe("hjemmeautomasjonClient/LED", [](const String & payload) {Serial.print("Led: ");Serial.println(payload);if (payload.toInt()==0) {digitalWrite(ONBOARD_LED, LOW); // Turn off} else {digitalWrite(ONBOARD_LED, HIGH); // Turn on}});}
Start opp MQTT Brokeren og MQTT Exploreren og overfør dette programmet til ESP32'en
Det første vi ser i MQTT Exploreren resultatet av at denne linjen:
MQTTclient.publish("hjemmeautomasjonClient/status", "started");
er utført og at Staus = started er sendt:
Om vi deretter sender denne meldingen med MQTT Exploreren
Så tenner LED'en og vi ser også meldingen her:
Nå har vi altså en kommuniasjon oppe der vi kan styre ESP32'en fra MQTT.
Neste stepp er å hente data fra Esp32'en.
Vi bruker samme prisippet som i "Komme i gang med ESP32" koden der vi lager en "bryter" mellom GND og GPIO_13:
Sitat#include <EspMQTTClient.h>#define ONBOARD_LED 2 // Onboard LED
// Switches (Buttons)#define switchPin GPIO_NUM_13int lastSwitchState = 20; // undefinedint switchState = 10; // undefinedint readingSwitch ;unsigned long lastDebounceTime = 0; // the last time input pin was toggledunsigned long debounceDelay = 100; // the debounce time; increase if the output flickers
//MQTTEspMQTTClient MQTTclient("ThePromisedLAN", // SSID"Hallelujah!", // WiFi Password"192.168.232.50", // MQTT Broker server ip"", // MQTTUsername Can be omitted if not needed"", // MQTTPassword Can be omitted if not needed"hjemmeautomasjonClient", // Client name that uniquely identify your device1883 // The MQTT port, default to 1883. this line can be omitted);
// *********************************************************************void setup() {Serial.begin(115200);Serial.println("Startup");
// Set pin mode for test LEDpinMode(ONBOARD_LED ,OUTPUT);digitalWrite(ONBOARD_LED ,HIGH);
// MQTTclient.setKeepAlive();MQTTclient.setKeepAlive(60);
// SwitchespinMode(switchPin, INPUT_PULLUP);}
// *********************************************************************void loop() {MQTTclient.loop();// Read SwitchreadingSwitch = digitalRead(switchPin);if (readingSwitch != lastSwitchState ) { // any change?lastDebounceTime = millis(); // reset the debouncing timer}//Check debounceif ((millis() - lastDebounceTime) > debounceDelay) { // has it been there for longer than the debounce// Switch new value?if (readingSwitch != switchState) {if (MQTTclient.isMqttConnected()) {if (readingSwitch==LOW) { // Active LOWMQTTclient.publish("hjemmeautomasjonClient/switch", "Closed");} else {MQTTclient.publish("hjemmeautomasjonClient/switch", "Open");}Serial.println("Publish switch");switchState=readingSwitch;}}}lastSwitchState=readingSwitch;}
// ********************** SUBS ***********************************************void onConnectionEstablished(){Serial.println("onConnectionEstablished");MQTTclient.publish("hjemmeautomasjonClient/status", "started"); // You can activate the retain flag by setting the third parameter to trueSerial.println("onConnectionEstablished");MQTTclient.subscribe("hjemmeautomasjonClient/LED", [](const String & payload) {Serial.print("Led: ");Serial.println(payload);if (payload.toInt()==0) {digitalWrite(ONBOARD_LED, LOW); // Turn off} else {digitalWrite(ONBOARD_LED, HIGH); // Turn on}});}
Mekaniske brytere åpner og lukker seg ikke helt nøyaktig men "spretter" et bittelite øyeblikk. Mikroprosessoren er imidlertid rask nok til å lese dette flere hundre ganger så dersom vi ikke legger på noen kode for fikse det vil vi sende VELDIG MANGE MQTT meldinger.
Koden vi legger på kalles "debounce" kode og fungerer ved å måle tiden på hvor lenge bryteren var vært i den stillingen etter at den sist endret seg. Det kommer en egen mini-guide senere om debounce prinsipper.
Start opp MQTT Brokeren og MQTT Exploreren og overfør dette programmet til ESP32'en
Om du kortslutter mellom GND og GPIO_13 ser du at det går en melding:
Vi har nå et program som både mottar og sender MQTT meldinger 🙂
Og vi kan følge med i Serial Monitor så lenge den er koblet til PCen:
Følg med!
Jeg skal forsøke å legge ut en liten "LEGO kloss" med (u)jevne mellomrom 🙂
Anbefalte kommentarer
Bli med i samtalen
Du kan publisere innhold nå og registrere deg senere. Hvis du har en konto, logg inn nå for å poste med kontoen din.