Nesta página Teoria do interruptor Pull-up interno vs externo Montagem Ler estado do botão Debounce Contador com botões

🔘 Como Funciona um Interruptor de Impulso?

Um interruptor de impulso (push button) liga temporariamente dois terminais enquanto pressionado. Ao soltar, a ligação abre novamente. No Kit A temos 4 interruptores de 6×6mm com 4 pinos.

ℹ️ Pinos do interruptor 6×6mm O interruptor tem 4 pinos, mas internamente só 2 pares: pinos 1-2 são sempre ligados entre si, pinos 3-4 também. A pressão liga o par 1-2 ao par 3-4.

⬆️ Pull-up: Interno vs Externo

TipoComo ativarValorVantagem
Pull-up internosetPull(P0, PinPullMode.PullUp)~10–50 KΩ (interno)Sem resistência externa — mais simples
Pull-up externoResistência 10KΩ entre pino e 3V10 KΩValor fixo e fiável

Com pull-up: o pino lê 1 (HIGH) quando o botão está solto, e 0 (LOW) quando pressionado — lógica invertida.

🔌 Montagem com Pull-up Externo

3V→ Resistência 10KΩ → Pino P0 do micro:bit
P0→ Terminal A do botão
GND→ Terminal B do botão (ao pressionar, P0 vai a GND)

📖 Ler o Estado do Botão

ler_botao.js
// Configurar pull-up interno (não precisa resistência externa)
pins.setPull(DigitalPin.P0, PinPullMode.PullUp)
pins.setPull(DigitalPin.P1, PinPullMode.PullUp)

basic.forever(function () {
    let botao0 = pins.digitalReadPin(DigitalPin.P0)
    let botao1 = pins.digitalReadPin(DigitalPin.P1)

    // Com pull-up: 0 = pressionado, 1 = solto
    if (botao0 == 0) {
        basic.showIcon(IconNames.Yes)
        pins.digitalWritePin(DigitalPin.P2, 1)  // Liga LED
    } else {
        basic.showIcon(IconNames.No)
        pins.digitalWritePin(DigitalPin.P2, 0)  // Apaga LED
    }
})

⚡ Problema de Debounce

Quando um botão é pressionado, os contactos metálicos "saltam" rapidamente entre ligado e desligado durante alguns milissegundos. Isto causa múltiplas leituras falsas — o microcontrolador interpreta um clique como vários.

debounce.js
pins.setPull(DigitalPin.P0, PinPullMode.PullUp)
let ultimo_estado = 1
let contagem = 0

basic.forever(function () {
    let estado_atual = pins.digitalReadPin(DigitalPin.P0)

    // Só age na transição 1→0 (solto→pressionado)
    if (estado_atual == 0 && ultimo_estado == 1) {
        basic.pause(20)  // esperar 20ms para estabilizar
        // Confirmar que ainda está pressionado
        if (pins.digitalReadPin(DigitalPin.P0) == 0) {
            contagem += 1
            basic.showNumber(contagem)
        }
    }
    ultimo_estado = estado_atual
    basic.pause(10)
})

🔢 Contador com Dois Botões

contador_botoes.js
pins.setPull(DigitalPin.P0, PinPullMode.PullUp)  // botão +
pins.setPull(DigitalPin.P1, PinPullMode.PullUp)  // botão -
let valor = 0

basic.forever(function () {
    if (pins.digitalReadPin(DigitalPin.P0) == 0) {
        valor += 1
        basic.showNumber(valor)
        basic.pause(300)  // anti-repetição rápida
    }
    if (pins.digitalReadPin(DigitalPin.P1) == 0) {
        valor -= 1
        basic.showNumber(valor)
        basic.pause(300)
    }
})

🏆 Para ir mais longe