#include <EEPROM.h>
#include <TimerOne.h>
// پینها
const int sensorPins[3] = {2, 3, 4};
const int remotePins[4] = {6, 7, 8, 9};
const int buzzerPin = 5;
const int ledPin = 13;
// وضعیت سیستم
bool systemArmed = false;
bool silentMode = false;
bool buzzerActive = false;
volatile bool sensorTriggered = false;
unsigned long lastMotionTime = 0;
unsigned long alarmDuration = 20000; // ۲۰ ثانیه
bool remoteLock[4] = {false, false, false, false}; // جلوگیری از تکرار کلید
// تایمر بوق
volatile bool beepRequested = false;
volatile int beepCount = 0;
// EEPROM addresses
#define EEPROM_ADDR_ARMED 0
#define EEPROM_ADDR_SILENT 1
// ---------- تابعها ----------
void saveSystemState() {
EEPROM.write(EEPROM_ADDR_ARMED, systemArmed ? 1 : 0);
EEPROM.write(EEPROM_ADDR_SILENT, silentMode ? 1 : 0);
}
void loadSystemState() {
systemArmed = EEPROM.read(EEPROM_ADDR_ARMED) == 1;
silentMode = EEPROM.read(EEPROM_ADDR_SILENT) == 1;
if (systemArmed) {
digitalWrite(ledPin, HIGH);
Serial.println(systemArmed && silentMode ? "✅ دزدگیر فعال است (حالت سایلنت)" : "✅ دزدگیر فعال است (عادی)");
} else {
digitalWrite(ledPin, LOW);
Serial.println("❌ دزدگیر غیرفعال است");
}
}
void requestBeep(int times) {
if (!beepRequested) {
beepCount = times * 2;
beepRequested = true;
}
}
void timerISR() {
static bool buzzerState = false;
static int intervalCounter = 0;
if (beepRequested && beepCount > 0) {
if (intervalCounter == 0) {
buzzerState = !buzzerState;
digitalWrite(buzzerPin, buzzerState);
if (!buzzerState) {
beepCount--;
if (beepCount == 0) {
beepRequested = false;
}
}
intervalCounter = 2; // سرعت بوقها سریع (هر 200ms)
} else {
intervalCounter--;
}
}
}
void waitButtonRelease(int pin) {
while (digitalRead(pin) == HIGH);
}
void activateAlarm() {
if (!silentMode) {
buzzerActive = true;
digitalWrite(buzzerPin, HIGH);
}
}
// ---------- دستورات ریموت ----------
void handleRemoteCommand(int key) {
switch (key) {
case 0: // فعالسازی (عادی)
if (!systemArmed || silentMode) {
systemArmed = true;
silentMode = false;
sensorTriggered = false;
digitalWrite(ledPin, HIGH);
saveSystemState();
requestBeep(1);
Serial.println("✅ دزدگیر فعال شد (حالت عادی)");
}
break;
case 1: // غیرفعالسازی
if (systemArmed) {
systemArmed = false;
silentMode = false;
buzzerActive = false;
sensorTriggered = false;
digitalWrite(buzzerPin, LOW);
digitalWrite(ledPin, LOW);
saveSystemState();
requestBeep(1);
Serial.println("❌ دزدگیر غیرفعال شد");
}
break;
case 2: // فعالسازی سایلنت مود
if (!systemArmed || !silentMode) {
systemArmed = true;
silentMode = true;
sensorTriggered = false;
digitalWrite(ledPin, HIGH);
saveSystemState();
requestBeep(1);
Serial.println("🔇 دزدگیر فعال شد (حالت سایلنت)");
}
break;
case 3: // فقط قطع آژیر
if (buzzerActive) {
buzzerActive = false;
digitalWrite(buzzerPin, LOW);
requestBeep(1);
Serial.println("🛑 آژیر به صورت دستی قطع شد");
}
break;
}
}
// ---------- برنامه اصلی ----------
void setup() {
Serial.begin(9600);
Serial.println("🛡️ سیستم دزدگیر راهاندازی شد");
for (int i = 0; i < 3; i++) pinMode(sensorPins[i], INPUT);
for (int i = 0; i < 4; i++) pinMode(remotePins[i], INPUT);
pinMode(buzzerPin, OUTPUT);
pinMode(ledPin, OUTPUT);
Timer1.initialize(100000);
Timer1.attachInterrupt(timerISR);
loadSystemState(); // ← بازیابی حالت دزدگیر از EEPROM
}
void loop() {
// ریموت کنترل
for (int i = 0; i < 4; i++) {
if (digitalRead(remotePins[i]) == HIGH && !remoteLock[i]) {
handleRemoteCommand(i);
remoteLock[i] = true;
} else if (digitalRead(remotePins[i]) == LOW && remoteLock[i]) {
remoteLock[i] = false;
}
}
// بررسی حسگرها
if (systemArmed) {
for (int i = 0; i < 3; i++) {
if (digitalRead(sensorPins[i]) == HIGH) {
sensorTriggered = true;
lastMotionTime = millis();
activateAlarm();
Serial.print("🚨 حرکت شناسایی شده توسط سنسور ");
Serial.println(i + 1);
}
}
}
// خاموشی خودکار آژیر بعد از ۲۰ ثانیه
if (buzzerActive && millis() - lastMotionTime > alarmDuration) {
buzzerActive = false;
digitalWrite(buzzerPin, LOW);
Serial.println("🔕 آژیر به صورت خودکار پس از ۲۰ ثانیه خاموش شد");
}
}