© PXimport

Bouw je eigen weerstation

Geplaatst: 11 september 2019 - 02:53

Aangepast: 16 november 2022 - 09:25

Redactie Computer!Totaal

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.

Boodschappenlijstje

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

Installeer de module via de optie Additionele Board Beheer URLs.

© 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

Voeg de benodigde bibliotheek toe.

© 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.

Een fragment van de code in Arduino IDE.

© PXimport

Constanten

Met Google Maps vind je snel en eenvoudig de gps-coördinaten van jouw locatie.

© 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.

Hopelijk blijft deze ellende ons bespaard …

© 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!

Zijn alle benodigde gegevens aanwezig?

© PXimport

Een pillendoosje van het Kruidvat past precies, maar is niet volledig transparant.

© PXimport

Met Google Maps vind je snel en eenvoudig de gps-coördinaten van jouw locatie.

© PXimport

Deel dit artikel
Voeg toe aan favorieten
ID.nl logo

ID.nl, onderdeel van Reshift BV, is in 2022 gestart en uitgegroeid tot de meest toonaangevende en complete consumentensite van Nederland. Het doel van ID.nl is om de consument te helpen met alle technologie die hoort bij het dagelijks leven: van smart-health-meters tot e-bikes, van warmtepompen tot zonnepanelen - en alles daar tussenin!

Duidelijk, betrouwbaar en onafhankelijk: ID.nl maakt moeilijke dingen makkelijk.

Contact

ID.nl

Nijverheidsweg 18

2031 CP Haarlem

info@id.nl

Telefoon: 023-5430000