4.3.6 Monitorización de agua de lluvia

4.3.6.1 Descripción general

Img

Cuando el sensor de lluvia detecta lluvia, envía una señal a la placa micro:bit para activar varias acciones. Por ejemplo, el altavoz de la micro:bit puede emitir una alarma para avisar a los usuarios de que está lloviendo, y la cantidad actual de lluvia se mostrará en tiempo real en la OLED. Esto es especialmente útil en entornos o condiciones meteorológicas exteriores, permitiendo a los usuarios tomar las medidas preventivas necesarias. Además, un sistema de monitorización de agua de lluvia, que incluye el sensor de lluvia, la pantalla OLED y la placa micro:bit, puede detectar filtraciones en techos o edificios para prevenir daños causados por la entrada de agua.

En general, es una herramienta multifuncional y eficaz que puede detectar la presencia de agua de lluvia en diversas aplicaciones.

Img

4.3.6.2 Conocimientos sobre el componente

Img

Sensor de lluvia

Img

El sensor de lluvia puede detectar la presencia de agua, por lo que se emplea típicamente en sistemas de detección de agua de lluvia. Cuando el agua de lluvia entra en contacto con la almohadilla conductora (área de detección) del sensor, enviará una señal a la placa de desarrollo (micro:bit, etc.) para activar diversas acciones. Cuanta más agua haya en el área de detección, mayor será el valor analógico.

Img

Diagrama esquemático:

Img

Detecta la cantidad de agua mediante las líneas paralelas expuestas en la placa de circuito. Cuanta más agua haya, más hilos quedarán conectados. A medida que aumenta el área de contacto para la conducción, la tensión de salida en el pin 2 del área de detección aumentará gradualmente, y mayor será el valor analógico detectado en el terminal de señal S. Además del agua, también puede detectar vapor de agua en el aire.

Parámetros:

  • Voltaje de funcionamiento: DC 3.3V~5V

  • Corriente de funcionamiento: (Máx)1.5mA@5V

  • Potencia máxima: 0.075W

  • Tipo de señal: Señal analógica

Img

4.3.6.3 Componentes requeridos

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 Diagrama de conexiones

⚠️ Al realizar el cableado, preste atención al color de los cables.

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 Flujo del código

Img

4.3.6.6 Código de prueba

⚠️ Consejo 1: Antes de descargar el código a la placa Microbit, importe el archivo de la biblioteca “oled_ssd1306.py” haciendo referencia a Import Library on MU” .

Img

⚠️ Consejo 2: El umbral en la condición “if()…elif()…” puede modificarse según la situación real.

Código 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

# Inicializar OLED
initialize()
clear_oled()

# Parámetros de configuración
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)

    # Mostrar en 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()

    # Mostrar en la matriz LED y el altavoz reproduce diferentes tonos
    if percentage >= 10 and percentage < 20:
        display.show(Image("00000:00000:00900:00000:00000"))  # punto
        music.play("C3:1")  # el altavoz reproduce tono C3
    elif percentage >= 20 and percentage < 40:
        display.show(Image("00000:00900:09990:00900:00000"))  # círculo pequeño
        music.play("C4:1")  # el altavoz reproduce tono C4
    elif percentage >= 40 and percentage < 60:
        display.show(Image("00900:09990:99999:09990:00900"))  # círculo mediano
        music.play("C5:1")  # el altavoz reproduce tono C5
    elif percentage >= 60:
        display.show(Image("09990:90009:90009:90009:09990"))  # círculo grande
        music.play("B5:1")  # el altavoz reproduce tono B5
    else:
        display.show(Image("00000:00000:00000:00000:00000"))  # no mostrar ningún patrón
        music.reset()  # sin tono
    sleep(1000)  # Actualizar cada segundo

Img

Explicación breve:

① Importar las bibliotecas microbit, oled_ssd1306, music y math.

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

② Inicializar los píxeles de la OLED, borrar la OLED.

initialize()  # inicializar oled
clear_oled()  # borrar oled

③ Inicializar la variable del pin, valor máximo y mínimo del sensor de lluvia.

RAIN_PIN = pin1
WET_VALUE = 1023
DRY_VALUE = 0

④ Definir una subfunción map (para mapear cualquier rango de número a otro).

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

⑤ Definir una subfunción para obtener la intensidad del volumen de lluvia.

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 

⑥ Definir una subfunción para obtener el nivel del volumen de lluvia.

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

⑦ Definir una subfunción para mostrar en la OLED la información del volumen de lluvia.

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

    # Mostrar en 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

⑧ Asignar los valores en la OLED a las variables percentage y status.

percentage, status = display_rain_info()

⑨ Sentencia de juicio: if()…elif()…elif()…elif()…else…

Cuando el volumen de lluvia detectado es mayor o igual al 10% pero menor que el 20%, la matriz LED 5×5 muestra Img y el altavoz reproduce el tono C3 como advertencia.

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

Si el volumen de lluvia detectado es mayor o igual al 20% pero menor que el 40%, la matriz LED 5×5 muestra Img y el altavoz reproduce el tono C4 como advertencia.

elif percentage >= 20 and percentage < 40:
    display.show(Image("00000:00900:09990:00900:00000"))  # círculo pequeño
    music.play("C4:1")  # el altavoz reproduce tono C4

Si el volumen de lluvia detectado es mayor o igual al 40% pero menor que el 60%, la matriz LED 5×5 muestra Img, y el altavoz reproduce el tono C5 como advertencia.

elif percentage >= 40 and percentage < 60:
    display.show(Image("00900:09990:99999:09990:00900"))  # círculo mediano
    music.play("C5:1")  # el altavoz reproduce tono C5

Si el volumen de lluvia detectado es mayor o igual al 60%, la matriz LED 5×5 muestra Img, y el altavoz reproduce el tono B5 como advertencia.

elif percentage >= 60:
    display.show(Image("09990:90009:90009:90009:09990"))  # círculo grande
    music.play("B5:1")  # el altavoz reproduce tono B5

De lo contrario, la 5×5 LED no muestra nada y el altavoz permanece en silencio.

display.show(Image("00000:00000:00000:00000:00000"))  # no mostrar ningún patrón
music.reset()  # sin tono

④ Retardo 1000ms(1s).

sleep(1000)  # Actualizar cada segundo

4.3.6.7 Resultado de la prueba

Img

Después de conectar y encender mediante el cable micro USB, conecte la alimentación externa (6 pilas AA) para asegurar un suministro de energía suficiente, y haga clic en “Flash” para descargar el código a la placa micro:bit.

Img

Después de subir el código de prueba, pulse el botón de reinicio en la parte trasera de la micro:bit.

Img

La OLED muestra el volumen de lluvia detectado en tiempo real. (Por ejemplo: use una mano húmeda para tocar el área de detección del sensor de lluvia para simular la caída de lluvia).

Si el volumen de lluvia detectado es mayor o igual al 10% pero menor que el 20%, la matriz LED 5×5 muestra Img y el altavoz reproduce el tono C3 como advertencia.

Si el volumen de lluvia detectado es mayor o igual al 20% pero menor que el 40%, la matriz LED 5×5 muestra Img y el altavoz reproduce el tono C4 como advertencia.

Si el volumen de lluvia detectado es mayor o igual al 40% pero menor que el 60%, la matriz LED 5×5 muestra Img, y el altavoz reproduce el tono C5 como advertencia.

Si el volumen de lluvia detectado es mayor o igual al 60%, la matriz LED 5×5 muestra Img, y el altavoz reproduce el tono B5 como advertencia.

Si el volumen de lluvia detectado es inferior al 10%, la 5×5 LED no muestra nada y el altavoz permanece en silencio.

Img

⚠️ Nota: Los bloques de construcción del experimento no están incluidos en este kit.

(Consejo: Si no se observa ningún resultado, por favor presione el botón de reinicio de la placa micro:bit.)

Img