4.3.6 Regenwatermonitoring

4.3.6.1 Overzicht

Img

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

4.3.6.2 Componentkennis

Img

Vochtsensor

Img

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

Schema:

Img

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

4.3.6.3 Vereiste componenten

Img

Img

Img

micro:bit V2 hoofdkaart ×1

micro:bit shield ×1

OLED-display ×1

Img

Img

Img

vochtsensor ×1

micro USB-kabel ×1

4-pins kabel ×1

Img

Img

Img

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

4.3.6.5 Programmastroom

Img

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

Img

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

Img

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

Img

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

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

Img

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

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