Bouw je eigen weerstation
Krijgen we een onstuimige herfst of worden we verwend met een zwoele nazomer? Lekker lang op het terras kunnen zitten zou wel leuk zijn, maar misschien moeten we het doen met zo’n natte bedoening die aanhoudt tot de winter. Er is weinig aan te veranderen, maar vanaf nu weet je wél precies waar je aan toe bent, dankzij je eigen, zelfgemaakte weerstation.
De code is na een kleine aanpassing ook geschikt voor onze Vlaamse lezers. Als je bij https://xml.weerslag.nl/xmlfeed.xml zoekt naar het gewenste station, kun je bij **
Boodschappenlijstje
- Behuizing (€ 2,-, bijvoorbeeld een pillendoosje van Kruidvat) Bijvoorbeeld bij www.rotor.eu:
- Passieve piëzo-buzzer (€ 2,-) Bijvoorbeeld bij www.martoparts.nl:
- NodeMCU-module (€ 9,95)
- Oled-beeldscherm (€ 6,95) Bijvoorbeeld bij www.conrad.nl:
- Diffuse leds, 6 stuks (€ 0,60)
- Trekontlasting M10 (€ 1,-)
- Experimenteerprintplaatje 80 × 50 mm (€ 2,50)
- Schroefterminal of klemschroefblok 2-polig (€ 0,21)
- Draad 0,20 mm², 2 meter (€ 0,60)
- Usb-oplader 5 V, 1,5 A (€ 5,50)
- Usb-kabel (€ 1,63) Gereedschap: soldeerbout en soldeertin, zijkniptang, stanleymes, vijl. Totale kosten: ca. € 33,-
Het weerstation werkt niet met eigen sensoren en meetinstrumenten, maar haalt elke vijf minuten de nieuwste gegevens op van het dichtstbij gelegen KNMI-meetstation en van Buienradar. Het toont de actuele weersituatie op een oled-schermpje en waarschuwt als het gaat regenen of vriezen. Ook bij een voor jouw regio uitgegeven weeralarm krijg je een melding. Gekleurde leds geven de weersituatie aan: bij groen is er niets aan de hand, blauw is regen, wit is vorst en bij een weeralarm brandt geel, oranje of rood.
Hardware
De schakeling is gebouwd rond een NodeMCU, een ontwikkelbordje dat is gebaseerd op een ESP-wifi-module. De overige onderdelen zijn een oled-beeldschermpje, zes leds, drie weerstanden en een piëzo-luidspreker. Het beeldscherm en de luidspreker kunnen rechtstreeks op de module worden aangesloten, voor de leds zijn voorschakelweerstanden nodig. Normaal gesproken krijgt elke led zijn eigen weerstand, maar omdat er van groen, geel, oranje en rood altijd slechts één led tegelijk brandt (ter indicatie van een weeralarm) volstaat voor die vier leds één weerstand. Blauw en wit kunnen op ieder moment branden, dus die krijgen wel elk een eigen weerstand.
Het beeldscherm communiceert met de ESP-module door middel van een zogenoemde i2c-bus. Het voordeel daarvan is dat er slechts twee verbindingen nodig zijn voor de communicatie en twee voor de voeding, dus vier in totaal. Mede daardoor is de schakeling voor zijn veelzijdigheid erg eenvoudig van opzet.
©PXimport
©PXimport
©PXimport
©PXimport
©PXimport
De bonte verzameling componenten.
Ontwikkelomgeving
De ESP-module is het gemakkelijkst te programmeren met de Arduino-ontwikkelomgeving IDE. Deze kun je op Arduino.cc downloaden. Omdat Arduino IDE niet primair voor deze module is bedoeld, zul je nog wat extra benodigde onderdelen moeten installeren. Klik daarvoor op Bestand / Voorkeuren en vul op het tabblad Instellingen bij Additionele Board Beheer URLs deze url in: http://arduino.esp8266.com/stable/package_esp8266com_index.json Voeg de module daarna toe via Hulpmiddelen / Board / NodeMCU 1.0 (ESP-12E Module). Sluit de module aan via een usb-kabel en selecteer in Arduino IDE de juiste poort (Hulpmiddelen / Poort, kies de com-poort met het hoogste nummer). Als alles goed is gegaan, is je opstelling nu klaar om met programmeren te beginnen. Mocht de module onverhoopt niet door je pc of Mac worden herkend, dan kun je Hubbit vinden waarmee het zeker moet lukken.
©PXimport
Werking
We leggen even uit hoe een en ander gaat werken als je alles eenmaal af hebt. Zodra de schakeling wordt aangezet, probeert de NodeMCU verbinding te maken met je wifi-netwerk. Als dat gelukt is, wordt achtereenvolgens informatie opgehaald over de hoeveelheid regen, het weerrapport en een eventueel weeralarm. De oorspronkelijke webpagina’s van de te raadplegen webpagina’s passen niet in het beperkte geheugen van de module. Door via een tussenstap (een serverscript dat draait bij ons moederbedrijf Reshift) alleen de gegevens van het voor jou relevante weerstation te tonen, is dat probleem opgelost.
Het compacte beeldscherm toont de windrichting, de windkracht, de temperatuur en een pictogram van de weersituatie. Standaard brandt de groene led. Als er regen aankomt, gaat de blauwe led aan, bij vorst brandt de witte led en bij een weeralarm brandt geel, oranje of rood. Twee piepjes geven in dit soort situaties aan dat er wat aan de hand is.
Oled-bibliotheek
Om pictogrammen en lettertypen op het beeldschermpje te kunnen tonen, is een extra bibliotheek nodig. Klik in Arduino IDE op Schets / Bibliotheek gebruiken / Bibliotheken beheren. Typ U8g2 bij Filter je zoekresultaten en klik onder het item U8g2 by oliver op Installeren. Herstart daarna Arduino IDE. Je kunt nu in je code de nieuwe bibliotheek gebruiken met de regel #include
©PXimport
Uitleg bij de code
De code kun je hier downloaden. We leggen hier eerst uit hoe de code werkt, voordat we er daadwerkelijk mee aan de slag gaan (vanaf paragraaf ‘Code uploaden en testen’). Je kunt de code wel alvast bekijken met Kladblok of Notepad++.
Het programma begint met het laden van vier bibliotheken via de opdracht include: ESP8266WiFi.h voor alle netwerkactiviteit, Wire.h voor de communicatie met het beeldscherm en U8g2.h voor het tonen van grafische informatie op het scherm (zie kader ‘Oled-bibliotheek’). Dankzij deze kant-en-klare code van derden kunnen we ons direct richten op de functionele aspecten van de schakeling. De vierde bibliotheek (weathericons.h) bevat de weerpictogrammen en is onderdeel van ons programma.
Het programma begint met het declareren van diverse variabelen en een lange lijst constanten. Daarvan hoef je er maar vijf aan te passen aan jouw situatie, zie kader ‘Constanten’. Via de constanten voor de luidspreker en de leds kun je deze onderdelen in de code aanroepen met hun omschrijving in plaats van een lastig te onthouden pinnummer. Met de constante Wachttijd stel je in hoe vaak de weerinformatie wordt opgehaald, standaard eens per vijf minuten. Periode bepaalt hoever er vooruitgekeken wordt of het regent. Standaard staat hier 1, wat staat voor vijf tot tien minuten vooruit. Hoewel het handig lijkt om hier een langere periode te kiezen, blijkt de nauwkeurigheid van de voorspelling dan sterk af te nemen.
De strings aan het einde van het lijstje constanten zijn de codes waarmee het KNMI op zijn website een weeralarm aangeeft. Hierin herken je in de waarden red, orange, yellow en green de mogelijke omstandigheden.
Onder Setup worden de pinnen als uitgang gedefinieerd en met het wifi-station verbonden. Tevens wordt het domein van de host voor de regenvoorspelling opgehaald en toegekend aan de variabele raindomain, die verderop in de code wordt omgezet in rainhost. Alle leds en de luidspreker gaan ten slotte beurtelings kort aan om er zeker van te zijn dat ze werken.
©PXimport
Constanten
Om het programma te kunnen gebruiken, zul je enkele constanten moeten aanpassen. Laat de dubbele aanhalingstekens staan, wijzig alleen wat daarbinnen staat! De naam van je wifi-netwerk: const char* ssid = "SSID" Het bijbehorende wifi-wachtwoord: const char* password = "PASSWORD" Het pad naar het serverscript met de gewenste coördinaten als parameters: const String rainurl = "URL" De code van het meetstation waar je het dichtstbij woont: const String weerstation = "CODE" Het pad naar het serverscript met jouw provincie of regio als parameters: const String alarmurl = "URL" Je gps-coördinaten vind je eenvoudig door met je browser naar Google Maps te gaan en in te zoomen op je straat. In de adresbalk staan de coördinaten achter het @-teken. Gebruik alleen het aantal graden en de eerste twee decimalen, in het voorbeeld dus 52.36 en 4.85 (zie afbeelding). Zie de commentaren met uitleg in de code om te zien hoe je de lijsten met meetstations en mogelijke regio’s te zien krijgt.
©PXimport
Piepsignaal
Zoals eerder opgemerkt komt bij bepaalde situaties geluid uit de piëzo-luidspreker, zoals bij verwachte regen, als de temperatuur onder nul komt of bij een weeralarm. Om te voorkomen dat bijvoorbeeld bij buien elke tien minuten de pieper afgaat, is het aantal keer dat dit alarm klinkt beperkt. De duur is vastgelegd door een constante interval van het type unsigned long en staat standaard op een uur.
Zolang er nog niets heeft geklonken, gaat de pieper bij de eerste aanleiding. Vanaf dat moment geldt als voorwaarde dat er ten minste 3.600.000 milliseconden (een uur dus) verstreken moeten zijn voordat er weer wat mag piepen. De code maakt gebruik van een ingebouwde timer, die 49 dagen lang het aantal milliseconden telt vanaf het moment dat de module wordt aangezet. Daarna begint de teller weer bij nul, maar daar houdt de code rekening mee. De leds hebben met deze beperking uiteraard niets te maken en reageren direct op veranderingen.
Weersituatie in het scherm
De gegevens zijn afgeleid uit de xml-feed van Buienradar.nl. Dat houdt in dat de weergegevens binnen xml-tags staan, waar je deze uit moet halen. De functie lees_tot_tag verwerkt de feed. Deze wordt in de functie checkweer verderop in de code aangeroepen met als parameters de begin- en eindstrings van de gezochte weerinformatie. Bij de temperatuur-tag wordt bovendien nog een waarde 1 toegekend aan vorst, daarover straks meer. In checkweer staan de letterlijke tags waarbinnen de informatie staat.
De feed wordt ingelezen vanaf het gewenste weerstation en als dan de gezochte begintag is gevonden, knippen we die regel in stukken. Als regel bijvoorbeeld <temperatuurGC>16.5</temperatuurGC> is, halen we met substring de tekst 16.5 eruit. Die voegen we toe aan de string weersituatie, die verder wordt verwerkt door de functie checkweer. Daarbinnen gebeurt de echte magie, zoals het omzetten van de weersituatie naar het juiste pictogram en de windrichting naar de windpijl.
De functie eindigt met het aanroepen van displayweather met vier parameters: de windrichting, de temperatuur, de windkracht en het weersymbool. Aan windkracht en temperatuur voegen we respectievelijk Bft en °C toe, waarna de waarden naar het scherm worden geschreven.
Vorst- en weeralarm
Tot slot laat de functie lees_tot_tag de blauwe led branden als het vriest, door te kijken of er een minteken voorkomt in de regel temperatuur. De test op de aanwezigheid daarvan vindt alleen plaats als checkweer de waarde 1 meegeeft aan vorst, dus alleen wanneer de temperatuur wordt doorgegeven. Dit voorkomt vals alarm als er elders in de tekst een minteken staat. Door booleaanse variabele ijs op true (waar) te zetten na het eerste piepsignaal, piept de luidspreker alleen aan het begin van een vorstperiode. De temperatuur moet eerst weer boven nul zijn geweest, voor er weer een vorstalarm kan klinken.
De functie checkalarm is redelijk rechttoe-rechtaan. Doordat de pagina is voorbewerkt (zie paragraaf ‘Werking’) volstaat het lezen van slechts één tekstregel. De aanwezigheid van de string code_rood, code_oranje, code_geel of code_groen (wat wordt getest met indexOf) bepaalt vervolgens welke led er brandt. Bij een weeralarm gaat de pieper en wordt de booleaanse variabele alarm op true gezet, bij code groen op false. Net als bij het vorstalarm voorkomt dit herhaaldelijk piepen, zolang er een weeralarm geldt.
©PXimport
Regen
Omwille van de betrouwbaarheid en de flexibiliteit gebruiken we niet één enkele waarde, maar een tabel met de regenverwachting per vijf minuten voor de komende twee uur. Dat maakt het in theorie mogelijk om een lange periode vooruit te kijken, ware het niet dat de kwaliteit van die langetermijnvoorspellingen vaak te wensen overlaat. Het bruikbaarst zijn de gegevens tot pakweg een kwartier vooruit. De praktijk leert bovendien dat de kwaliteit enorm toeneemt als er twee aaneengesloten blokken van vijf minuten allebei regen of juist droog weer voorspellen. Om die reden kijkt de functie checkrain zowel naar de geselecteerde periode als naar die van de regel erna (vijf minuten later). Pas als ze het ‘met elkaar eens zijn’, verandert de status.
De regentabel bestaat uit 24 regels en twee door het sluisteken (|, beter bekend als pipe) gescheiden kolommen. De eerste kolom bevat de hoeveelheid neerslag, de tweede de tijd. De tabel wordt ingelezen en met de functie getValue in twee etappes gesplitst om de regendata over te houden. Die waarde zetten we om naar een geheel getal, zodat we ermee kunnen rekenen. De hoeveelheid doet er niet toe, nul staat voor droog en alles groter dan nul betekent regen. Eerst halen we de gekozen periode +1 op en via een aantal tussenstappen kennen we de waarde toe aan de variabele regen. Daarna volgt de gekozen periode zelf, die resulteert in de waarde voor regennu.
Zijn beide groter dan nul, dan gaat de blauwe led branden en klinkt een piepsignaal. Daarbij wordt de booleaanse variabele nat op true gezet om bij langdurige regenval herhaald piepen te voorkomen. Zijn beide variabelen gelijk aan nul, dan is het droog en is de blauwe led uit. Nat wordt false, zodat de pieper de volgende keer dat het regent weer alarm mag slaan.
Code uploaden en testen
De volgende stappen vereisen dat de ontwikkelomgeving Arduino IDE al is geïnstalleerd en geconfigureerd (zie kader ‘Ontwikkelomgeving’). Sluit de ESP-module aan met een usb-stekker en pak het zip-bestand dat je hebt gedownload uit naar een willekeurige map op je harde schijf en open de map esp-weerstation-grafisch. Dubbelklik op het bestand esp-weerstation-grafisch.ino en wijzig de gegevens bij ssid, password, rainurl, weerstation en alarmurl (zie ook het kader ‘Constanten’).
Druk op Ctrl+Shift+M om de seriële monitor te openen, waarmee je straks in de gaten kunt houden wat er gebeurt. Stel de snelheid van de seriële monitor in op 115200 baud. Klik op het pijltje naar rechts bovenin de ontwikkelomgeving. De code wordt nu achtereenvolgens gecontroleerd, gecompileerd en geüpload naar de module.
Eerst wordt de wifi-verbinding opgezet en als dat is gelukt, verwerkt de module achtereenvolgens de regendata, het weerrapport en de status van het weeralarm. Bij rustige, droge omstandigheden boven nul verschijnt het weerrapport op het scherm en brandt de groene led. Is er neerslag en/of vorst, dan branden de blauwe en/of de witte led. En bij een actief weeralarm ten slotte brandt geel, oranje of rood. Elke vijf minuten (of andere periode die je hebt ingesteld) wordt de informatie ververst, waarbij het schermpje gedurende enkele seconden uitgaat.
Niet alle meetstations zijn bruikbaar!
Helaas geven sommige meetstations niet alle gegevens door die wij gebruiken. Controleer daarom in een browser eerst of de gebruikte data aanwezig zijn. Voor meetstation De Bilt (stationcode 6260) typ je view-source:http://arduino.reshift.nl/weermonitor.php?weerstation=6260 in de adresbalk van je browser. Zijn de data binnen de tags **
©PXimport
©PXimport
©PXimport