← Volver a proyectos
PROYECTO #02 Iniciación ⏱ 35 min

Lámpara
con Botón

Controla un LED con un pulsador externo. Aprende a leer una entrada digital y usa una variable booleana para hacer un interruptor real — igual que el interruptor de la luz de tu habitación.

LED Verde Pulsador micro:bit 🔌 2 pines 📚 Variables booleanas
💡 Concepto clave — Variable booleana
Una variable booleana solo puede tener dos valores: verdadero (true) o falso (false). En este proyecto usamos una para recordar si la lámpara está encendida o apagada. Cada vez que pulsas el botón, invertimos el valor (!encendido) — si era true pasa a false, y viceversa.
💡
1+1
Compon.
35'
Tiempo
P0/P1
Pines

Materiales necesarios

Reúne estos componentes antes de empezar. Haz clic en el nombre para ver la guía de cada componente.

🟢
LED Verde
Pin P1
×1 Ver guía completa →
🔘
Pulsador
Pin P0
×1 Ver guía completa →
🔌
micro:bit + Shield
Controlador
×1 Plataforma principal →
🔗
Cables Dupont
3 por módulo
×6 Info sobre cables →

Conexión de los componentes

Atención: el pulsador va en P0 (entrada/lectura) y el LED en P1 (salida/escritura). No los confundas.

Componente Pin shield Cable recomendado
Pulsador — Señal P0 Azul
Pulsador — Alimentación V (3.3V) Rojo
Pulsador — Tierra G (GND) Negro
LED Verde — Señal P1 Verde
LED Verde — Alimentación V (3.3V) Rojo
LED Verde — Tierra G (GND) Negro
1
Conecta el pulsador al bloque P0 del shield: S → P0, V → V, G → G. El pulsador es la ENTRADA — el micro:bit lo leerá.
2
Conecta el LED verde al bloque P1: S → P1, V → V, G → G. El LED es la SALIDA — el micro:bit lo controlará.
3
El pulsador tiene 4 patas. Los dos pines de un mismo lado están conectados internamente. Conecta el módulo tal como viene — los módulos del kit ya tienen el cableado correcto.
4
Verifica las conexiones antes de subir el código. Si inviertes pulsador y LED, el código no funcionará correctamente aunque parezca correcto.
💡 Regla de oro: Entradas (cosas que lees) en P0. Salidas (cosas que controlas) en P1. Esta lógica se repite en todos los proyectos de este nivel.

Programación

Este código introduce un concepto nuevo: la variable booleana y la anti-rebote (debounce). Lee los comentarios con atención.

MakeCode JavaScript
// Lámpara con botón tipo interruptor
// Cada vez que pulsas el botón, la lámpara cambia de estado

let encendido = false  // Variable booleana: estado de la lámpara

basic.forever(function () {
    if (pins.digitalReadPin(DigitalPin.P0) == 1) {
        // Botón pulsado: cambiar estado (toggle)
        encendido = !(encendido)

        if (encendido) {
            pins.digitalWritePin(DigitalPin.P1, 1)  // LED ON
            basic.showIcon(IconNames.Happy)
        } else {
            pins.digitalWritePin(DigitalPin.P1, 0)  // LED OFF
            basic.showIcon(IconNames.Sad)
        }

        // Esperar a que se suelte el botón (evita cambios múltiples)
        while (pins.digitalReadPin(DigitalPin.P0) == 1) {
            basic.pause(10)
        }
        basic.pause(50)  // Anti-rebote: ignora vibraciones del botón
    }
})
🔄
let encendido = false — Esta línea va FUERA del forever, no dentro. Así el micro:bit recuerda el estado aunque no lo estés pulsando. Si estuviera dentro, se reiniciaría a false en cada vuelta del bucle.
🔀
encendido = !(encendido) — El operador ! invierte un booleano. Si encendido era false, se convierte en true. Si era true, se convierte en false. Es el "toggle" o interruptor.
while (...P0 == 1) + pause(50) — Sin esto, un solo pulso dispararía el toggle decenas de veces porque el bucle es muy rápido. El while espera a que sueltes el botón, y el pause(50) ignora el "rebote" mecánico del contacto.
📖
digitalReadPin(P0) — Lee el estado del pulsador: devuelve 1 cuando está presionado y 0 cuando está suelto. Usamos Read para entradas y Write para salidas.
MicroPython
from microbit import *

encendido = False  # Variable booleana: estado de la lámpara

while True:
    if pin0.read_digital() == 1:
        # Botón pulsado: cambiar estado (toggle)
        encendido = not encendido

        if encendido:
            pin1.write_digital(1)   # LED ON
            display.show(Image.HAPPY)
        else:
            pin1.write_digital(0)   # LED OFF
            display.show(Image.SAD)

        # Esperar a que se suelte el botón
        while pin0.read_digital() == 1:
            sleep(10)
        sleep(50)  # Anti-rebote
🔄
encendido = False — En Python los booleanos se escriben con mayúscula: True y False. Esta variable va FUERA del while True para que persista entre iteraciones del bucle.
🔀
encendido = not encendido — En Python el operador "not" invierte el booleano. Es el equivalente exacto del !(encendido) de JavaScript. Ambos hacen exactamente lo mismo.
📖
pin0.read_digital() — Lee el pin 0 como digital: devuelve 1 (pulsado) o 0 (suelto). Combínalo con pin1.write_digital() para el LED.

Pruébalo — ¿Qué debería pasar?

Sube el código y verifica estos comportamientos uno por uno. Son exactamente lo que debe ocurrir si las conexiones y el código son correctos.

Al arrancar: El LED está apagado y la pantalla del micro:bit muestra una cara triste 😢. La variable empieza en false (apagado).
Primera pulsación: El LED se enciende y la pantalla muestra una cara feliz 😊. Permanece encendido aunque sueltes el botón.
Segunda pulsación: El LED se apaga y la pantalla vuelve a la cara triste. Cada pulsación alterna el estado.
Pulsar y mantener: El estado cambia una sola vez aunque mantengas el botón apretado. El código espera a que lo sueltes antes de aceptar otro cambio.
Múltiples pulsaciones rápidas: Cada pulsación cambia el estado exactamente una vez. No hay cambios dobles ni erróneos gracias al anti-rebote.
🔍 Diferencia con el Proyecto #01
En el proyecto anterior, el LED cambiaba solo por tiempo
Aquí, el LED cambia por una acción del usuario (entrada)
El micro:bit ahora "escucha" el mundo exterior
La variable recuerda el estado sin necesitar timer
⚠️ ¿El LED cambia demasiado rápido?
Esto pasa si faltan las líneas del while y el pause(50). Asegúrate de que están en tu código exactamente como aparecen en el ejemplo.

Actividades de ampliación

¿Ya funciona? Ahora modifica el proyecto. Cada reto introduce un concepto nuevo sobre control de tiempo y lógica.

RETO 1 🎯
Modifica el código para que el LED se apague automáticamente después de 10 segundos aunque no hayas vuelto a pulsar el botón.
Pista: Después de encender el LED, añade basic.pause(10000) y luego apágalo con write(0) y pon encendido = false.
RETO 2 🎯
Haz que el LED parpadee 3 veces antes de apagarse como "aviso de apagado". El usuario sabe que tiene 3 segundos antes de que se apague.
Pista: Usa un bucle for (let i = 0; i < 3; i++) que alterne write(0) y write(1) con pauses cortos antes del apagado final.
RETO 3 🎯
Usa el botón A del propio micro:bit en lugar del pulsador externo. Compara cómo se programa — hay una función específica para ello.
Pista: En MakeCode usa input.onButtonPressed(Button.A, function()...). En Python, button_a.was_pressed(). No necesitas pines externos.
RETO 4 🎯
Añade un segundo LED en P2 con lógica inversa: cuando el primero se enciende, el segundo se apaga, y viceversa. Como si uno fuera la luz del pasillo y el otro la de la habitación.
Pista: Cuando escribes 1 en P1, escribe 0 en P2. Cuando escribes 0 en P1, escribe 1 en P2. La lógica es siempre opuesta.

Problemas frecuentes

Los pulsadores son los componentes que más confusión generan. Aquí están los errores más comunes y cómo resolverlos.

"El botón no responde para nada"
Asegúrate de que el pulsador está en P0 con V y G correctos. Los pulsadores tienen 4 patas: en el módulo del kit, los pines ya vienen etiquetados (S, V, G). Conéctalos igual que el LED pero en P0.
"El LED cambia de estado muchas veces con un solo pulso"
Falta el anti-rebote. Asegúrate de que tienes el bucle while que espera a que sueltes el botón, y el basic.pause(50) después. Sin esto, el bucle forever lo lee decenas de veces por segundo.
"La variable 'encendido' dice que no existe"
La variable debe declararse FUERA del basic.forever, no dentro. La primera línea let encendido = false debe estar antes del bloque forever, en el nivel superior del código.
"El LED siempre está encendido o siempre apagado"
Comprueba que escribes en P1 (LED) y lees de P0 (pulsador), no al contrario. Si los tienes intercambiados en el código o en el hardware, el comportamiento será incorrecto. También verifica que el pulsador está físicamente bien conectado.

¿Quieres ir más allá?

Ahora que controlas la entrada y salida con un botón, hay muchas aplicaciones posibles.

🔢
Contador de pulsaciones
En vez de toggle, usa una variable numérica que se incremente con cada pulsación y muestre el valor en pantalla. Útil para contar personas que entran a una sala.
Temporizador de duración
Registra cuánto tiempo lleva encendida la lámpara y muéstralo en pantalla. Usa las funciones de tiempo del micro:bit para calcular la diferencia entre el momento de encendido y el actual.
📻
Interruptor inalámbrico
Usa la radio del micro:bit para que un botón en un micro:bit controle el LED de otro micro:bit a distancia. ¡Tu primer sistema de control remoto casero!
Siguiente proyecto
Proyecto #03 — Luz Nocturna Automática
Tu primera automatización real: el LED se enciende solo cuando detecta poca luz, sin que nadie tenga que pulsar nada.
Siguiente proyecto →