In het vorige deel had ik mijn mini-bibliotheek voor het publiceren van MQTT-berichten geport naar het „Pretzel-board“, dat een ATmega328 en een WLAN-chip van het type ESP 8266 aan boord heeft. We hebben gezien dat de ATmega gemakkelijk met de Arduino-IDE is te programmeren. Hij kan de ESP 8266 aansturen met behulp van eenvoudige ASCII-commando’s, bijvoorbeeld voor het inloggen in een WLAN, het verbinden met een TCP -server en het verzenden van tekens naar die server. In de functies van mijn mini-Arduino- TCP -library (TCPClient_connect, TCPClient_close, TCPClient_send) worden de juiste ASCII-commando’s samengesteld en naar de ESP 8266 gestuurd. Ik kon de functies van mijn rudimentaire MQTT-library bijna onveranderd overnemen uit de PC-versie, omdat ze gebruik maken van de TCP -library.

Bij wijze van test had ik een heel eenvoudige applicatie bedacht. Bij het aansluiten van de voedingsspanning logde de ESP 8266 in op mijn WLAN-netwerk, waarna een op de kaart aangesloten LED oplichtte. Na het indrukken van een toets, die ik ook op een experimenteerbord had geplaatst, maakte de ESP 8266 via TCP verbinding met de HiveMQ-Testserver in de cloud. Daarna werd via TCP een MQTT-Connect-commando verstuurd, gevolgd door een MQTT-publish-commando. Als MQTT-bericht gebruikte ik gewoon de tekst „Button“ (plus een cijfer) en als topic „/ElektorMyJourneyIoT/TestTopic/test“. Het resultaat was met een MQTT-client te bekijken.

Toen ik twee weken geleden begon te werken aan deze aflevering, bleek het programma in eerste instantie niet meer te werken. Ik ontdekte al snel dat het IP-adres van de testserver wel eens veranderd zou kunnen zijn. In elk geval werkte alles weer, nadat ik in de Arduino-sketch (en in mijn test-client voor de PC) in plaats van het IP-adres „52.29.193.216“ de URL-string „broker.hivemq.com“ had ingevuld.

Ik had nog helemaal geen aandacht besteed aan de afhandeling van fouten: de LED lichtte ook braaf op, als de SSID en het wachtwoord (hard gecodeerd in de Arduino-sketch) helemaal niet klopten en de kaart dus helemaal niet in mijn WLAN-netwerk kon inloggen. Ik verving de eenkleurige LED door de RGB -LED van de Maker-Kit, zodat ik met rood een fout en met groen een succes kon laten weergeven. In het handboek bij de Pretzel-kaart wordt een praktische functie van de meegeleverde SoftwareSerial-library beschreven, waarmee we de ASCII-terugmeldingen van de ESP 8266 kunnen evalueren. Naast enkele andere tekens zendt die namelijk „ERROR“, als het commando van de ATmega niet correct kon worden uitgevoerd, en „OK“ als het wel gelukt is. Met de regel
 
Boolean success = esp8266.findUntil(“OK“, “ERROR“);
 
geven we de ATmega de opdracht, om net zo lang te wachten, tot er ofwel een „OK“ ofwel een „ERROR“ terugkomt van de ESP 8266 (of tot een instelbare time-out-tijd is verstreken). Een keurige oplossing, die meteen mijn houtje-touwtje-commando’s uit de eerste versie van het programma overbodig maakt.

Dat dacht ik tenminste. Want toen ik die functie in de setup-routine van mijn sketches inbouwde om fouten bij het inloggen in het WLAN-netwerk te detecteren, bleek het toch niet goed te werken. De groene LED lichtte altijd op, wat ik ook invoerde als wachtwoord. Om één of andere reden kwam er na het commando voor het inloggen altijd een „OK“ terug van de ESP 8266. Na lang gepruts ontdekte ik, dat de verwerking de terugmelding van de commando’s, die ik eerder had gegeven misschien nog niet afgesloten was, als ik het nieuwe commando verzond. Een klein delay-commando loste dat probleem op.

Nu kon ik verder op mijn pad naar een autonoom werkende sensorkaart. In de Maker-kit zit ook een fototransistor, die ik aansloot op pen A6 (een A/D-ingang) van het Pretzel-board. De druktoets kreeg een nieuwe functie. Hiermee kunnen we nu wisselen tussen de modi „test“ en „sensor“; de blauwe LED D3 geeft aan, welke modus is gekozen. Na het aansluiten van de voedingsspanning logt de ESP 8266 in op het WLAN. De inloggegevens moeten (voorlopig nog) hard gecodeerd in de sketch worden ingevoerd. Als het inloggen lukt, licht de RGB -LED groen op. Door op de druktoets te drukken kunnen we overschakelen naar de modus „sensor“. De kaart meet dan continu de lichtsterkte, zet het 10-bits getal van de ADC om in een string van hexadecimale tekens en stuurt die onder het bovengenoemde topic via MQTT naar de testserver. Mijn functie
 
void SendValueOverMQTT(int TenBitValue)
 
werkt weer een beetje ruw: De TCP -verbinding wordt eerst gesloten en dan weer geopend. Ook hier heb ik nu een foutafhandeling en -indicatie geïmplementeerd. Als het verbinden met de TCP -server niet lukt, licht de RGB -LED rood op. Als het verbinden wel gelukt is, licht de RGB -LED geel (rood+groen) op en dan worden de MQTT-commando’s verzonden. Daarna wordt de RGB -LED weer groen. Er is nog geen MQTT-foutafhandeling geïmplementeerd, maar we willen ook nog iets bewaren voor toekomstige delen van deze serie! ;-) Daarna begint het spel opnieuw met een nieuwe meetwaarde. Door nogmaals op de toets te drukken, komen we in de testmodus (ingedrukt houden tot LED D3 op de kaart dooft). In deze modus kunnen we de ESP 8266 vanuit een terminalprogramma „met de hand“ aansturen.

De code is zoals altijd te vinden in de download, samen met een aangepaste versie van mijn MQTT-test-client voor de PC voor het ontvangen van de meetwaarden. (Voer in het tekstveld „Topic to subscribe“ de waarde „TestTopic“ in.) Ik heb in de Arduino-sketch voorlopig met opzet nagelaten om alles te modulariseren en te abstraheren, zodat we de code beter kunnen vergelijken met de vorige versie. Maar dat wordt later nog gecorrigeerd en dan kunnen we de kleine referentietoepassing ook gemakkelijk aanpassen aan andere boards.
In het volgende deel gaat we verder!