Nesta página A bússola do micro:bit Calibrar a bússola Ler ângulo de direção Jogo: encontrar o Norte Indicação com LEDs

🧭 A Bússola Integrada

O micro:bit V2 inclui um magnetómetro que mede o campo magnético terrestre. A função input.compassHeading() devolve o ângulo de orientação em graus (0–359°), sendo 0° = Norte.

Norte
0°
Magnetic North
Este
90°
East
Sul
180°
South
Oeste
270°
West
⚠️ Afasta objetos metálicos e magnetos A bússola é muito sensível a interferências. Mantém o micro:bit afastado de auscultadores, altifalantes, cabos USB e outros objetos metálicos durante a medição.

🔄 Calibrar a Bússola

Antes do primeiro uso (ou após reiniciar), o micro:bit pede calibração. Segue as instruções no ecrã — normalmente inclinar o micro:bit para fazer o ponto percorrer a borda da matriz LED.

calibrar_bussola.js
// A calibração inicia automaticamente ao chamar compassHeading()
// pela primeira vez. Podes forçar com:
input.calibrateCompass()

// Após calibração, mostrar ângulo em tempo real
basic.forever(function () {
    let angulo = input.compassHeading()
    serial.writeValue("heading", angulo)
    basic.showNumber(angulo)
    basic.pause(500)
})

📍 Mostrar Direção Cardinal

bussola_cardinal.js
// Mostrar seta com direção cardinal na matriz LED
basic.forever(function () {
    let h = input.compassHeading()

    if ((h >= 337 || h < 23)) {
        basic.showArrow(ArrowNames.North)
        basic.showString("N")
    } else if (h >= 23 && h < 67) {
        basic.showArrow(ArrowNames.NorthEast)
    } else if (h >= 67 && h < 113) {
        basic.showArrow(ArrowNames.East)
        basic.showString("E")
    } else if (h >= 113 && h < 157) {
        basic.showArrow(ArrowNames.SouthEast)
    } else if (h >= 157 && h < 203) {
        basic.showArrow(ArrowNames.South)
        basic.showString("S")
    } else if (h >= 203 && h < 247) {
        basic.showArrow(ArrowNames.SouthWest)
    } else if (h >= 247 && h < 293) {
        basic.showArrow(ArrowNames.West)
        basic.showString("O")
    } else {
        basic.showArrow(ArrowNames.NorthWest)
    }
    basic.pause(300)
})

🎮 Jogo: Encontrar o Norte

jogo_bussola.js
// Jogo: o micro:bit gera um ângulo alvo aleatório
// O jogador roda até apontar para esse ângulo (±15°)

let alvo = Math.randomRange(0, 359)
basic.showNumber(alvo)
basic.pause(2000)
basic.showString("VAI!")

let encontrado = false
basic.forever(function () {
    if (!encontrado) {
        let atual = input.compassHeading()
        let diff = Math.abs(atual - alvo)
        // Tratar a diferença circular (ex: 350° vs 10° = 20° diff)
        if (diff > 180) diff = 360 - diff

        if (diff < 15) {
            // Acertou!
            music.playMelody("C5 E5 G5 C6", 120)
            basic.showIcon(IconNames.Happy)
            encontrado = true
        } else {
            // Mostrar "quente/frio" com LEDs
            if (diff < 45) {
                pins.digitalWritePin(DigitalPin.P0, 1)  // LED verde: quente
                pins.digitalWritePin(DigitalPin.P1, 0)
            } else {
                pins.digitalWritePin(DigitalPin.P0, 0)
                pins.digitalWritePin(DigitalPin.P1, 1)  // LED vermelho: frio
            }
        }
    }
    basic.pause(100)
})

💡 Indicação com LEDs Coloridos

leds_bussola.js
// 4 LEDs indicam N/S/E/O
// P0=vermelho(N), P1=verde(E), P2=amarelo(S), P3=laranja(O)

basic.forever(function () {
    let h = input.compassHeading()

    pins.digitalWritePin(DigitalPin.P0, (h >= 315 || h < 45) ? 1 : 0)   // N
    pins.digitalWritePin(DigitalPin.P1, (h >= 45 && h < 135) ? 1 : 0)   // E
    pins.digitalWritePin(DigitalPin.P2, (h >= 135 && h < 225) ? 1 : 0)  // S
    pins.digitalWritePin(DigitalPin.P3, (h >= 225 && h < 315) ? 1 : 0)  // O
    basic.pause(100)
})

🏆 Para ir mais longe