Teun de slimme thermostaat, workshop 4

Hoofdcategorie: Techniek Categorie: Arduino

Artikelindex

WEBTeun aan het werk

Inleiding

In Workshop 4 wordt Teun pas echt slim. We gaan de slimme thermostaat met het WWW laten praten. Nu hebben we een Internet of Things thermostaat.

Deze Workshop is een vervolg op Workshop 3. We maken voor het MQTT deel van deze workshop gebruik van een extra library "MQTTClient". 



Download hieronder de  MQTTClient library. De files hoeven niet te worden un-zipped! Installeren in de Arduino IDE gaat door middel van Sketch > Include library > Add .ZIP library.

In het laatste deel van deze workshop wordt programmacode besproken die gebruik maakt van het MQTT protocol. De code zelf kun je ook hier downloaden.


Wat is MQTT?

MQTT of: MQ Telemetry Transport is in 1999 bedacht door Dr Andy Stanford-Clark van IBM en Arlen Nipper van Arcom (tegenwoordig Eurotech).

MQTT is een lichtgewicht protocol voor berichten tussen apparaten. De werking is heel simpel: je hebt minimaal drie partijen (apparaten/programma’s) nodig: een zender, een ontvanger en daar tussenin een ‘broker’. De broker is een plek waar de zender de informatie aflevert en de ontvanger de informatie ophaalt. En natuurlijk kan een broker meer dan één zender aan en kunnen meerdere ontvangers dezelfde informatie ophalen. En het kan ook zijn dat één ontvanger de informatie van meerdere ontvangers verzamelt/combineert. De zender en ontvanger hoeven niets van elkaar te weten. Het kunnen verschillende hardwareplatformen zijn die met verschillende programmeertalen werken. Beide apparaten hoeven niet van elkaars bestaan te weten, ze hoeven niet in hetzelfde netwerk te zitten, als de ene er even niet is, dan heeft de andere er niet direct last van. Zolang de broker maar in de lucht is.

brokerMQTT principeWe maken voor de workshop gebruik van een gratis open source broker. Nadeel is dat deze niet altijd even snel is, maar voor de workshop functioneert dit prima. De broker waar we gebruik van maken heet mosquitto.

Wil je meer weten over hoe MQTT precies werkt, kijk dan eens op de webpagina van Mosquitto.

In ons geval hebben we 2 clients , de thermostaat en de webpagina.
Voor de thermostaat geldt:
  • De thermostaat publiceert de gemeten temperatuur en het op de thermostaat ingestelde setpoint.
  • De thermostaat is geabonneerd op het setpoint en de waarde van de button op de webpagina. Deze button kan de controle van de webpagina naar de thermostaat terug geven.
Voor de webpagina geldt:
  • De webpagina publiceert het setpoint en de waarde van de button op de webpagina.
  • De webpagina is geabonneerd op op het setpoint en de gemeten temperatuur van de thermostaat. De gemeten temperatuur wordt op de webpagina in een grafiek weergeven.
Verder geldt nog voor het setpoint:
  • Als de thermostaat de controle heeft wordt op zowel de webpagina als de thermostaat het met de potmeter ingestelde setpoint weergegeven.
  • Wanneer de webpagina de controle heeft wordt het op de webpagina ingestelde setpoint op zowel de thermostaat als op de webpagina weergegeven.
MQTTMQTT communicatie
De controle ligt ofwel bij de webpagina ofwel bij de thermostaat. Waar de controle ligt wordt als volgt bepaald:
  • Met een knop op de webpagina kan vanaf het internet de controle weer naar de thermostaat overgedragen worden.
  • Als de webpagina de controle heeft en er wordt aan de potmeter gedraaid dan neemt de thermostaat automatisch de controle over.
  • Als op de webpagina aan de knop gedraaid wordt neemt de webpagina de controle over.
Het klinkt nogal complex allemaal, maar speel er maar eens mee. Dan wordt het vanzelf duidelijker.

WebpageWebpagina

Lokale webpagina op je laptop.

in de map serverCode die je hier kunt downloaden staan een aantal bestanden die we nu nodig hebben. Kijk de bestanden eens rustig door als je tijd hebt, voor de workshop hoef je deze niet helemaal te begrijpen.

Open het bestand index.html door hierop te klikken. Je krijgt nu een scherm vergelijkbaar met de afbeelding hiernaast te zien.

De grafiek is nog leeg omdat de code nog niet op de Arduino geladen is en er dus geen data naar de broker is gestuurd. Met behulp van deze web pagina kunnen we Teun monitoren en bedienen.



Een slimme thermostaat met MQTT


We willen graag een echte slimme thermostaat die we via het internet kunnen bedienen. Nooit meer een koud huis als we thuis komen..

Open het bestand IoT_Workshop_4.fzz in Fritzing.

Onze Teun wordt nu zo aangepast dat de controle zowel vanuit de ruimte waar de thermostaat hangt kan gebeuren als via het internet. Op het display wordt zichtbaar waar of de controle vanuit huis of via het internet gebeurd door middel van een letter, H of W, helemaal achteraan op de 2e regel. De code is nu ineens wel wat ingewikkelder geworden. We gaan de veranderingen in stapjes bespreken. Je moet ook zelf nog een aantal dingen in de code aanpassen.

De NAME aanpassen.

Om met MQTT te kunnen werken hebben we eindelijk het Ethernetshield dat al vanaf het begin op onze Arduino gestoken is nodig. Via het Ethernetshield loopt de verbinding met het Internet. Er bestaan al veel libraries waar we gebruik van kunnen maken om het Ethernetshield te laten functioneren. Je vind deze libraries bij de includes bovenaan in de code.

arduino stickerSticker op ArduinoOok zijn er wat defines bij gekomen. Een van de defines moet je zelf nog aanpassen:
#define NAME "ITOIIOT-00"
NAME wordt gebruikt om ons te registreren bij de broker. De broker moet immers weten van wie hij informatie krijgt en naar wie hij het op moet sturen.
In deze define moet je het getal aanpassen. Elke DIY kit heeft een nummer. Verander de 00 uit de NAME in het nummer. Staat er bijvoorbeeld Arduino 42 op je Arduino, dan wordt je NAME ITOIIOT-42.

Het MAC adres aanpassen.

Om met het Ethernetshield te kunnen werken moet het MAC adres opgegeven worden. Dit is een hexadecimaal getal van 12 digits. Je vindt dit op de witte sticker bovenop het Ethernetshield uit je DIY kit. Ieder shield heeft zijn eigen unieke nummer.

In de code vind je bij constants and variables bij het kopje Ethernet de volgende tekst:

byte mac[] = { 0x90, 0xA2, 0xDA, 0x0D, 0x22, 0xB3};

dit is de code die aangepast moet worden. Staat er op jouw sticker bijvoorbeeld b4-99-ba-e5-17-d1 dan wijzig je de code naar:

byte mac[] = { 0xB4, 0x99, 0xBA, 0xE5, 0x17, 0xD1};

De gebruikersnaam in index.html aanpassen.

Net als de NAME in het bestand IoT_Workshop_4.ino aangepast is moet ook de gebruikersnaam in het bestand index.html aangepast worden.
Je vind de gebruikersnaam ongeveer op regel 15:

var gebruikers_naam = "ITOIIOT-00";

De gebruikersnaam wordt door de webpagina gebruikt om te registreren bij de broker. De broker moet immers weten van wie hij informatie krijgt en naar wie hij het op moet sturen. In deze variabele moet je het getal aanpassen. Elke DIY kit heeft een nummer. Verander de 00 uit de NAME in het nummer. Staat er bijvoorbeeld Arduino 42 op je Arduino, dan wordt je NAME ITOIIOT-42.

De setup en de loop.

In de setup is zijn stukjes code om het Ethernetshield op te zetten toegevoegd. Je vindt er ook wat testcode tussen. MQTT en het Ethernetshield hebben zelf beiden geen aparte setup routine.

De loop is niet heel erg veranderd, elk rondje wordt nu de temperatuur naar de broker gestuurd zodat deze die weer naar de ontvanger, de webpagina dus, kan doorsturen.

Wijzigingen in de bestaande code.

Er is een klein stukje code in de routine printDataToLCD() bijgekomen. Met dit stukje code kan aangegeven worden of de controle in handen van de thermostaat of de webpagina is.

Bij het Heating System is een extra variabele heatingCtrl. In deze variabele geven we aan of de controle via het internet(W) of via de Hardware thuis (H) gebeurd.

In de routine getPotmeterData() is een stukje code bijgekomen waarbij wordt gekeken of er aan de potmeter wordt gedraaid. Is dat het geval dan moet namelijk de controle terug naar de thermostaat.

Ook is er code toegevoegd die bepaald of het setpoint van internet of van de potmeter gebruikt moet worden. Kijk de code eens rustig door en probeer deze te doorgronden.

De nieuwe MQTT code.

Onder het kopje MQTT zijn 4 routines verschenen.

In de routine receivedAll wordt alle informatie waarop de thermostaat geabonneerd is bij de broker opgehaald. Afhankelijk van de waarden van die informatie worden er acties uitgevoerd.

De routine connect verzorgt de verbinding met de broker. De abonnementen met de broker worden vastgelegd zodat de juiste informatie in receivedAll ontvangen wordt.

In de routine sendTemperature wordt de temperatuur die met de NTC gemeten is gepubliceerd zodat deze bijvoorbeeld door de webpagina weer met behulp van een abonnement gelezen kan worden.

In de routine sendSetpoint wordt met behulp van de potmeter ingestelde setpoint gepubliceerd. Zo wordt deze informatie beschikbaar gemaakt voor de webpagina.

Heb je alles nog onder controle? Dan kun je eens kijken of je het zelf ook kunt in workshop 5.