Niveau regenwater meten 2.0

Geruime tijd geleden kon je hier lezen over mijn Arduino-based meetsysteem voor de waterstand in mijn regenwaterput. Dat systeem heeft heel wat jaren trouw dienst gedaan, maar uiteindelijk heeft de sensor het toch begeven.

Dus heb ik me ondertussen gewaagd aan een nieuwe oplossing, die hopelijk langer mee kan en wat geleerde lessen integreert.

Om de signaaloverdracht wat robuuster te maken, heb ik gekozen voor CANbus, een protocol dat vrij gangbaar is in de industrie voor elektronische communicatie in ‘uitdagende’ omstandigheden.

Verder heb ik er ook voor gezorgd dat je iets van indicatie krijgt van het resterende niveau. Dat bleek wat lastiger dan gedacht, omdat het toch op centimeters aankomt, maar met wat tweaken.

Een schematische voorstelling met links Neptunus en rechts Jupiter

Zoals op bovenstaand schema te zien is, bestaat het geheel uit twee delen. Het rode deel hangt in de put en heb ik Neptunus gedoopt. Het zwarte deel hangt binnenshuis en heet Jupiter.

De kern van het hele verhaal zijn twee Arduino’s: een Arduino MKR Zero en een Arduino MKR Wifi 1010. De MKR Zero is een compacte versie van de Arduino Zero, die -kort gezegd- op zich weer een snellere versie is van de oude vertrouwde Arduino Uno. De MKR Wifi 1010 heeft ook nog standaard WiFi.

De Arduino MKR Zero

Mijn keuze voor deze Arduino is eigenlijk vooral ingegeven door het beschikbare CAN shield, en ook wel de compacte MKR form factor. Want je hebt snel plaats te kort in zo’n behuizing. Wellicht niet de goedkoopste optie, maar qua eenvoudige opbouw wel zo handig.

Qua ultrasone sensor heb ik een speciale waterdichte versie gekocht, die ziet er een beetje uit als de parkeersensor van een auto, maar dan groter. Schijnbaar worden ze gebruikt in boten om de bodem te detecteren.

Neptunus met de nieuwe sensor

Ik heb deze keer ook wat meer zorg aan de behuizing en bouwkwaliteit willen besteden, en daarom dus echt dedicated electronicabehuizingen gekocht. Ik heb ook een paar kleine onderdelen laten lasersnijden. Met name twee montageplaten om alle onderdelen op vast te schroeven, en een diffuser voor de niveau-leds.

Om de sensor te plaatsen heb ik in het deksel van de ronde enclosure een gat geboord met een stappenboor, de sensor geplaatst en het geheel vervolgens langs binnen afgekit met siliconen.

De verbinding tussen Neptunus en Jupiter is nu met een Ethernetkabel die afgeschermd is tegen het vocht en aan beide zijden gewoon inplugt met een RJ45-jack (aan Neptunus dus met een waterdichte stekker).

Jupiter is de enige van de twee die rechtstreeks stroom krijgt van het net. Via een basic USB-blokje (wel best 2A) en een micro-USB kabel. De 5V wordt dan op een lijn van de Ethernet kabel gezet tot bij Neptunus.

De code voor het hele verhaal is relatief eenvoudig en gebaseerd op die van de vorige versie. Met uiteraard wat extra code voor de CAN interface en het weergeven van het niveau via de LEDs. Daarvoor zijn de CAN library en de FASTLed library nodig in je Arduino omgeving.

Jupiter geeft een volle waterput aan.

Ik heb geprobeerd om zo weinig mogelijk logica in Neptunus (de eenheid in de put) te stoppen, want die herprogrammeren is uiteraard een heel gedoe. Er is een vaag toekomstplan om Jupiter (de eenheid binnenshuis) pushberichten te laten sturen als de put leegraakt. Er is een nog vager plan om die pushberichten enkel te sturen als er binnen de X uren geen of onvoldoende regen verwacht wordt. de MKR Wifi 1010 heeft immers WiFi.

Arduino MKR Wifi 1010

De verbindingen tussen alle onderdelen heb ik zo demonteerbaar mogelijk proberen houden. Dus veel extra stekkertjes, pinheaders en protoboard waar de effectieve verbindingen op lopen. De ervaring leert dat het handig is als je relatief makkelijk alles kan uitpluggen, onderdelen kan verwijderen, wisselen, etc. Ik gebruik hiervoor vaak JST-connectoren en ook wel Grove-connectoren. Die laatste zijn makkelijk verkrijgbaar, compact en stevig, en handig voor overal waar je 4-draads-verbindingen nodig hebt.

Zo hangt alles in Neptunus aan elkaar

3v3 vs 5v logica

De MKR Wifi 1010 is een 3v3 device. Dat wil zeggen dat de logica op de pinnen 3,3 Volt is, ipv 5 Volt bij een Arduino Uno. Voor de WS2812 LED strip is dit een probleem, want de signaallijn daar verwacht 5 Volt. Als je dit gewoon aansluit op een 3v3 pin, is het resultaat onbetrouwbare weergave met flikkerende LEDs en wisselende kleuren. Niet ideaal.

Om dat op te lossen heb ik een eenvoudige step-up level shifter gebruikt met twee diodes en een weerstand. Zoals je kan zien in onderstaand schema. De condensator op de WS2812 strip is er als buffer om stroompieken op te vangen.

Verbindingen in Jupiter, met de level-up shifter

Doe het zelf

Voor wie het zelf thuis wil gaan nabouwen, ik heb een heuse Bill of Materials voor het hele project. Die is voorzien van links naar catalogi allerhande en zal dus wellicht snel verouderen. Maar het kan een hulpmiddel zijn. Ik heb ook de lasercut- en Arduino files in een download (zip) gestoken.

Foto’s van Neptunus en Jupiter

Display op Jupiter in actie