Panel de datos meteorologicos en tiempo real. Lee dos sensores, formatea los datos y los muestra en un dashboard profesional en la OLED con barras de progreso. Aprende sobre funciones, strings formateados y actualizacion continua de datos.
Este proyecto usa solo 3 componentes — la complejidad esta en el codigo, no en el hardware. Es una buena forma de profundizar en programacion.
Conexion sencilla con solo dos sensores analogicos y la OLED. El foco de este proyecto esta en el software.
El codigo mas complejo de la ruta. Presta atencion a las funciones auxiliares — cada una tiene una responsabilidad clara. La funcion barraProgreso es especialmente util para visualizar datos.
// Estación meteorológica completa // Dashboard en tiempo real con histórico let lluvia = 0 let luz = 0 let minLluvia = 1023 let maxLluvia = 0 let minLuz = 1023 let maxLuz = 0 let lecturas = 0 let vistaDashboard = 0 // 0=actual, 1=histórico // Inicializar OLED OLED.init(128, 64) function getCondicion(): string { if (lluvia > 600) return "LLUVIA" if (lluvia > 300) return "NUBLADO" return "DESPEJADO" } function getSol(): string { if (luz > 700) return "SOLEADO" if (luz > 400) return "PARCIAL" return "OSCURO" } function barraProgreso(valor: number, max: number, largo: number): string { let lleno = Math.round(valor / max * largo) let barra = "" for (let i = 0; i < largo; i++) { barra += (i < lleno ? "#" : "-") } return "[" + barra + "]" } function actualizarHistorico() { if (lluvia < minLluvia) minLluvia = lluvia if (lluvia > maxLluvia) maxLluvia = lluvia if (luz < minLuz) minLuz = luz if (luz > maxLuz) maxLuz = luz lecturas += 1 } basic.forever(function () { // Leer sensores lluvia = pins.analogReadPin(AnalogPin.P0) luz = pins.analogReadPin(AnalogPin.P1) actualizarHistorico() OLED.clear() if (vistaDashboard == 0) { // Vista principal OLED.writeString("== METEO STATION ==") OLED.writeString(getCondicion() + " | " + getSol()) OLED.writeString("Lluvia: " + lluvia) OLED.writeString(barraProgreso(lluvia, 1023, 10)) OLED.writeString("Luz: " + luz) OLED.writeString(barraProgreso(luz, 1023, 10)) } else { // Vista histórico OLED.writeString("== HISTORICO ==") OLED.writeString("Lecturas: " + lecturas) OLED.writeString("Lluv min/max:") OLED.writeString(minLluvia + " / " + maxLluvia) OLED.writeString("Luz min/max:") OLED.writeString(minLuz + " / " + maxLuz) } basic.pause(2000) }) // Botón A: cambiar vista input.onButtonPressed(Button.A, function () { vistaDashboard = 1 - vistaDashboard // Alterna entre 0 y 1 basic.showIcon(IconNames.Yes) }) // Botón B: resetear histórico input.onButtonPressed(Button.B, function () { minLluvia = 1023 maxLluvia = 0 minLuz = 1023 maxLuz = 0 lecturas = 0 basic.showString("RST") })
from microbit import *
import ssd1306
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
min_lluvia = 1023; max_lluvia = 0
min_luz = 1023; max_luz = 0
lecturas = 0
vista = 0 # 0=actual, 1=historico
def condicion(lluvia):
if lluvia > 600: return "LLUVIA"
if lluvia > 300: return "NUBLADO"
return "DESPEJADO"
def sol(luz):
if luz > 700: return "SOLEADO"
if luz > 400: return "PARCIAL"
return "OSCURO"
def barra(valor, maximo, largo=8):
lleno = int(valor / maximo * largo)
return "[" + "#" * lleno + "-" * (largo - lleno) + "]"
while True:
global min_lluvia, max_lluvia, min_luz, max_luz, lecturas, vista
lluvia = pin0.read_analog()
luz = pin1.read_analog()
# Actualizar histórico
if lluvia < min_lluvia: min_lluvia = lluvia
if lluvia > max_lluvia: max_lluvia = lluvia
if luz < min_luz: min_luz = luz
if luz > max_luz: max_luz = luz
lecturas += 1
oled.fill(0)
if vista == 0:
oled.text("METEO STATION", 0, 0)
oled.text(condicion(lluvia) + "|" + sol(luz), 0, 12)
oled.text("Lluvia:" + str(lluvia), 0, 24)
oled.text(barra(lluvia, 1023), 0, 34)
oled.text("Luz:" + str(luz), 0, 44)
oled.text(barra(luz, 1023), 0, 54)
else:
oled.text("== HISTORICO ==", 0, 0)
oled.text("Lecturas:" + str(lecturas), 0, 14)
oled.text("Lluv:" + str(min_lluvia) + "/" + str(max_lluvia), 0, 28)
oled.text("Luz:" + str(min_luz) + "/" + str(max_luz), 0, 42)
oled.show()
if button_a.was_pressed():
vista = 1 - vista
if button_b.was_pressed():
min_lluvia = 1023; max_lluvia = 0
min_luz = 1023; max_luz = 0
lecturas = 0
display.scroll("RST")
sleep(2000)
Las funciones getCondicion(), getSol() y barraProgreso() siguen el principio de separacion de responsabilidades: cada funcion hace una sola cosa y devuelve un resultado. Esto hace el codigo facil de leer, probar y modificar de forma independiente — un habito de programacion muy valioso.
Los retos finales de la ruta de aprendizaje. Son los mas exigentes — combina todo lo aprendido.
input.temperature() en MakeCode o temperature() en MicroPython.Problemas frecuentes en este proyecto. Muchos son de codigo, no de hardware — lee los mensajes de error con atencion.
[####------] funciona perfectamente.input.onButtonPressed() fuera del forever — esto crea un evento que se ejecuta en cualquier momento, incluso durante el loop. En MicroPython, usa button_a.was_pressed() dentro del loop (no get_presses() que acumula y puede confundirse).Algunas ideas para seguir explorando con lo aprendido. Y un reconocimiento muy merecido.
Has programado 9 proyectos progresivos con micro:bit — desde un LED parpadeante hasta una estacion meteorologica con dashboard en tiempo real. Ahora sabes controlar sensores, actuadores, pantallas y maquinas de estados.