Multi-componente
🚨 Sistema de Alarme Luminoso
🚨 Visão Geral do Sistema
Este projeto combina o LDR (sensor de luz), a campainha piezoelétrica e LEDs para criar um alarme de intrusão por luz: quando alguém entra num espaço escuro e acende a luz (ou abre uma porta), o alarme dispara.
☀️
Deteção (LDR)
Lê luminosidade continuamente. Deteta variações súbitas acima do limiar.
🔔
Alerta (Piezo)
Toca sirene quando ativado. Intensidade e padrão configuráveis.
🔴
Visual (LED)
LED vermelho pisca durante o alarme. Verde = sistema armado e OK.
🔘
Controlo (Botão)
Armar/desarmar o sistema. Confirmar alerta.
🔌 Montagem
P0→ Campainha piezoelétrica (buzzer)
P1→ Divisor LDR (3V→LDR→P1→2.2KΩ→GND)
P2→ Resistência 47Ω → LED vermelho → GND
P3→ Resistência 47Ω → LED verde → GND
GND · 3V→ Linhas de alimentação da breadboard
🎯 Alarme com Limiar Fixo
alarme_simples.js
let LIMIAR = 600 // ajustar conforme ambiente
let armado = false
// Botão A: armar/desarmar
input.onButtonPressed(Button.A, function () {
armado = !armado
if (armado) {
basic.showIcon(IconNames.Lock)
pins.digitalWritePin(DigitalPin.P3, 1) // LED verde ON
} else {
basic.showIcon(IconNames.Unlock)
pins.digitalWritePin(DigitalPin.P3, 0)
pins.digitalWritePin(DigitalPin.P2, 0) // LED vermelho OFF
music.stopAllSounds()
}
})
basic.forever(function () {
if (armado) {
let luz = pins.analogReadPin(AnalogPin.P1)
if (luz > LIMIAR) {
// ALARME!
pins.digitalWritePin(DigitalPin.P2, 1)
pins.digitalWritePin(DigitalPin.P3, 0)
basic.showIcon(IconNames.Angry)
// Sirene
for (let f = 500; f <= 1500; f += 50) {
music.playTone(f, 15)
}
}
}
basic.pause(50)
})
🧠 Limiar Adaptativo
Um alarme com limiar fixo falha se a iluminação ambiente mudar. O limiar adaptativo aprende o nível base de luminosidade e dispara apenas quando há uma mudança súbita.
alarme_adaptativo.js
// Medir luminosidade base ao armar o sistema
let base = 0
let DELTA = 200 // variação mínima para disparar alarme
let armado = false
input.onButtonPressed(Button.A, function () {
armado = !armado
if (armado) {
// Medir média de 10 leituras como base
let soma = 0
for (let i = 0; i < 10; i++) {
soma += pins.analogReadPin(AnalogPin.P1)
basic.pause(50)
}
base = soma / 10
serial.writeValue("base", base)
basic.showIcon(IconNames.Lock)
}
})
basic.forever(function () {
if (armado) {
let atual = pins.analogReadPin(AnalogPin.P1)
if (Math.abs(atual - base) > DELTA) {
basic.showIcon(IconNames.Angry)
pins.digitalWritePin(DigitalPin.P2, 1)
music.playMelody("C5 C5 C5 C5", 800)
}
}
basic.pause(100)
})
🏗️ Sistema Completo
alarme_completo.js
let base = 0, armado = false, em_alarme = false
const DELTA = 150
// Armar com A
input.onButtonPressed(Button.A, function () {
if (!armado) {
basic.showString("3"); basic.pause(1000)
basic.showString("2"); basic.pause(1000)
basic.showString("1"); basic.pause(1000)
// Calibrar base
let soma = 0
for (let i = 0; i < 20; i++) {
soma += pins.analogReadPin(AnalogPin.P1)
basic.pause(50)
}
base = soma / 20
armado = true
em_alarme = false
pins.digitalWritePin(DigitalPin.P3, 1)
basic.showIcon(IconNames.Lock)
}
})
// Desarmar com B
input.onButtonPressed(Button.B, function () {
armado = false
em_alarme = false
music.stopAllSounds()
pins.digitalWritePin(DigitalPin.P2, 0)
pins.digitalWritePin(DigitalPin.P3, 0)
basic.showIcon(IconNames.Unlock)
})
basic.forever(function () {
if (armado && !em_alarme) {
let luz = pins.analogReadPin(AnalogPin.P1)
if (Math.abs(luz - base) > DELTA) {
em_alarme = true
pins.digitalWritePin(DigitalPin.P3, 0)
}
}
if (em_alarme) {
pins.digitalWritePin(DigitalPin.P2, 1)
music.playTone(1000, 100)
basic.pause(50)
pins.digitalWritePin(DigitalPin.P2, 0)
basic.pause(50)
}
basic.pause(20)
})
🏆 Para ir mais longe
- Adiciona um atraso de entrada: o alarme não dispara imediatamente — tens 10s para desarmar
- Implementa um código PIN com os botões A e B: só desarma com a sequência correta (ex: A-A-B-A)
- Usa a rádio do micro:bit para enviar um alerta para outro micro:bit quando o alarme dispara
- Regista na série os últimos 5 momentos em que o alarme disparou (timestamp em segundos)