Multi-componente
🧭 Jogo da Bússola
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
- Adiciona pontuação ao jogo: quanto mais rápido acertas, mais pontos ganhas
- Usa o LED RGB para mostrar a direção por cor: Norte=azul, Este=verde, Sul=vermelho, Oeste=amarelo
- Implementa um "caça ao tesouro": esconde o micro:bit e usa outro micro:bit com rádio para guiar
- Regista as 4 direções cardinais ao longo de um passeio e calcula o percurso total em graus