Nesta página Visão do sistema Montagem Limiar fixo Limiar adaptativo Sistema completo

🚨 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