Nadat ik in de paar vorige delen PC-programma’s heb geschreven, werd het nu weer eens tijd om firmware te ontwikkelen. We willen uiteindelijk niet eeuwig vast blijven zitten aan die logge, stroom vretende computer, als we MQTT-berichten (bijvoorbeeld met meetwaarden) willen uitwisselen.

Want dat kan het al in eerdere afleveringen gebruikte Pretzel-Board ook helemaal „standalone“. Dat beschikt zelfs over een ATmega328, die bijvoorbeeld met de Arduino-ontwikkelomgeving via USB en bootloader kan worden geprogrammeerd. In de vorige aflevering lieten we de ATmega de commando’s voor het aansturen van de WLAN-chip ESP 8266 ontvangen van de PC en doorsturen naar de ESP ; de antwoorden van de WLAN-chip gaf hij dan via USB weer terug aan de PC, waar ze in mijn PC-programma in een tekstvenster werden weergegeven.

Voor mijn eerste stappen heb ik dit PC-programma en ook de zojuist beschreven standaard-firmware opnieuw gebruikt. Stap voor stap heb ik daarna het werk van het PC-programma overgebracht naar de ATmega328. Voor eenvoudige terugmeldingen heb ik het Pretzel-board op een breadboard geprikt en een druktoets, waarmee ik acties kon starten, en een LED voor de weergave aangesloten; de Pretzel-kaart bleef natuurlijk voorlopig via USB verbonden met de computer.

Eerste stap: Bijna alles ging nog, net als in het vorige deel, met buttons in het PC-programma: het resetten van de ESP 8266, het inloggen in mijn WLAN-netwerk, het maken van een TCP /IP-verbinding met de test-MQTT-server op het Internet en het via die verbinding verzenden van het MQTT-CONNECT-commando. Alleen het verzenden van het MQTT-PUBLISH-bericht op het ook in het vorige deel gebruikte topic „/ElektorMyJourneyIoT/TestTopic/test“ en van een kleine payload „txt“ wilde ik rechtstreeks door de ATmega laten doen, op het moment dat ik op de druktoets drukte. De daarvoor benodigd bytes schreef ik eerst hard gecodeerd in mijn Arduino-sketch, waarbij ik als basis gewoon de standaard-firmware P01_SoftwareSerial gebruikte. Ik breidde die uit met het opvragen van de toestand van de drukknop op het breadboard. Hoera, dat werkte: als alles door het PC-programma was voorbereid, en ik op de druktoets drukte, publiceerde het Pretzel-board standalone het bericht. Dat was met een andere MQTT-client (bijvoorbeeld met mijn PC-programma uit deel 5) te controleren.

Tweede stap: Ik verplaatste de functies
TCPClient_Send(...)
MQTTClient_Send(...)
van het PC-programma naar de Arduino-sketch. Het was niet zo moeilijk, omdat C# en Arduino-C++ allebei C-dialecten zijn. C-puristen zullen mijn Arduino-code wel afkeuren, maar ik heb een goede smoes, want zo kon ik de beide programma’s mooi vergelijkbaar houden (de sketch en de PC-code uit het vorige deel zijn onderaan deze pagina te downloaden).
Nu kon de ATmega de benodigde bytes voor het MQTT-PUBLISH-commando zelf samenstellen.

Derde stap: ik bracht ook de overige functies van mijn kleine TCP /IP- en MQTT-library over naar de Arduino. Vanuit de PC verzorgde ik nog wel het resetten van de ESP 8266 en het verbinden met mijn WLAN. Na het indrukken van de drukknop op het experimenteerbord zou het Pretzel-board nu zelfstandig een TCP /IP-verbinding met de testserver moeten maken en daarna een MQTT-CONNECT-aanvraag doen en het MQTT-PUBLISH-bericht versturen. Natuurlijk zou dat ook meerdere keren na elkaar moeten werken. Maar dan moest het Pretzel-board wel weten, of er al een TCP /IP- en een MQTT-verbinding waren. Want de testserver breekt de verbinding af, als we twee keer achter elkaar een MQTT-connect-aanvraag doen. Natuurlijk had ik de antwoorden en foutmeldingen van de ESP 8266 en van de testserver kunnen evalueren, maar dat bewaar ik voor een latere aflevering. Voorlopig liet ik de ESP 8266 gewoon de TCT /IP-verbinding afbreken, voordat ik een nieuwe aanvraag deed. Dan was er zeker geen MQTT-verbinding meer met de testserver, en kon ik de MQTT-CONNECT-aanvraag en daarna het eigenlijke PUBLISH-bericht gewoon versturen, telkens met een kleine wachttijd ertussen natuurlijk. Misschien niet de meest elegante methode maar het verzenden van berichten functioneerde nu ook betrouwbaar als ik het verschillende keren na elkaar deed.

Vierde stap: nu zat ik alleen nog met het resetten en het inloggen in het WLAN-netwerk, dat vanuit de PC over de USB -verbinding moest gebeuren. Ik schreef tenslotte ook de hiervoor benodigde AT-commando’s rechtstreeks in de Arduino-sketch, om precies te zijn in de setup-routine. Bij het verbinden van het Pretzel-board met de USB , dus met de voeding, logde het Pretzel-board nu automatisch in in het WLAN-netwerk. Daarna liet ik de LED oplichten.

Het werkte: Om te controleren of ook telkens nieuwe MQTT-berichten werden verstuurd na het indrukken van de knop, liet ik gewoon een kleine teller van 0..9 omhoog tellen en stuurde ik de tellerstand mee. U kunt mijn sketch onderaan deze pagina downloaden en die op uw Pretzel-board zetten. Vergeet niet om eerst de gegevens van uw WLAN-netwerk (SSID en wachtwoord) in de code in te vullen.

Na het aansluiten van de voedingsspanning (het gaat ook zoals in de afbeelding met een 9V-batterij) zou het Pretzel-board nu in uw netwerk moeten inloggen. Elke keer dat de toets wordt ingedrukt, gaat er een bericht „button0“, „button1“ enz. via de HiveMQ-testserver naar het bovengenoemde topic.

Nu zijn we al een belangrijke stap verder, maar er is toch nog veel te doen! Meer in de volgende delen!