4.3.6 Regenwatermonitoring
4.3.6.1 Overzicht

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.

4.3.6.2 Componentkennis

Vochtsensor

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.

Schema:

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

4.3.6.3 Vereiste componenten
|
|
|
|---|---|---|
micro:bit V2 hoofdkaart ×1 |
micro:bit shield ×1 |
OLED-display ×1 |
|
|
|
vochtsensor ×1 |
micro USB-kabel ×1 |
4-pins kabel ×1 |
|
|
|
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 |

4.3.6.5 Programmastroom

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

⚠️ Tip 2: De drempelwaarden in de “if()…elif()…” voorwaarden kunnen gewijzigd worden op basis van de werkelijke situatie.
Volledige code:
'''
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

Korte uitleg:
① Importeer de bibliotheken microbit, oled_ssd1306, music en math.
from microbit import *
from oled_ssd1306 import *
import music
import math
② Initialiseer de OLED-pixels en maak de OLED leeg.
initialize() # initialize oled
clear_oled() # clear oled
③ Initialiseer de pin- en maximale/minimale waardevariabelen van de vochtsensor.
RAIN_PIN = pin1
WET_VALUE = 1023
DRY_VALUE = 0
④ Definieer een map-subfunctie (om een getallenbereik lineair naar een ander bereik te mappen).
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.
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.
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.
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.
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
en speelt de speaker de C3-toon als waarschuwing.
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
en speelt de speaker de C4-toon als waarschuwing.
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
, en speelt de speaker de C5-toon als waarschuwing.
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
, en speelt de speaker de B5-toon als waarschuwing.
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.
display.show(Image("00000:00000:00000:00000:00000")) # do not display any patterns
music.reset() # no tone
④ Pauze 1000ms (1s).
sleep(1000) # Update every second
4.3.6.7 Testresultaat

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.

Na het uploaden van de testcode, druk op de resetknop aan de achterkant van de micro:bit.

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

⚠️ 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.)









