#define WIRE_PIN 3
#define ARM_BTN 4
#define DISARM_BTN 5
#define SILENCE_BTN 6
#define BUZZER_PIN 2
#define LED_ARMED 10
#define LED_DISARMED 11
#define LED_ALARM 12
bool armed = false;
bool alarmTriggered = false;
bool silenced = false;
/* debounce */
unsigned long lastBtnTime = 0;
const unsigned long debounceDelay = 50;
/* alarm tone */
unsigned long lastToneTime = 0;
unsigned long lastLedBlink = 0;
const unsigned long toneInterval = 400;
const unsigned long ledBlinkInterval = 500;
bool toneState = false;
bool ledState = false;
void setup() {
pinMode(WIRE_PIN, INPUT_PULLUP);
pinMode(ARM_BTN, INPUT_PULLUP);
pinMode(DISARM_BTN, INPUT_PULLUP);
pinMode(SILENCE_BTN, INPUT_PULLUP);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(LED_ARMED, OUTPUT);
pinMode(LED_DISARMED, OUTPUT);
pinMode(LED_ALARM, OUTPUT);
noTone(BUZZER_PIN);
}
void loop() {
handleButtons();
monitorWire();
alarmSound();
updateLEDs();
}
/* ---------------- BUTTON HANDLER ---------------- */
void handleButtons() {
if (millis() - lastBtnTime < debounceDelay) return;
if (digitalRead(ARM_BTN) == LOW) {
armed = true;
alarmTriggered = false;
silenced = false;
noTone(BUZZER_PIN);
lastBtnTime = millis();
}
if (digitalRead(DISARM_BTN) == LOW) {
armed = false;
alarmTriggered = false;
silenced = false;
noTone(BUZZER_PIN);
lastBtnTime = millis();
}
if (digitalRead(SILENCE_BTN) == LOW) {
if (alarmTriggered) {
silenced = true;
noTone(BUZZER_PIN);
}
lastBtnTime = millis();
}
}
/* ---------------- WIRE MONITOR ---------------- */
void monitorWire() {
if (!armed || alarmTriggered) return;
if (digitalRead(WIRE_PIN) == HIGH) {
alarmTriggered = true;
}
}
/* ---------------- BUZZER ---------------- */
void alarmSound() {
if (!alarmTriggered || silenced) return;
if (millis() - lastToneTime >= toneInterval) {
lastToneTime = millis();
toneState = !toneState;
tone(BUZZER_PIN, toneState ? 220 : 380);
}
}
/* ---------------- LED CONTROL ---------------- */
void updateLEDs() {
// default OFF
digitalWrite(LED_ARMED, LOW);
digitalWrite(LED_DISARMED, LOW);
digitalWrite(LED_ALARM, LOW);
if (!armed) {
digitalWrite(LED_DISARMED, HIGH);
return;
}
if (armed && !alarmTriggered) {
digitalWrite(LED_ARMED, HIGH);
return;
}
if (alarmTriggered) {
if (silenced) {
digitalWrite(LED_ALARM, HIGH);
} else {
if (millis() - lastLedBlink >= ledBlinkInterval) {
lastLedBlink = millis();
ledState = !ledState;
}
digitalWrite(LED_ALARM, ledState);
}
}
}