Een weerstation met een ESP32: Ontvang nauwkeurige weersvoorspellingen zonder sensoren te installeren
De installatie van een weerstation betekent meestal dat er een set speciale sensoren op het dak moet worden geplaatst, wat om verschillende redenen niet altijd mogelijk is. Dit project lost dat probleem op door via een Wi-Fi-verbinding toegang te krijgen tot de OpenWeather-service.
Het voorspellen van het weer voor morgen, overmorgen of zo ver mogelijk vooruit is altijd een belangrijke wens van de mens geweest. Dit leidde tot de ontwikkeling van de meteorologie. De belangstelling voor dit vakgebied groeide aanzienlijk tegen het einde van de vorige eeuw, dankzij de beschikbaarheid van speciale websites en betaalbare weerstations voor thuis die eenvoudig te installeren zijn.
Een weerstation is een systeem dat, met behulp van een paar sensoren van met name luchtvochtigheid, luchtdruk, neerslag en windsnelheid en -richting, actuele condities en voorspellingen kan geven. Dit gebeurt via lokale algoritmen of door toegang te krijgen tot databases en servers op het web. Onlangs zijn weerstations ook omschreven als apparaten die zelf geen gegevens over de omgeving verzamelen, maar informatie weergeven die afkomstig is van het internet, waaronder meteorologische sites of gegevens van geregistreerde gebruikers.
Het smart display met een ESP32-S3
De module voor dit weerstationproject is een TFT smart display van 3,5 inch met capacitief aanraakscherm en een grafische controller van het type ILI9488. Deze is gekoppeld aan de ESP32-S3 module met een microSD kaartslot om het uit te voeren programma te kunnen laden. De controller gebruikt een 16-bits parallelle bus voor communicatie met de ESP32-S3 en kan werken met kloksnelheden tot 20 MHz, waardoor video's vloeiend kunnen worden afgespeeld.
De eigenschappen van de module staan hieronder.
- Besturing: ESP32-S3-WROOM-1, PCB-antenne, 16 MB flash, 2 MB PSRAM, ESP32-S3-WROOM-1-N16R2
- Draadloze communicatie: Wi-Fi en Bluetooth 5.0
- LCD: 3,5-inch TFT LCD
- Resolutie: 480×320 pixels
- Kleur: RGB
- LCD-interface: 16-bits parallel
- LCD-driver: ILI9488
- Sensor: capacitief aanraakscherm
- Stuurprogramma aanraakscherm: FT6236
- USB: Dubbele USB Type-C (één voor USB-naar-UART en één voor native USB)
- UART naar UART chip: CP2104
- Voeding: USB Type-C 5,0 V (4,0 V...5,25 V)
- Knoppen: Flashknop en Resetknop
Deze weerstations met internetverbinding zijn weliswaar minder onafhankelijk dan offline weerstations, maar ze bieden twee grote voordelen: Ze elimineren de noodzaak om apparatuur zoals wind- en regenmeters op het dak of balkon te installeren, en ze zijn betaalbaarder. Dit inspireerde het idee voor ons project: een eenvoudig, compact weerstation dat mogelijk wordt gemaakt door apparaten zoals slimme displays of slimme panelen, gebaseerd op ESP32 SoC's, die nu overal verkrijgbaar zijn. Eén zo'n apparaat, het 3,5″ TFT Display met ESP32-S3 van Makerfabs, trok in het bijzonder onze aandacht en wordt gebruikt in dit project. Het is verkrijgbaar in de Elektor Store.
Deze module is een 3,5″ TFT smart display met een ESP32-S3 die werkt op 2,4 GHz, en heeft I2C, I2S, SPI, PWM, UART en USB interfaces. Het bevat ook twee USB-C poorten, een SD kaartslot en bovendien draadloze verbindingen met Wi-Fi en Bluetooth. Figuur 1 toont deze module van beide kanten. Het display is uitgerust met een microprocessor en kan naar wens worden geprogrammeerd door firmware te laden op een ingebouwde SD-kaart. Dit maakt uitgebreide aanpassingen en interactie met de buitenwereld mogelijk.
Wat dit apparaat nog aantrekkelijker maakt is dat het behoort tot de ESP32 familie en geprogrammeerd kan worden met behulp van de Arduino IDE omgeving. Dit maakt het mogelijk om de LovyanGFX bibliotheek te gebruiken, een cruciaal hulpmiddel voor interactie met het scherm. We zullen in latere pagina's uitleggen hoe je deze bibliotheek beschikbaar kunt maken in de IDE met behulp van Library Manager. De versie van de bibliotheek die in dit project wordt gebruikt is 1.1.2. Het gebruik van deze bibliotheek is vrij eenvoudig: Je maakt een LGFX object aan, initialiseert het, stelt enkele parameters in (die we later zullen bespreken) en het wordt dan het "canvas" voor je gewenste weergave. Een voorbeeld is te zien in de code in examples/HowToUse/1_simple_use/1_simple_use.ino in de LovyanGFX bibliotheek.
Het weerstationproject
In dit weerstationproject hebben we een klein desktop/wand weerstation gebouwd met behulp van dit krachtige smart display. Het maakt gebruik van de API van de OpenWeather web service om dagelijkse weersverwachtingen voor een bepaalde locatie op te halen. Het station bevat een microSD-kaart voor configuratiegegevens, zodat gebruikers instellingen kunnen wijzigen zonder de firmware opnieuw te programmeren. Ze kunnen eenvoudigweg een externe SD-kaartlezer gebruiken om parameters te wijzigen, zoals de toegangsgegevens tot het Wi-Fi-netwerk, de bedrijfsmodus (DHCP of statisch IP), de gebruikersparameters van openweathermap.org, het ID van de stad en de timing voor het updaten van de weergegevens.
Het project dient in wezen als visualizer. Dankzij de ESP32-S3 SoC maakt het verbinding met het internet via onboard Wi-Fi en verzamelt het de benodigde gegevens van de eerder genoemde webservice.
De weergegevens ophalen
Om de Electronic Control Unit (ECU) goed te laten functioneren, moet deze eerst gegevens verzamelen. Om dit te bereiken moet je je eerst registreren bij de OpenWeather service om een API-key (toegangssleutel) en alle relevante informatie voor het implementeren van de code te verkrijgen. Na registratie moet je naar het registratiegedeelte van de website gaan en het proces voltooien zoals aangegeven. Eenmaal geregistreerd kun je naar je persoonlijke instellingen gaan door op My Profile te klikken (Figuur 2).
In de sectie My API keys vind je een standaard key. We raden je echter aan deze te verwijderen en een nieuwe aan te maken met een meer beschrijvende naam waarin het gebruik wordt aangegeven. We hebben er bijvoorbeeld een gemaakt met de naam Futura_Irrigazione en deze gegenereerd door deze naam in te voeren in het veld API key name en op de knop Generate te klikken. Hierna kom je in een situatie terecht die lijkt op die in Figuur 3, waar het veld Key anders is dan in de afbeelding, omdat elke Key uniek is.
Bewaar de API-key die je aanmaakt, want die heb je later nodig bij het configureren van de microSD-kaart. Na het genereren van de sleutel ontvang je een e-mail waarin staat dat het een paar uur duurt voordat de sleutel is geactiveerd. Dit betekent dat als je de service meteen probeert te gebruiken, de openweathermap.org server alleen een foutmelding zal terugsturen.
Terwijl je wacht op de activering van de sleutel, kun je de ID van je stad ophalen, die nodig is voor weerinformatie. Om dit te doen, klik je op het logo van de site om terug te keren naar de startpagina, voer je de naam van je gewenste stad in het veld Search city in, klik je op de knop Search en selecteer je de stad. De ID van de stad verschijnt dan als onderdeel van de URL in de adresbalk van je browser. In ons geval is de ID 6537078. Bewaar deze ID voor latere configuratie. Figuur 4 toont de adresbalk met onze stad Gallarate als geselecteerde stad. Om te controleren of de API actief is, open je je browser en plak je de volgende link, waarbij je de APIURL en CITY vervangt door de respectievelijke identifiers. In ons voorbeeld zou de link zijn:
https://api.openweathermap.org/data/2.5/weather?id=6537078&units=metric&appid=17c94813dce731e5b709626c9585f4bc
De verwachte uitvoer wordt weergegeven in Figuur 5.
Nu dit onderdeel klaar is, kunnen we ons richten op de besturingscode die op onze hardware moet worden geladen. Het is echter de moeite waard om eerst de API te bespreken. We hebben de kosten van de service niet genoemd, omdat deze gratis is voor dit project, maar OpenWeather biedt verschillende abonnementen met verschillende functies, die naar behoefte kunnen worden geactiveerd. Om bijvoorbeeld een vierdaagse verwachting op te vragen of weerwaarschuwingen en statistieken te ontvangen, kun je het relevante abonnement activeren door naar de API-pagina te gaan (vanuit de navigatiebalk van de site).
microSD-voorbereiding
Zoals vermeldt, bevat de module een microSD-kaart, waarop het bestand config.ini moet worden aangemaakt. Dit bestand bevat alle gegevens die te maken hebben met de configuratie van het apparaat, inclusief die voor toegang tot het Wi-Fi-netwerk en de benodigde gegevens om via de API verbinding te maken met de weerdienst. Figuur 6 geeft een voorbeeld van de inhoud van een bestand gebaseerd op wat er op de vorige pagina's is gemeld.
Het [Netwerk] gedeelte bevat de volgende gegevens:
SSID | Wi-Fi netwerknaam |
PWD | Wi-Fi wachtwoord |
IP | Gewenst IP-adres voor statische IP-configuratie. Leeg laten voor DHCP.. |
Gateway | Gewenst gateway-adres voor statische IP-configuratie. Leeg laten voor DHCP. |
SubNet | Gewenst subnetmasker voor statische IP-configuratie. Leeg laten voor DHCP. |
DNS1 | Gewenst primair DNS-adres voor statische IP-configuratie. Leeg laten voor DHCP. Het secundaire DNS-adres is standaard dat van de gateway. |
Het [Country] gedeelte bevat de stad ID van openweathermap.org en de frequentie van het updaten van de weergegevens. Tot slot moet het [API] gedeelte de door jou aangemaakte API-sleutel bevatten. Vergeet niet dat het ongeveer twee uur duurt voordat de sleutel is geactiveerd. Maak dit bestand en kopieer het naar de microSD-kaart. Let op dat de bestandsnaam hoofdlettergevoelig is. Je kunt de gegevens op elk moment wijzigen, maar ze worden alleen gelezen tijdens het opstarten van het apparaat, dus als je wijzigingen aanbrengt, moet je het apparaat opnieuw opstarten om de nieuwe parameters toe te passen.”
De Arduino sketch
Laten we nu de codering van het weerstation beschrijven, die kan worden gedownload van onze website en direct kan worden geladen via de Arduino IDE zonder wijzigingen, omdat alle configuraties worden gemaakt op de microSD. Een opmerking over de weerpictogrammen die worden weergegeven op de GUI: Hoewel de code klaar is voor gebruik, wil je misschien sommige pictogrammen aanpassen. Deze worden niet direct van de microSD gelezen, maar zijn ingebed in het programmageheugen van de sketch. Hiervoor hebben we een service van derden gebruikt genaamd image2cpp, die JPEG afbeeldingen omzet naar programmacode. Elk weerpictogram moet in de code worden ingebed in een formaat van 128×128 pixels, terwijl de pictogrammen voor windsnelheid, temperatuur, luchtvochtigheid en luchtdruk een formaat van 64×64 pixels hebben.
Laten we eens kijken hoe je een pictogram in de GUI kunt veranderen met de tool image2cpp. Eerst moet je een pictogram van minstens 128×128 pixels vinden of maken. Zodra je de afbeelding hebt, gebruik je bij de stap Select Image de knop Choose File om het gewenste bestand te selecteren (Figuur 7). Ga dan naar de volgende stap om het uitvoerformaat van de afbeelding in te stellen. Aangezien de achtergrond van het scherm zwart is, moet de achtergrond van het nieuwe pictogram bij voorkeur ook zwart zijn.
Stel in het gedeelte Canvas size(s) de grootte in op 128×128 of 64×64, afhankelijk van het pictogram dat je wilt wijzigen, en selecteer Black als achtergrondkleur (Figuur 8). Het is belangrijk om het automatisch schalen van de afbeelding in te stellen met behoud van de verhoudingen. Na het maken van deze instellingen wordt een voorbeeld op basis van je invoer zichtbaar (Figuur 9). Als het pictogram aan je verwachtingen voldoet, kun je op de knop Generate Code klikken nadat je Arduino-code hebt geselecteerd als Code output format. Kopieer het deel tussen de accolades om het later in de Arduino sketch te plakken (Figuur 10).
Open de Arduino IDE (we hebben versie 1.8.9 gebruikt) en open dan de eerder gedownloade sketch door het bestand StationWEB_TOUCH.ino te selecteren. Open de code en er verschijnen twee bestanden, selecteer het bestand weathericons.h, zoek het pictogram dat je wilt wijzigen en plak de eerder gekopieerde code tussen de accolades. Dezelfde procedure kan worden herhaald voor elk pictogram dat je wilt laten afwijken van de standaardinstellingen. Nu de code is aangepast, hoef je deze alleen nog maar op het controllerboard te laden, dat is dan de complete hardware van het weerstation.
De sketch laden via Arduino IDE
Voordat je de code laadt, moet je een aantal voorbereidende stappen uitvoeren, waaronder het installeren van bibliotheken in de IDE en het laden van drivers voor het board van (third party) andere fabrikanten. Als je dit nog niet hebt gedaan, start dan de Arduino IDE en ga naar File → Preferences. Voeg de volgende link toe voor de installatie van het board:
https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_dev_index.json
Klik na het toevoegen van de link op OK om de configuratie te bevestigen (Figuur 11).
Navigeer naar Tools → Board → Board Manager in de Arduino IDE, zoek naar "ESP32" en wacht op de zoekresultaten. Selecteer Espressif Systems met versie 2.0.7 en klik op Install om de drivers voor het displayboard te installeren (Figuur 12). De laatste installatiestap is het toevoegen van de LovyanGFX library. Ga naar Sketch → Include Library → Manage Libraries en zoek naar "LovyanGFX". Wees geduldig tijdens de installatie vanwege de aanzienlijke omvang en daardoor enige tijd kan duren (Figuur 13). Vergeet niet versie 1.1.2 van de bibliotheek te installeren om compatibiliteitsproblemen tijdens het compileren te voorkomen.
Nu is dan uiteindelijk alles geïnstalleerd, dus tenzij het al eerder is gedaan, hoef je alleen nog maar de broncode te openen via het menu File → Open door het bestand StationWEB_TOUCH.ino te openen, waarmee automatisch ook het .h-bestand wordt geopend dat alle pictogrammen bevat die eerder zijn genoemd. Selecteer ESP32S3 Dev Module in het menu Tools → Tab. Tot slot is het tijd om het board aan te sluiten op de computer met behulp van een Type-C kabel die is verbonden met de USB-TTL poort op het display. Als dit de eerste keer is dat je het aansluit, wordt het stuurprogramma automatisch geïnstalleerd, maar als er een foutmelding verschijnt tijdens het aansluiten, kun je het beschikbare stuurprogramma kiezen om te downloaden.
Eenmaal voltooid, krijg je een virtuele seriële poort, in ons geval COM197, die je moet kiezen in het menu Tools → Port. Alles is klaar om de code in het scherm te laden, maar vergeet niet om de microSD die je eerder hebt voorbereid in de sleuf te plaatsen. Zodra ook dit is gedaan, hoef je alleen maar op de load knop bovenaan de Arduino IDE werkbalk te klikken (die met de pijl aan de rechterkant). Zodra het laden is begonnen, zoals aangegeven in het bericht onderin het IDE-venster, houd je tegelijkertijd de RST- en Flash-knoppen achter het scherm ingedrukt, laat je de RST-knop los en zodra het laden begint (een gebeurtenis die in het IDE-venster wordt aangegeven met het bericht Connecting... zoals in Figuur 14), laat je ook de Flash-knop los.
Het programmeren wordt gestart (dit kun je zien aan het voortgangspercentage dat rechts van de oranje lijnen die beginnen met Writing..., onderaan het IDE-venster verschijnt). Als het programmeren klaar is, is het display met ESP32 klaar om als weerstation te werken. Je kunt het nu loskoppelen van de computer en in een willekeurige behuizing plaatsen, zie voorbeeld in Figuur 15. Voor de voeding kun je het beste een 230 VAC/5 VDC netvoeding met USB type C connector gebruiken.
Opmerkingen van de redactie: Geïnteresseerd in ESP32 en doe-het-zelf projecten? Dit project verscheen oorspronkelijk in Elettronica IN