PROYECTO #05 Nivel Medio ⏱ 55 min

Detector de Lluvia
con Alerta

Lee el sensor de lluvia, muestra el nivel de humedad en la pantalla OLED y enciende un LED cuando llueve. Tu primer proyecto combinando sensor analogico con display — la base de cualquier estacion meteorologica.

Sensor Lluvia LED Verde Pantalla OLED micro:bit Placa expansion
★ Materiales

Que necesitas

Este proyecto usa tres componentes a la vez por primera vez. Asegurate de tener todos antes de empezar — especialmente la pantalla OLED, que necesita una configuracion extra en MakeCode.

🤖
micro:bit v2
x1 unidad
Ver guia →
🔌
Placa de expansion
x1 unidad
Ver guia →
🌧
Sensor de Lluvia
x1 unidad
Ver guia →
🟢
LED Verde
x1 unidad
Ver guia →
📺
Pantalla OLED
x1 unidad (128x64)
Ver guia →
Cables dupont
x9 cables
Ver guia →
⚡ Conexion

Como conectar los componentes

Este proyecto tiene tres componentes — mas que los anteriores. Conectalos uno a uno y comprueba cada uno antes de pasar al siguiente. La OLED usa I2C (pines fijos), los demas usan pines normales.

💡 Que es I2C?
I2C es un protocolo de comunicacion que usa solo 2 cables para conectar multiples dispositivos. En el micro:bit, los pines I2C son fijos: SCL = P19 (reloj) y SDA = P20 (datos). En la placa de expansion los encontraras etiquetados como CLK y DA. No uses P19 ni P20 para otros componentes — estan reservados para I2C.
Componente Pin del componente Pin micro:bit Color recomendado
Sensor Lluvia Signal (AO / analog) P0 🟡 Amarillo
Sensor Lluvia V (VCC) 3.3V 🔴 Rojo
Sensor Lluvia G (GND) GND ⚫ Negro
LED Verde Signal (S) P1 🟠 Naranja
LED Verde V (VCC) 3.3V 🔴 Rojo
LED Verde G (GND) GND ⚫ Negro
Pantalla OLED CLK (SCL) SCL / P19 🔵 Azul
Pantalla OLED DA (SDA) SDA / P20 🔳 Verde
Pantalla OLED V (VCC) 3.3V 🔴 Rojo
Pantalla OLED G (GND) GND ⚫ Negro
1
Inserta el micro:bit en la placa de expansion con la pantalla mirando hacia arriba.
2
Conecta el sensor de lluvia: el pin AO (o Signal) va a P0, VCC a 3.3V, GND a GND. Usa la salida analogica, no la digital (DO).
3
Conecta el LED verde: S a P1, V a 3.3V, G a GND.
4
Conecta la OLED: en la placa busca los conectores marcados SCL (o CLK) y SDA (o DA). Son los pines I2C. Conecta CLK/SCL al pin SCL de la OLED y DA/SDA al SDA. Alimentacion a 3.3V y GND.
5
Antes de programar: en MakeCode ve a Extensiones y busca oled. Instala la extension de Kitronik. Sin esta extension el codigo de la OLED no funcionara.
</> Programacion

El codigo del proyecto

El codigo lee el sensor cada segundo, actualiza la OLED con el valor actual y el estado, y controla el LED verde. El umbral por defecto es 600 — lo ajustaras en las actividades segun tu sensor.

📄
Extension OLED requerida: En MakeCode ve a Extensiones (icono de engranaje arriba a la derecha → Extensiones) y busca "oled". Instala la extension de Kitronik. Si ya tienes un proyecto, cierra y vuelve a abrirlo tras instalar.
JavaScript — MakeCode (requiere extension OLED)
// Detector de lluvia con pantalla OLED
// Requiere extensión OLED en MakeCode (busca "oled" en Extensiones)

let nivelLluvia = 0
let UMBRAL_LLUVIA = 600  // Por encima de este valor = lluvia

// Inicializar OLED (128x64 pixels)
OLED.init(128, 64)

basic.forever(function () {
    // Leer sensor de lluvia (0-1023, más alto = más húmedo)
    nivelLluvia = pins.analogReadPin(AnalogPin.P0)

    // Limpiar pantalla y mostrar datos actualizados
    OLED.clear()
    OLED.writeString("=== SENSOR LLUVIA ===")
    OLED.writeString("Nivel: " + nivelLluvia)

    if (nivelLluvia > UMBRAL_LLUVIA) {
        OLED.writeString("ESTADO: LLUVIA!")
        OLED.writeString(">>> Alerta activa")
        pins.digitalWritePin(DigitalPin.P1, 1)   // LED ON
        basic.showIcon(IconNames.Umbrella)
    } else {
        OLED.writeString("ESTADO: Seco")
        OLED.writeString("Sin alerta")
        pins.digitalWritePin(DigitalPin.P1, 0)   // LED OFF
        basic.showIcon(IconNames.Happy)
    }

    basic.pause(1000)   // Actualizar cada segundo
})
MicroPython (requiere libreria ssd1306)
from microbit import *
import ssd1306   # Librería para pantalla OLED

# Inicializar OLED (I2C address 0x3C, 128x64 pixels)
oled = ssd1306.SSD1306_I2C(128, 64, i2c)

UMBRAL_LLUVIA = 600

while True:
    # Leer sensor de lluvia (0-1023)
    nivel_lluvia = pin0.read_analog()

    # Limpiar pantalla
    oled.fill(0)
    oled.text("SENSOR LLUVIA", 0, 0)
    oled.text("Nivel: " + str(nivel_lluvia), 0, 16)

    if nivel_lluvia > UMBRAL_LLUVIA:
        oled.text("ESTADO: LLUVIA!", 0, 32)
        oled.text("Alerta activa", 0, 48)
        pin1.write_digital(1)
        display.show(Image.UMBRELLA)
    else:
        oled.text("Estado: Seco", 0, 32)
        oled.text("Sin alerta", 0, 48)
        pin1.write_digital(0)
        display.show(Image.HAPPY)

    oled.show()   # Enviar buffer a la pantalla
    sleep(1000)
✓ Pruebalo

Que deberia pasar

Comprueba cada punto de la lista. Si la OLED no muestra nada, revisa la seccion de Problemas antes de seguir.

La OLED se enciende: al cargar el codigo, la pantalla OLED muestra el titulo "SENSOR LLUVIA" y debajo el valor numerico del sensor (entre 0 y 1023).
Sensor seco: sin agua, el valor mostrado deberia ser bajo (0-200). La OLED dice "Estado: Seco", el LED verde esta apagado y el micro:bit muestra una carita feliz.
Al mojar el sensor: toca las placas metalicas del sensor con un dedo humedo. El valor sube por encima de 600 (o del umbral que hayas fijado), la OLED cambia a "ESTADO: LLUVIA!", el LED verde se enciende y la pantalla del micro:bit muestra un paraguas.
Al secar el sensor: cuando el valor baja del umbral, el sistema vuelve al estado "Seco" automaticamente. No hace falta resetear nada.
Actualizacion continua: el valor en la OLED cambia cada segundo segun el nivel de humedad del sensor. Puedes ver el numero subir y bajar en tiempo real.
🎯 Actividades

Amplia el proyecto

Primero calibra tu sensor con el desafio 1. Los demas dependen de conocer el rango real de valores que da tu sensor especifico.

🎯 Desafio 1 — Basico
Calibra tu sensor
Primero toca el sensor con el dedo humedo y observa los valores en la OLED. ¿Que valor maximo ves? ¿Y con el sensor seco? Anotalos. Luego ajusta la variable UMBRAL_LLUVIA al valor que mejor separa "seco" de "humedo" para tu sensor.
🎯 Desafio 2 — Medio
Tres niveles
Anade 3 niveles en la pantalla: "Seco" (valor < 300), "Humedo" (300-600), "Lluvia" (valor > 600). Usa dos condiciones if/else if/else y muestra mensajes distintos para cada uno — incluida una frase animando a llevar el paraguas.
🎯 Desafio 3 — Avanzado
Parpadeo proporcional
Haz que el LED parpadee mas rapido cuanto mas lluvia haya. Calcula el tiempo de pausa usando el valor del sensor: a valor alto, tiempo de pausa corto. Pista: pausa = 1023 - nivelLluvia te da un rango invertido. Divide entre 4 para que los valores sean razonables.
🎯 Desafio 4 — Experto
Contador de lluvias
Anade un contador en la OLED que cuente cuantas veces ha "empezado a llover" (cada vez que el valor sube por encima del umbral por primera vez, suma 1). Necesitaras una variable booleana que recuerde si ya estabas en modo lluvia para no contar multiples veces la misma lluvia.
⚠ Problemas frecuentes

Algo no funciona?

La OLED es el componente mas nuevo en este proyecto. Si algo falla, suele ser la extension o las conexiones I2C. Lee con atencion.

"La OLED no muestra nada — la pantalla esta completamente negra"
Asegurate de haber instalado la extension OLED en MakeCode. Ve a Extensiones y busca 'oled'. Sin la extension, OLED.init y OLED.writeString no existen y el codigo no se compila correctamente. Tambien comprueba que los cables CLK y DA estan en los pines I2C correctos.
"El sensor de lluvia da valores muy bajos siempre, aunque lo moje"
El sensor mide conductividad entre sus placas metalicas: a mas agua entre ellas, mayor conductividad, mayor valor. Asegurate de usar la salida analogica (AO) y no la digital (DO). Si usas la salida digital, solo tendras 0 o 1, no un rango.
"La pantalla OLED se congela o muestra texto superpuesto"
Asegurate de llamar OLED.clear() al inicio de cada iteracion del bucle. Sin este comando, el nuevo texto se escribe encima del anterior y la pantalla se vuelve ilegible rapidamente. En MicroPython el equivalente es oled.fill(0) seguido de oled.show().
"Los cables CLK y DA de la OLED no se donde van exactamente"
En la placa de expansion busca las etiquetas SCL (= CLK, pin de reloj) y SDA (= DA, pin de datos). Son los pines I2C fijos del micro:bit — corresponden a P19 y P20. NO uses P0, P1 o P2 para la OLED. Si tu placa no tiene SCL/SDA etiquetados, conecta directamente a los pines P19 y P20.
🚀 Mas alla

Ideas para seguir explorando

Ahora sabes leer sensores analogicos y mostrar datos en una pantalla. Estas dos habilidades juntas son la base de casi cualquier sistema de monitorizacion del mundo real.

🌭
Estaciones meteorologicas Las estaciones de meteorologia profesionales usan exactamente este principio: sensores que generan senales analogicas que se muestran en displays. La diferencia es la precision de los sensores, no el concepto.
📷
Sensores de humedad de suelo El sensor de lluvia y el de humedad de suelo funcionan igual: miden conductividad. Los sistemas de riego automatico de jardines usan este principio para decidir cuando regar.
📊
Data logging El siguiente paso natural es guardar los datos con marca de tiempo. Los dataloggers industriales hacen exactamente esto — registran variables del entorno a lo largo del tiempo para analizar tendencias.
🕔
Combinar con servo Conecta un servomotor y hazte un "medidor de lluvia" fisico: el servo gira un puntero segun el nivel de lluvia, como el cuadrante de un instrumento analogico clasico. Usaras Math.map para convertir valores.