/*
Sistema de Alarme com Sensor de Movimento (PIR), LED, Buzzer
e Botão para Ativar/Desativar.
Conexões baseadas na imagem:
- Sensor PIR: Pino D13
- LED: Pino D19
- Buzzer: Pino D4
- Botão: Pino D2 (com INPUT_PULLUP)
*/
// --- Pinos ---
const int pinoSensor = 13;
const int pinoLed = 19;
const int pinoBuzzer = 4;
const int pinoBotao = 2;
// --- Configurações do Alarme ---
const int frequenciaAlarme = 800; // Frequência do som (em Hz)
// --- Variáveis de Controle ---
bool sistemaAtivado = false; // Começa com o sistema desligado
// Variáveis para o debounce do botão (evitar múltiplas leituras)
unsigned long tempoUltimoPress = 0;
const long tempoDebounce = 250; // Intervalo mínimo entre pressões (em ms)
void setup() {
Serial.begin(115200);
Serial.println("Sistema de Alarme pronto. Pressione o botao para ativar.");
// Configura os pinos de saída (LED e Buzzer)
pinMode(pinoLed, OUTPUT);
pinMode(pinoBuzzer, OUTPUT);
// Configura o pino do sensor como entrada
pinMode(pinoSensor, INPUT);
// Configura o pino do botão com resistor de pull-up interno
pinMode(pinoBotao, INPUT_PULLUP);
}
void loop() {
// 1. LÓGICA PARA LER O BOTÃO E MUDAR O ESTADO DO SISTEMA
// -----------------------------------------------------------
// Lê o estado atual do botão. LOW significa que está pressionado.
if (digitalRead(pinoBotao) == LOW) {
// Verifica se já passou tempo suficiente desde a última vez que o botão foi pressionado
if ((millis() - tempoUltimoPress) > tempoDebounce) {
// Inverte o estado do sistema (a "mágica" do toggle)
sistemaAtivado = !sistemaAtivado;
// Imprime o novo estado no monitor serial
if (sistemaAtivado) {
Serial.println("--- SISTEMA ATIVADO ---");
} else {
Serial.println("--- SISTEMA DESATIVADO ---");
// Garante que o alarme pare imediatamente ao desativar
digitalWrite(pinoLed, LOW);
noTone(pinoBuzzer);
}
// Atualiza o tempo em que o botão foi pressionado
tempoUltimoPress = millis();
}
}
// 2. LÓGICA DO ALARME (SÓ EXECUTA SE O SISTEMA ESTIVER ATIVADO)
// ----------------------------------------------------------------
if (sistemaAtivado) {
// Lê o estado do sensor de movimento
int estadoSensor = digitalRead(pinoSensor);
if (estadoSensor == HIGH) {
// Movimento detectado: aciona o alarme
Serial.println("ALERTA: Movimento detectado!");
digitalWrite(pinoLed, HIGH);
tone(pinoBuzzer, frequenciaAlarme);
} else {
// Nenhum movimento: desliga o alarme
digitalWrite(pinoLed, LOW);
noTone(pinoBuzzer);
}
}
// Pequena pausa para estabilidade
delay(50);
}