Nach einigen Folgen, in denen ich PC-Programme geschrieben habe, war es jetzt an der Zeit, einmal wieder Firmware zu entwickeln. Schließlich wollen wir ja nicht ewig auf den klobigen stromfressenden Kasten angewiesen sein, wenn wir MQTT-Nachrichten (zum Beispiel mit Messwerten) absetzen wollen.

Denn das kann das bereits in den letzten Folgen benutzte Pretzel-Board auch ganz „stand-alone“, es ist ja ein ATmega328 verbaut, der zum Beispiel mit der Arduino-Entwicklungsumgebung via USB und Bootloader programmiert werden kann. Wir erinnern uns an die letzte Folge, als der ATmega die Kommandos zum Ansteuern des WLAN-Chips ESP8266 nur vom PC entgegennahm und an den ESP weiterleitete; die Antworten des WLAN-Chips gab er dann über USB an den PC zurück, wo sie in meinem PC-Programm in einem Textfenster dargestellt wurden.

Für meine ersten Schritte habe ich dieses PC-Programm und auch die gerade beschriebene Standard-Firmware weiterbenutzt. Schritt für Schritt habe ich dann die Aufgaben vom PC-Programm auf den ATmega328 übertragen. Für einfache Rückmeldungen habe ich das Pretzel-Board auf ein Steckbrett gesteckt und einen Taster – mit dem ich Aktionen veranlassen konnte – sowie eine LED zur Anzeige angeschlossen; das Pretzel-Board blieb natürlich zuerst einmal über USB mit dem Computer verbunden.

Erster Schritt: Fast alles wurde noch wie in der letzten Folge über Buttons im PC-Programm veranlasst, das Resetten des ESP8266, das Einloggen in mein WLAN-Netzwerk zuhause, das Aufnehmen einer TCP/IP-Verbindung mit dem Test-MQTT-Server im Internet und das Versenden des MQTT-CONNECT-Kommandos über diese Verbindung. Nur das Versenden der MQTT-PUBLISH-Nachricht auf dem auch in der letzten Folge verwendeten Topic „/ElektorMyJourneyIoT/TestTopic/test“ und einer kleinen Payload „txt“ sollte direkt vom ATmega veranlasst werden, wenn ich den Taster betätigte. Ich schrieb die hierfür nötigen Bytes zuerst einmal hardcodiert in meinen Arduino-Sketch; als Grundlage nahm ich einfach die Standard-Firmware P01_SoftwareSerial, die ich um eine Abfrage des Tasters auf dem Steckbrett erweiterte. Hurra, es klappte: Wenn vom PC-Programm alles vorbereitet war, und ich den Taster betätigte, veröffentlichte das Pretzel-Board stand-alone die Nachricht, was man mit einem anderen MQTT-Client (zum Beispiel mit meinem PC-Programm aus Folge 5) überprüfen konnte.

Zweiter Schritt: Ich übertrug die Funktionen
TCPClient_Send(...)
MQTTClient_Send(...)

vom PC-Programm in den Arduino-Sketch. Das war nicht so schwierig, weil es sich bei C# und Arduino-C++ ja in beiden Fällen um C-Dialekte handelte. Sicher werden C-Puristen bei meinem Arduino-Code die Nase rümpfen – aber ich kann mich damit rausreden, dass ich beide Programme schön vergleichbar gehalten habe (sie können den Sketch und den Code des PC-Programms aus der letzten Folge unten downloaden).
Nun konnte der ATmega die nötigen Bytes für das MQTT-PUBLISH-Kommando selbst zusammenstellen.

Dritter Schritt: Ich übertrug auch die übrigen Funktionen meiner kleinen TCP/IP- und meiner kleinen MQTT-Library auf den Arduino. Per PC resettete ich den ESP8266 noch und verband ihn mit meinem WLAN. Nach Betätigen des Tasters auf dem Steckbrett sollte das Pretzel-Board jetzt selbstständig eine TCP/IP-Verbindung zum Testserver aufbauen, dann eine MQTT-CONNECT-Anfrage und dann die MQTT-PUBLISH-Nachricht absetzen. Allerdings sollte das auch mehrmals hintereinander möglich sein – dann musste das Pretzel-Board allerdings wissen, ob schon eine TCP/IP und eine MQTT-Verbindung bestand. Denn der Testserver bricht die Verbindung zum Beispiel ab, wenn man zwei Mal hintereinander eine MQTT-Connect-Anfrage stellt. Natürlich hätte ich hier die Antworten bzw. Fehlermeldungen des ESP8266 sowie des Testservers auswerten können, aber das verschob ich auf eine spätere Folge. Fürs erste ließ ich den ESP8266 einfach die TCT/IP-Verbindung abbrechen, bevor ich sie neu aufbaute. Dann war ganz sicher auch die MQTT-Verbindung zum Testserver beendet, und ich konnte die MQTT-CONNECT-Anfrage rausschicken und danach die eigentliche PUBLISH-Nachricht; alles mit etwas Delay dazwischen. Sicher nicht die feine englische Art, aber das Versenden einer frischen Nachricht funktionierte nun auch mehrfach hintereinander recht zuverlässig.

Vierter Schritt: Nun hatte ich noch das Resetten und das Einloggen ins WLAN-Netzwerk, was ich immer noch per PC über die USB-Verbindung erledigen musste. Ich schrieb schließlich auch die hierfür benötigten AT-Befehle direkt in den Arduino-Sketch, und zwar in die setup-Routine. Beim Verbinden des Pretzel-Boards mit USB, also mit der Stromversorgung, loggte sich das Pretzel-Board nun selbstständig in das WLAN-Netzwerk ein. Danach ließ ich die LED aufleuchten.

Es funktionierte: Zur Kontrolle, dass auch immer neue MQTT-Nachrichten nach Betätigen des Tasters rausgeschickt wurden, ließ ich einfach einen kleinen Zähler von 0..9 hochzählen und schickte die Zahl mit. Sie können meinen Sketch unten herunterladen und auf ihr Pretzel-Board überspielen, vorher müssen Sie allerdings noch die Daten Ihres WLAN-Netzwerks (SSID und Passwort) in den Code schreiben.

Nach Anlegen der Stromversorgung (es geht auch wie im Bild ein 9-V-Block) müsste sich das Pretzel-Board in Ihr Netzwerk einloggen. Nach jedem Tastendruck wird die Nachricht „button0“, „button1“ usw. über den HiveMQ-Testserver auf obengenanntem Topic veröffentlicht.

Jetzt sind wir schon einen wichtigen Schritt weiter, dennoch gibt es noch viel zu tun! Mehr in den nächsten Folgen!