4.3.6 Monitoraggio delle acque piovane

4.3.6.1 Panoramica

Img

Quando il steam sensor rileva la pioggia, invia un segnale alla scheda micro:bit per attivare varie azioni. Ad esempio, lo speaker del micro:bit può emettere un allarme per avvisare gli utenti che sta piovendo, e la quantità di pioggia corrente verrà visualizzata in tempo reale sull’OLED. Questo è particolarmente utile in ambienti esterni o meteorologici, permettendo agli utenti di adottare le misure preventive necessarie. Inoltre, un sistema di monitoraggio delle acque piovane, composto da steam sensor, display OLED e scheda micro:bit, può rilevare perdite in tetti o edifici per prevenire danni causati dall’infiltrazione d’acqua.

Nel complesso, è uno strumento multi-funzionale ed efficace che può rilevare la presenza di acqua piovana in varie applicazioni.

Img

4.3.6.2 Conoscenze sui componenti

Img

Sensore d’acqua

Img

Il steam sensor può rilevare la presenza di acqua ed è tipicamente impiegato nei sistemi di rilevamento delle acque piovane. Quando l’acqua piovana entra in contatto con il pad conduttivo (area di rilevamento) sul sensore, invierà un segnale alla scheda di sviluppo (micro:bit, ecc.) per attivare varie azioni. Più acqua è presente nell’area di rilevamento, maggiore sarà il valore analogico.

Img

Schema elettronico:

Img

Rileva la quantità di acqua tramite le linee parallele esposte sulla scheda di circuito. Più acqua c’è, più fili saranno collegati. Man mano che aumenta l’area di contatto per la conduzione, la tensione in uscita al pin 2 dell’area di rilevamento aumenterà gradualmente, e maggiore sarà il valore analogico rilevato al terminale del segnale S. Oltre all’acqua, può rilevare anche vapore acqueo nell’aria.

Parametri:

  • Tensione di funzionamento: DC 3.3V~5V

  • Corrente di funzionamento: (Max)1.5mA@5V

  • Potenza massima: 0.075W

  • Tipo di segnale: Segnale analogico

Img

4.3.6.3 Componenti richiesti

Img

Img

Img

micro:bit V2 main board ×1

micro:bit shield ×1

OLED display ×1

Img

Img

Img

steam sensor ×1

micro USB cable ×1

4 pin wire ×1

Img

Img

Img

3 pin wire ×1

battery holder ×1

AA battery(self-prepared) ×6

4.3.6.4 Schema di collegamento

⚠️ Quando si effettuano i collegamenti, prestare attenzione al colore dei fili.

OLED display

wire color

micro:bit shield pin

micro:bit board pin

GND

black

G

G

VCC

red

V2

V

SDA

blue

20

P20

SCL

green

19

P19

steam sensor

wire color

micro:bit shield pin

micro:bit board pin

G

black

G

G

V

red

V1

V

S

yellow

1

P1

Img

4.3.6.5 Flusso del codice

Img

4.3.6.6 Codice di prova

⚠️ Suggerimento 1: Prima di scaricare il codice sulla scheda Microbit, importare il file di libreria “oled_ssd1306.py” facendo riferimento a Import Library on MU” .

Img

⚠️ Suggerimento 2: La soglia nella condizione “if()…elif()…” può essere modificata in base alla situazione effettiva.

Codice completo:

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

# Inizializza OLED
initialize()
clear_oled()

# Parametri di configurazione
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)

    # Visualizza su 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()

    # Visualizza sulla matrice LED e lo speaker riproduce toni diversi
    if percentage >= 10 and percentage < 20:
        display.show(Image("00000:00000:00900:00000:00000"))  # punto
        music.play("C3:1")  # lo speaker riproduce tono C3
    elif percentage >= 20 and percentage < 40:
        display.show(Image("00000:00900:09990:00900:00000"))  # cerchio piccolo
        music.play("C4:1")  # lo speaker riproduce tono C4
    elif percentage >= 40 and percentage < 60:
        display.show(Image("00900:09990:99999:09990:00900"))  # cerchio medio
        music.play("C5:1")  # lo speaker riproduce tono C5
    elif percentage >= 60:
        display.show(Image("09990:90009:90009:90009:09990"))  # cerchio grande
        music.play("B5:1")  # lo speaker riproduce tono B5
    else:
        display.show(Image("00000:00000:00000:00000:00000"))  # non visualizzare alcun pattern
        music.reset()  # nessun tono
    sleep(1000)  # Aggiorna ogni secondo

Img

Breve spiegazione:

① Importare le librerie microbit, oled_ssd1306, music e math.

from microbit import *
from oled_ssd1306 import *
import music
import math

② Inizializzare i pixel dell’OLED, cancellare l’OLED.

initialize()  # Inizializza OLED
clear_oled()  # Cancella OLED

③ Inizializzare la variabile del pin, il valore massimo e minimo del steam sensor.

RAIN_PIN = pin1
WET_VALUE = 1023
DRY_VALUE = 0

④ Definire una sotto-funzione map (per mappare qualsiasi intervallo numerico in un altro).

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

⑤ Definire una sotto-funzione per ottenere l’intensità della quantità di pioggia.

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 

⑥ Definire una sotto-funzione per ottenere il livello della quantità di pioggia.

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

⑦ Definire una sotto-funzione per mostrare le informazioni sulla quantità di pioggia sull’OLED.

def display_rain_info():
    percentage, raw_value = get_rain_percentage()
    level_text, level = get_rain_level(percentage)

    # Visualizza su 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

⑧ Assegnare i valori mostrati sull’OLED alle variabili percentage e status.

percentage, status = display_rain_info()

⑨ Istruzione di valutazione: if()…elif()…elif()…elif()…else…

Quando la quantità di pioggia rilevata è maggiore o uguale al 10% ma inferiore al 20%, la matrice LED 5×5 visualizza Img e lo speaker riproduce il tono C3 come avviso.

if percentage >= 10 and percentage < 20:
    display.show(Image("00000:00000:00900:00000:00000"))  # punto
    music.play("C3:1")  # lo speaker riproduce tono C3

Se la quantità di pioggia rilevata è maggiore o uguale al 20% ma inferiore al 40%, la matrice LED 5×5 visualizza Img e lo speaker riproduce il tono C4 come avviso.

elif percentage >= 20 and percentage < 40:
    display.show(Image("00000:00900:09990:00900:00000"))  # cerchio piccolo
    music.play("C4:1")  # lo speaker riproduce tono C4

Se la quantità di pioggia rilevata è maggiore o uguale al 40% ma inferiore al 60%, la matrice LED 5×5 visualizza Img, e lo speaker riproduce il tono C5 come avviso.

elif percentage >= 40 and percentage < 60:
    display.show(Image("00900:09990:99999:09990:00900"))  # cerchio medio
    music.play("C5:1")  # lo speaker riproduce tono C5

Se la quantità di pioggia rilevata è maggiore o uguale al 60%, la matrice LED 5×5 visualizza Img, e lo speaker riproduce il tono B5 come avviso.

elif percentage >= 60:
    display.show(Image("09990:90009:90009:90009:09990"))  # cerchio grande
    music.play("B5:1")  # lo speaker riproduce tono B5

Altrimenti, la matrice 5×5 non mostra nulla e lo speaker resta in silenzio.

display.show(Image("00000:00000:00000:00000:00000"))  # non visualizzare alcun pattern
music.reset()  # nessun tono

④ Ritardo 1000ms (1s).

sleep(1000)  # Aggiorna ogni secondo

4.3.6.7 Risultato del test

Img

Dopo aver effettuato i collegamenti e aver alimentato tramite cavo micro USB, collegare l’alimentazione esterna (6 batterie AA) per garantire un’alimentazione sufficiente, e cliccare “Flash” per scaricare il codice sulla scheda micro:bit.

Img

Dopo aver caricato il codice di prova, premere il pulsante di reset sul retro del micro:bit.

Img

L’OLED mostra in tempo reale la quantità di pioggia rilevata. (Ad esempio: usare una mano umida per toccare l’area di rilevamento del steam sensor per simulare la caduta della pioggia).

Se la quantità di pioggia rilevata è maggiore o uguale al 10% ma inferiore al 20%, la matrice LED 5×5 visualizza Img e lo speaker riproduce il tono C3 come avviso.

Se la quantità di pioggia rilevata è maggiore o uguale al 20% ma inferiore al 40%, la matrice LED 5×5 visualizza Img e lo speaker riproduce il tono C4 come avviso.

Se la quantità di pioggia rilevata è maggiore o uguale al 40% ma inferiore al 60%, la matrice LED 5×5 visualizza Img, e lo speaker riproduce il tono C5 come avviso.

Se la quantità di pioggia rilevata è maggiore o uguale al 60%, la matrice LED 5×5 visualizza Img, e lo speaker riproduce il tono B5 come avviso.

Se la quantità di pioggia rilevata è inferiore al 10%, la matrice 5×5 non mostra nulla e lo speaker resta in silenzio.

Img

⚠️ Nota: I mattoncini usati nell’esperimento non sono inclusi in questo kit.

(Suggerimento: Se non si osservano risultati, premere il pulsante di reset della scheda micro:bit.)

Img