← 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.

Vídeo tutorial
Próximamente
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.

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.