Inhoudsopgave:
2025 Auteur: John Day | [email protected]. Laatst gewijzigd: 2025-01-13 06:57
Ik wilde al geruime tijd een weerstation voor thuis hebben dat iedereen in het gezin gemakkelijk kon controleren op temperatuur en vochtigheid. Naast het bewaken van de buitenomstandigheden, wilde ik ook specifieke kamers in het huis en mijn garagewerkplaats bewaken. Dat zou ons laten weten wanneer het een goed moment is om het huis te luchten of de luchtontvochtiger te laten draaien (het regent hier veel in de winter). Wat ik heb gemaakt, is een op ESP-Now gebaseerd sensorsysteem dat rapporteert aan een lokale webserver die iedereen vanaf zijn computer of telefoon kan controleren. Voor de telefoon heb ik een simpele Android app geschreven om dat nog makkelijker te maken.
Stap 1: Ontwerpdetails
Ik wilde verschillende sensorstations hebben die ik op verschillende locaties kon plaatsen en ze laten rapporteren aan één hoofdstation (of hub) dat de informatie zou opslaan. Nadat ik verschillende ideeën had uitgeprobeerd, besloot ik het ESP-Now-protocol van Espressif te gebruiken, omdat het snelle communicatie tussen apparaten mogelijk maakte. Je kunt hier iets over ESP-Now lezen en deze GitHub-repo was een groot deel van mijn inspiratie.
De eerste foto toont de indeling van het systeem. Elke sensor rapporteert zijn metingen aan een gateway-apparaat dat de gegevens doorstuurt naar de hoofdserver via een vast bedrade seriële verbinding. De reden hiervoor is dat het ESP-Now-protocol niet tegelijk met de WIFI-verbinding actief kan zijn. Wil een gebruiker toegang hebben tot de webpagina, dan zou de WIFI altijd aan moeten staan en dat maakt het dan onmogelijk om de ESP-Now-communicatie op hetzelfde apparaat te gebruiken. Hoewel het gateway-apparaat een op Espressif gebaseerd apparaat moet zijn (geschikt voor ESP-Now), kan de hoofdserver elk apparaat zijn dat een webpagina kan draaien.
Sommige sensorstations zouden op batterijen werken (of op zonne-energie opgeladen batterijen) en andere zouden gewoon op netstroom hebben. Ik wilde echter dat iedereen zo min mogelijk stroom zou gebruiken en dat is waar de "deepsleep" -functie die beschikbaar is voor ESP8266- en ESP32-apparaten uiterst nuttig is. De sensorstations zouden periodiek wakker worden, metingen doen en deze naar het gateway-apparaat sturen en weer in slaap vallen voor een voorgeprogrammeerde periode. Hun wekperiode van slechts ongeveer 300 ms om de 5 minuten (in mijn geval) vermindert hun stroomverbruik aanzienlijk.
Stap 2: Sensoren
Er zijn verschillende sensoren om uit te kiezen voor het meten van omgevingsparameters. Ik besloot om alleen met I2C-communicatie-compatibele sensoren te blijven, omdat het snelle metingen mogelijk maakte en zou werken op elk van de apparaten die ik had. In plaats van rechtstreeks met IC's te werken, zocht ik naar kant-en-klare modules met dezelfde pin-outs om mijn ontwerpen te vereenvoudigen. Ik begon met het alleen willen meten van temperatuur en vochtigheid en koos daarom voor een op SI7021 gebaseerde module. Later wilde ik een sensor die ook druk kon meten en besloot ik de op BME280 gebaseerde sensormodules te proberen. Voor sommige locaties wilde ik zelfs de lichtniveaus monitoren en de BH1750 module was hier ideaal voor als losse sensormodule. Ik heb mijn sensormodules van ebay gekocht en dit zijn de modules die ik heb ontvangen:
- BME280 (GY-BMP/E280), meet temperatuur, vochtigheid en druk
- SI7021 (GY-21), meet temperatuur en vochtigheid
- BH1750 (GY-302), meet licht
Er zijn twee stijlen van de GY-BMP/E280 PCB-modules te vinden. Beide delen dezelfde pin-out voor pinnen 1 tot 4. Eén module heeft twee extra pinnen, CSB en SDO. Die twee pinnen zijn vooraf aangesloten op de 4-pins versie van de module. Het niveau van de SDO-pin bepaalt het I2C-adres (Ground = default van 0x76, VCC = 0x77). De CSB-pin moet worden aangesloten op VCC om de I2C-interface te selecteren. Ik geef de voorkeur aan de 4-pins module, omdat deze klaar is voor gebruik zoals hij is voor mijn doel.
Over het algemeen zijn deze modules erg handig in gebruik, omdat ze al pull-up-weerstanden hebben geïnstalleerd voor de communicatielijnen en ze werken allemaal op 3,3 V en zijn dus compatibel met op ESP8266 gebaseerde kaarten. Merk op dat de pinnen op deze sensor-IC's over het algemeen niet 5V-tolerant zijn, dus als ze rechtstreeks worden gekoppeld aan zoiets als een Arduino Uno, kunnen ze permanent beschadigd raken.
Stap 3: Sensorstations
Zoals vermeld, zouden de sensorstations allemaal Espressif-apparaten zijn die het ESP-Now-communicatieprotocol gebruiken. Van eerdere projecten en experimenten had ik verschillende apparaten tot mijn beschikking om mijn eerste tests uit te voeren en op te nemen in het definitieve ontwerp. Ik had de volgende apparaten bij de hand:
- twee ESP-01-modules
- twee Wemos D1 mini-ontwikkelborden
- een Lolin ESP8266 ontwikkelborden
- één ESP12E seriële WIFI-kitkaart
- één GOOUUU ESP32-kaart (een 38-pins ontwikkelkaart)
Ik had ook een Wemos D1 R2-ontwikkelbord, maar er waren problemen mee waardoor het niet uit een diepe slaap kon ontwaken en als gateway-apparaat crashte het en niet goed herstart. Ik heb het later gerepareerd en het werd onderdeel van het Garagedeuropener-project. Om "deepsleep" te laten werken, moet de RST-pin van de ESP8266 worden aangesloten op de GPIO16-pin, zodat de slaaptimer het apparaat kan wekken. Idealiter zou deze verbinding gemaakt moeten worden met een Schottky-diode (kathode naar GPIO16) zodat de handmatige reset via de USB-TLL-verbinding tijdens het programmeren nog steeds werkt. Een weerstand met een lage waarde (300 ohm) of zelfs een directe draadverbinding kan echter nog steeds succesvol zijn.
ESP-01-modules bieden geen gemakkelijke toegang tot de GPIO16-pin en men moet rechtstreeks op het IC solderen. Dit is geen eenvoudige taak en ik zou dit niet aan iedereen aanbevelen. Het ESP12E seriële WIFI-kitbord was een beetje een noviteit en vereiste nogal wat veranderingen om bruikbaar te zijn voor mijn doel. De gemakkelijkste boards om te gebruiken waren de Wemos D1 mini-boards en het Lolin-board. ESP32-apparaten hebben geen aanpassingen nodig om deepsleep te laten werken. Andreas Spiess heeft hierover een mooie Instructable.
Stap 4: ESP-01-sensorstation
Op alle sensorstations zijn de sensormodules verticaal gemonteerd om de hoeveelheid stof die zich erop kan verzamelen te verminderen. Niet alle zitten in behuizingen en ik mag ze niet in behuizingen monteren. De reden hiervoor is dat de apparaten kunnen opwarmen en de temperatuur- en vochtigheidsmetingen kunnen beïnvloeden als ze niet voldoende geventileerd zijn.
ESP-01-kaarten zijn erg compact en hebben weinig digitale IO-pinnen om mee te werken, maar het is genoeg voor de I2C-interface. De boards vereisen echter een lastige aanpassing om "deepsleep" te laten werken. Op de getoonde foto is een draad gesoldeerd van de hoekpin (GPIO16) naar de RST-pin op de header. De draad die ik heb gebruikt is een geïsoleerde "reparatie" draad met een diameter van 0,1 mm. De isolatiecoating smelt weg bij verwarming, dus het kan worden gesoldeerd om sporen, enz. in PCB's te repareren en u hoeft zich nog steeds geen zorgen te maken over het maken van kortsluitingen waar de draad in contact komt met andere componenten. De grootte maakt het moeilijk om mee te werken en ik heb deze draad op zijn plaats gesoldeerd onder een (hobbyist / postzegelverzamelaar-stijl) microscoop. Houd er rekening mee dat de kop aan de rechterkant een penafstand van 0,1" (2,54 mm) heeft. Het installeren van een Schottky-diode hier zou helemaal niet eenvoudig zijn, dus besloot ik om alleen de draad alleen te proberen en beide eenheden hebben al meer dan een maand zonder problemen.
De modules zijn geïnstalleerd op twee prototypeborden die ik heb gemaakt. Een (#1) is een programmeerkaart waarmee ook I2C-modules kunnen worden geïnstalleerd en getest, terwijl de andere (#2) een ontwikkel-/testkaart is voor I2C-apparaten. Voor het eerste bord heb ik een oude mannelijke USB-connector en een kleine PCB aan elkaar gesoldeerd om het apparaat rechtstreeks van een USB-muuradapter te voorzien. De andere unit heeft een gewone DC-aansluiting die is aangepast om in de kop van de schroefaansluiting te passen en wordt ook gevoed via een muuradapter.
Het schema laat zien hoe ze zijn aangesloten en hoe de programmeur werkt. Ik heb geen andere ESP-01-modules, dus ik heb de programmer niet direct nodig gehad. In de toekomst zal ik waarschijnlijk een PCB voor ze maken. Op beide borden is de SI7021-sensormodule geïnstalleerd, omdat ik niet zo geïnteresseerd was in drukmetingen op die locaties.
Stap 5: ESP 12E Seriële WIFI Kit-sensorstation
Het ESP12E Serial WIFI Kit-bord was niet zozeer bedoeld voor ontwikkeling als wel om te laten zien wat er met dit apparaat kon worden gedaan. Ik heb het lang geleden gekocht om iets te leren over ESP8266-programmering en uiteindelijk besloot ik het een nieuw gebruik te geven. Ik heb alle LED's verwijderd die voor demonstraties waren geïnstalleerd en een USB-programmeerheader toegevoegd, evenals een I2C-header die geschikt is voor de modules die ik gebruik. Het had een CdS-fotoweerstand aangesloten op de analoge ingangspen en ik besloot het daar te laten. Deze specifieke eenheid zou mijn garagewerkplaats in de gaten houden en de fotosensor die het had was voldoende om me te laten weten of de lichten per ongeluk waren aangelaten. Voor de lichtmeting heb ik de metingen genormaliseerd om me een percentage output te geven en alles boven de "5" 's nachts betekende dat de lichten aan waren of een deur naar het huis niet goed was gesloten. De RST- en GPIO16-pinnen zijn duidelijk gelabeld op de PCB en de Schottky-diode die ze verbindt, werd aan de onderkant van de PCB geïnstalleerd. Het wordt gevoed via een USB-serieel bord dat rechtstreeks is aangesloten op een USB-wandoplader. Ik heb extra's van deze USB-seriële borden en heb deze nu niet nodig.
Ik heb geen schema voor dit bord gemaakt en raad over het algemeen niet aan om er een te kopen om voor dit doel te gebruiken. De Wemos D1 Mini boards zijn veel geschikter en zullen hierna worden besproken. Hoewel, als je een van deze hebt en wat advies nodig hebt, wil ik je graag helpen.
Stap 6: D1 Mini-sensorstations
De ESP8266-ontwikkelborden van het Wemos D1 Mini-type hebben mijn voorkeur en als ik het over zou moeten doen, zou ik deze gewoon gebruiken. Ze hebben een groot aantal toegankelijke IO-pinnen, zijn direct programmeerbaar via de Arduino IDE en zijn toch redelijk compact. De D0-pin is GPIO16 op deze borden en het aansluiten van een Schottky-diode is vrij eenvoudig te doen. Het schema laat zien hoe ik deze borden heb aangesloten en beide gebruiken de BME2808-sensormodule.
Een van de twee borden wordt gebruikt om het buitenweer in de gaten te houden en werkt op een batterij op zonne-energie. Een zonnepaneel van 165 mm x 135 mm (6 V, 3,5 W) is aangesloten op een TP4056 Li-ion-batterijoplaadmodule (zie het installatieschema voor het op zonne-energie aangedreven batterijsensorstation). Deze specifieke oplaadmodule (03962A) is voorzien van een batterijbeveiligingscircuit dat nodig is als de batterij (pack) er geen bevat. De Li-ionbatterij is gerecycled uit een oude laptopbatterij en kan nog steeds voldoende lading bevatten om het D1 Mini-bord te laten werken, vooral als diepe slaap is ingeschakeld. Het bord werd in een plastic behuizing geplaatst om het enigszins te beschermen tegen de elementen. Om het interieur echter bloot te stellen aan de buitentemperatuur en vochtigheid, werden aan weerszijden twee gaten met een diameter van 25 mm geboord en (van binnenuit) bedekt met zwart landschapsdoek. Het doek is ontworpen om vocht door te laten en daardoor kan de luchtvochtigheid worden gemeten. Aan het ene uiteinde van de behuizing werd een klein gaatje geboord en een doorzichtig plastic venster geïnstalleerd. Hier werd de BH1750 lichtsensormodule geplaatst. De gehele unit wordt buiten in de schaduw (geen directe zon) geplaatst met de lichtsensor naar buiten gericht. Het werkt al bijna 4 weken op de batterij op zonne-energie in ons regenachtige / bewolkte winterweer hier.
Stap 7: Gateway en webserver
Een Lolin NodeMCU V3 (ESP8266) bord werd gebruikt voor het ESP-Now Gateway-apparaat en een ESP32 (GOOUUU-bord) werd gebruikt voor de webserver. Bijna elk ESP8266- of zelfs ESP32-bord had als gateway-apparaat kunnen dienen, dit was gewoon het bord dat ik "over had" nadat ik alle andere borden die ik had had gebruikt.
Ik heb het ESP32-bord gebruikt omdat ik een bord met wat meer rekenkracht nodig heb om de gegevens te verzamelen, te sorteren, op te slaan in de opslag en de webserver te laten draaien. In de toekomst heeft het mogelijk ook een eigen sensor en een lokaal (OLED) display. Voor opslag werd een SD-kaart gebruikt met een aangepaste adapter. Ik gebruikte een gewone microSD naar SD-kaartadapter en soldeerde een 7-pins mannelijke (0,1 pitch) header aan de vergulde contacten. Ik volgde het advies van deze GitHub om de verbindingen te maken.
De prototyping-opstelling (met Dupont-draden) bevat geen sensormodule, maar de definitieve PCB die ik heb ontworpen, maakt er wel een mogelijk, evenals een klein OLED-scherm. Details over hoe ik die PCB heb ontworpen, maken deel uit van een andere Instructable.
Stap 8: Software
ESP8266 (ESP-NOW)-apparaten
De software voor alle apparaten is geschreven met de Arduino IDE (v1.87). Elk sensorstation voert in wezen dezelfde code uit. Ze verschillen alleen door welke pinnen worden gebruikt voor de I2C-communicatie en op welke sensormodule ze zijn aangesloten. Het belangrijkste is dat ze het identieke meetgegevenspakket naar het ESP-Now Gateway-station sturen, ongeacht of ze dezelfde sensor hebben. Dit betekent dat sommige sensorstations dummy-waarden invullen voor de druk- en lichtniveaumetingen als ze geen sensoren hebben om echte waarden te leveren. De code voor elk station en de gateway is aangepast van de voorbeelden van Anthony Elder op deze GitHub.
De gateway-apparaatcode gebruikte SoftwareSerial om met de webserver te communiceren, aangezien ESP8266 slechts één volledig functionerende hardware-UART heeft. Met een maximale baudrate van 9600 lijkt het redelijk betrouwbaar en is het meer dan voldoende voor het verzenden van deze relatief kleine datapakketten. Het gateway-apparaat is ook geprogrammeerd met een privé MAC-adres. De reden hiervoor is dat als deze moet worden vervangen, de sensorstations niet allemaal opnieuw hoeven te worden geprogrammeerd met het nieuwe MAC-adres van de ontvanger.
ESP32 (webserver)
Elk sensorstation stuurt zijn datapakket naar het gateway-apparaat dat het doorstuurt naar de webserver. Samen met het datapakket wordt ook het MAC-adres van het sensorstation verzonden om elk station te identificeren. De webserver heeft een "look-up"-tabel om de locatie van elke sensor te bepalen en de gegevens dienovereenkomstig te sorteren. Het tijdsinterval tussen metingen was ingesteld op 5 minuten plus een willekeurige factor om te voorkomen dat sensoren met elkaar "botsen" bij het verzenden naar het gateway-apparaat.
De wifi-router voor thuis is ingesteld om een vast IP-adres toe te wijzen aan de webserver wanneer deze verbinding maakt met wifi. Voor de mijne was het 192.168.1.111. Als u dat adres in een willekeurige browser typt, wordt er verbinding gemaakt met de webserver van het weerstation zolang de gebruiker zich binnen het wifi-bereik van (en verbinding maakt met) het thuisnetwerk. Wanneer de gebruiker verbinding maakt met de webpagina, reageert de webserver met een tabel van de metingen, inclusief de tijd van de laatste meting van elke sensor. Op deze manier, als een sensorstation niet meer reageert, kan men dat aan de tabel zien als een meting meer dan 5-6 min oud is.
De gegevens worden in afzonderlijke tekstbestanden op een SD-kaart opgeslagen en kunnen ook van de webpagina worden gedownload. Het kan worden geïmporteerd in Excel of een andere toepassing voor het plotten van gegevens
Android-app
Om het gemakkelijker te maken om de lokale weersinformatie op een smartphone te bekijken, heb ik een relatief Android-app gemaakt met Android Studio. Het is hier beschikbaar op mijn GitHub-pagina. Het gebruikt de webview-klasse om de webpagina van de server te laden en als zodanig beperkte functionaliteit. Het is niet in staat om de gegevensbestanden te downloaden en ik had die op mijn telefoon sowieso niet nodig.
Stap 9: Resultaten
Tot slot zijn hier enkele resultaten voor van mijn thuisweerstation. De gegevens zijn gedownload op een laptop en uitgezet in Matlab. Ik heb mijn Matlab-scripts bijgevoegd en je kunt ze ook in GNU Octave uitvoeren. De buitensensor draait al bijna 4 weken op zijn door zonne-energie opgeladen batterij en we hebben zelden zon in deze tijd van het jaar. Tot nu toe werkt alles goed en kan iedereen in het gezin het weer zelf opzoeken in plaats van het mij nu te vragen!