### 4.3.6 Regenwatermonitoring #### 4.3.6.1 Overzicht ![Img](./media/top1.png) Wanneer de vochtsensor regen detecteert, stuurt deze een signaal naar de micro:bit-board om diverse acties te activeren. Bijvoorbeeld kan de micro:bit-speaker een alarm afgeven om gebruikers te waarschuwen dat het regent, en de huidige hoeveelheid regen wordt in real-time op de OLED weergegeven. Dit is bijzonder nuttig in buitenomgevingen of weersituaties, waardoor gebruikers de nodige preventieve maatregelen kunnen nemen. Daarnaast kan een regenwatermonitoringsysteem, bestaande uit vochtsensor, OLED-display en micro:bit-board, lekkages in daken of gebouwen detecteren om schade door waterintrusie te voorkomen. Kortom, het is een multifunctioneel en effectief hulpmiddel dat de aanwezigheid van regenwater in verschillende toepassingen kan detecteren. ![Img](./media/bottom1.png) #### 4.3.6.2 Componentkennis ![Img](./media/2top.png) **Vochtsensor** ![Img](./media/steam.png) De vochtsensor kan de aanwezigheid van water detecteren en wordt daarom doorgaans gebruikt in regenwater-detectiesystemen. Wanneer regenwater in contact komt met het geleidende pad (detectiegebied) op de sensor, zal deze een signaal naar de ontwikkelkaart (micro:bit, enz.) sturen om diverse acties te activeren. Hoe meer water zich op het detectiegebied bevindt, hoe hoger de analoge waarde zal zijn. ![Img](./media/cou41.png) **Schema:** ![Img](./media/couy41.png) Hij detecteert de hoeveelheid water door de blootgestelde parallelle lijntjes op de printplaat. Hoe meer water er is, hoe meer draadjes met elkaar verbonden raken. Naarmate het contactoppervlak voor geleiding toeneemt, zal de spanningsuitgang op pin 2 van het detectiegebied geleidelijk stijgen, en zal de analoge waarde die op het signaalklem S wordt gedetecteerd groter zijn. Naast water kan hij ook waterdamp in de lucht detecteren. **Parameters:** - Bedrijfsspanning: DC 3.3V~5V - Bedrijfsstroom: (Max)1.5mA@5V - Maximaal vermogen: 0.075W - Signaaltype: Analoog signaal ![Img](./media/2bottom.png) #### 4.3.6.3 Vereiste componenten | ![Img](./media/microbitV2.png)| ![Img](./media/ExpansionBoard.png) |![Img](./media/OLED.png) | | :--: | :--: | :--: | | micro:bit V2 hoofdkaart ×1 | micro:bit shield ×1 | OLED-display ×1 | |![Img](./media/steam1.png)|![Img](./media/usb.png) |![Img](./media/4pin.png)| | vochtsensor ×1 | micro USB-kabel ×1 | 4-pins kabel ×1 | |![Img](./media/3pin.png)|![Img](./media/batterycase.png)|![Img](./media/AAbattery.png)| | 3-pins kabel ×1 | batterijhouder ×1 | AA-batterijen(**zelf voorbereiden**) ×6 | #### 4.3.6.4 Aansluitschema ⚠️ **Let bij het aansluiten op de kleur van de draden.** | OLED display | draadkleur | micro:bit shield pin | micro:bit board pin | | :----------: | :--------: | :------------------: | :-----------------: | | GND | zwart | G | G | | VCC | rood | V2 | V | | SDA | blauw | 20 | P20 | | SCL | groen | 19 | P19 | | vochtsensor | draadkleur | micro:bit shield pin | micro:bit board pin | | :----------: | :--------: | :------------------: | :-----------------: | | G | zwart | G | G | | V | rood | V1 | V | | S | geel | 1 | P1 | ![Img](./media/couj6.png) #### 4.3.6.5 Programmastroom ![Img](./media/flow-chart-06.png) #### 4.3.6.6 Testcode ⚠️ **Tip 1: Voordat je de code naar de Microbit-board downloadt, importeer het bibliotheekbestand “oled_ssd1306\.py” volgens ** “[Import Library on MU](https://docs.keyestudio.com/projects/KS4050/en/latest/docs/MicroPython/MU_development_environment.html#import-library-on-mu)” . ![Img](./media/WPSA1.png) ⚠️ **Tip 2: De drempelwaarden in de “if()...elif()...” voorwaarden kunnen gewijzigd worden op basis van de werkelijke situatie.** **Volledige code:** ```Python ''' Theme: Rainwater monitoring Function: OLED displays the amount of rainwater and the steam sensor controls the fan and atomization module Compiling IDE: MU 1.2.0 Author: https://docs.keyestudio.com ''' from microbit import * from oled_ssd1306 import * import math import music # Initialize OLED initialize() clear_oled() # Configuration parameters RAIN_PIN = pin1 WET_VALUE = 1023 DRY_VALUE = 0 def map_value(value, in_min, in_max, out_min, out_max): """Linearly map the input values to the output range""" if in_max - in_min == 0: return out_min return (value - in_min) * (out_max - out_min) // (in_max - in_min) + out_min def get_rain_percentage(): raw_value = RAIN_PIN.read_analog() percentage = map_value(raw_value, DRY_VALUE, WET_VALUE, 0, 100) return max(0, min(100, percentage)), raw_value def get_rain_level(percentage): if percentage < 10: return "dry", 0 elif percentage >= 10 and percentage < 20: return "slightly wet", 1 elif percentage >= 20 and percentage < 40: return "wet", 2 elif percentage >= 40 and percentage < 60: return "Very wet", 3 else: return "hydrops", 4 def display_rain_info(): percentage, raw_value = get_rain_percentage() level_text, level = get_rain_level(percentage) # Display on OLED clear_oled() add_text(0, 0, "Rainfall Monitor") add_text(0, 1, "Analog: {}".format(raw_value)) add_text(0, 2, "Humidity: {}%".format(percentage)) add_text(0, 3, "State: {}".format(level_text)) add_text(0, 4, "Class: {}".format(level)) draw_screen() return percentage, level_text while True: percentage, status = display_rain_info() # Display on the LED matrix and speaker plays different tones if percentage >= 10 and percentage < 20: display.show(Image("00000:00000:00900:00000:00000")) # dot music.play("C3:1") # speaker plays C3 tone elif percentage >= 20 and percentage < 40: display.show(Image("00000:00900:09990:00900:00000")) # small circle music.play("C4:1") # speaker plays C4 tone elif percentage >= 40 and percentage < 60: display.show(Image("00900:09990:99999:09990:00900")) # middle circle music.play("C5:1") # speaker plays C5 tone elif percentage >= 60: display.show(Image("09990:90009:90009:90009:09990")) # large circle music.play("B5:1") # speaker plays B5 tone else: display.show(Image("00000:00000:00000:00000:00000")) # do not display any patterns music.reset() # no tone sleep(1000) # Update every second ``` ![Img](./media/line1.png) **Korte uitleg:** ① Importeer de bibliotheken microbit, oled_ssd1306, music en math. ```Python from microbit import * from oled_ssd1306 import * import music import math ``` ② Initialiseer de OLED-pixels en maak de OLED leeg. ```Python initialize() # initialize oled clear_oled() # clear oled ``` ③ Initialiseer de pin- en maximale/minimale waardevariabelen van de vochtsensor. ```Python RAIN_PIN = pin1 WET_VALUE = 1023 DRY_VALUE = 0 ``` ④ Definieer een map-subfunctie (om een getallenbereik lineair naar een ander bereik te mappen). ```Python def map_value(value, in_min, in_max, out_min, out_max): """Linearly map the input values to the output range""" if in_max - in_min == 0: return out_min return (value - in_min) * (out_max - out_min) // (in_max - in_min) + out_min ``` ⑤ Definieer een subfunctie om de intensiteit van de regenhoeveelheid te verkrijgen. ```Python def get_rain_percentage(): raw_value = RAIN_PIN.read_analog() percentage = map_value(raw_value, DRY_VALUE, WET_VALUE, 0, 100) return max(0, min(100, percentage)), raw_value ``` ⑥ Definieer een subfunctie om het niveau van de regenhoeveelheid te verkrijgen. ```Python def get_rain_level(percentage): if percentage < 10: return "dry", 0 elif percentage >= 10 and percentage < 20: return "slightly wet", 1 elif percentage >= 20 and percentage < 40: return "wet", 2 elif percentage >= 40 and percentage < 60: return "Very wet", 3 else: return "hydrops", 4 ``` ⑦ Definieer een subfunctie om informatie over de regenhoeveelheid op de OLED weer te geven. ```Python def display_rain_info(): percentage, raw_value = get_rain_percentage() level_text, level = get_rain_level(percentage) # Display on OLED clear_oled() add_text(0, 0, "Rainfall Monitor") add_text(0, 1, "Analog:: {}".format(raw_value)) add_text(0, 2, "Humidity: {} %".format(percentage)) add_text(0, 3, "State: {}".format(level_text)) add_text(0, 4, "Class: {}".format(level)) draw_screen() return percentage, level_text ``` ⑧ Ken de waarden van de OLED toe aan de variabelen percentage en status. ```Python percentage, status = display_rain_info() ``` ⑨ Beslissingsstructuur: if()...elif()...elif()...elif()...else... Wanneer de gedetecteerde regenhoeveelheid groter dan of gelijk aan 10% maar kleiner dan 20% is, toont de 5×5 LED-matrix ![Img](./media/ab7.png) en speelt de speaker de C3-toon als waarschuwing. ```Pytho if percentage >= 10 and percentage < 20: display.show(Image("00000:00000:00900:00000:00000")) # dot music.play("C3:1") # speaker plays C3 tone ``` Als de gedetecteerde regenhoeveelheid groter dan of gelijk aan 20% maar kleiner dan 40% is, toont de 5×5 LED-matrix ![Img](./media/ab8.png) en speelt de speaker de C4-toon als waarschuwing. ```Python elif percentage >= 20 and percentage < 40: display.show(Image("00000:00900:09990:00900:00000")) # small circle music.play("C4:1") # speaker plays C4 tone ``` Als de gedetecteerde regenhoeveelheid groter dan of gelijk aan 40% maar kleiner dan 60% is, toont de 5×5 LED-matrix ![Img](./media/ab9.png), en speelt de speaker de C5-toon als waarschuwing. ```Python elif percentage >= 40 and percentage < 60: display.show(Image("00900:09990:99999:09990:00900")) # middle circle music.play("C5:1") # speaker plays C5 tone ``` Als de gedetecteerde regenhoeveelheid groter dan of gelijk aan 60% is, toont de 5×5 LED-matrix ![Img](./media/ab10.png), en speelt de speaker de B5-toon als waarschuwing. ```Python elif percentage >= 60: display.show(Image("09990:90009:90009:90009:09990")) # large circle music.play("B5:1") # speaker plays B5 tone ``` Anders toont de 5×5 LED niets en blijft de speaker stil. ```Python display.show(Image("00000:00000:00000:00000:00000")) # do not display any patterns music.reset() # no tone ``` ④ Pauze 1000ms (1s). ```Python sleep(1000) # Update every second ``` #### 4.3.6.7 Testresultaat ![Img](./media/4top.png) Na het aansluiten en inschakelen via de micro USB-kabel, sluit een externe voeding aan (6 AA-batterijen) om een voldoende stroomvoorziening te garanderen, en klik op “Flash” om de code naar de micro:bit-board te downloaden. ![Img](./media/A128.png) Na het uploaden van de testcode, druk op de resetknop aan de achterkant van de micro:bit. ![Img](./media/A455.png) De OLED toont in real-time de gedetecteerde regenhoeveelheid. (**Bijvoorbeeld: gebruik een vochtige hand om het detectiegebied van de vochtsensor aan te raken om regen na te bootsen**). Als de gedetecteerde regenhoeveelheid groter dan of gelijk aan 10% maar kleiner dan 20% is, toont de 5×5 LED-matrix ![Img](./media/ab7.png) en speelt de speaker de C3-toon als waarschuwing. Als de gedetecteerde regenhoeveelheid groter dan of gelijk aan 20% maar kleiner dan 40% is, toont de 5×5 LED-matrix ![Img](./media/ab8.png) en speelt de speaker de C4-toon als waarschuwing. Als de gedetecteerde regenhoeveelheid groter dan of gelijk aan 40% maar kleiner dan 60% is, toont de 5×5 LED-matrix ![Img](./media/ab9.png), en speelt de speaker de C5-toon als waarschuwing. Als de gedetecteerde regenhoeveelheid groter dan of gelijk aan 60% is, toont de 5×5 LED-matrix ![Img](./media/ab10.png), en speelt de speaker de B5-toon als waarschuwing. Als de gedetecteerde regenhoeveelheid minder dan 10% is, toont de 5×5 LED niets en blijft de speaker stil. ![Img](./media/dongtu-06.gif) ⚠️ **Opmerking: De bouwsteentjes in het experiment zijn niet inbegrepen in dit kit.** (**Tip:** Als er geen resultaat wordt waargenomen, druk dan op de resetknop van de micro:bit-board.) ![Img](./media/4bottom.png)