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.
Verifica el dashboard, las funciones de clasificacion y el sistema de historico. Usa linterna y agua para simular condiciones.
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.