#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; // LED اصلی
// LEDهای وضعیت
const int ledArmedPin = 10;
const int ledDisarmedPin = 11;
const int ledSilentPin = 12;
const int ledSensorPins[3] = {A0, A1, A2};
// وضعیت سیستم
bool systemArmed = false;
bool silentMode = false;
bool buzzerActive = false;
volatile bool sensorTriggered = false;
bool sensorLatched[3] = {false, false, 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;
digitalWrite(ledPin, systemArmed ? HIGH : LOW);
Serial.println(systemArmed ? (silentMode ? "✅ دزدگیر فعال است (سایلنت)" : "✅ دزدگیر فعال است") : "❌ دزدگیر غیرفعال است");
}
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; // بوق سریع
} else {
intervalCounter--;
}
}
}
void waitButtonRelease(int pin) {
while (digitalRead(pin) == HIGH);
}
void activateAlarm() {
if (!silentMode) {
buzzerActive = true;
digitalWrite(buzzerPin, HIGH);
}
}
void updateStatusLEDs() {
if (systemArmed) {
if (silentMode) {
digitalWrite(ledArmedPin, LOW);
digitalWrite(ledSilentPin, HIGH);
} else {
digitalWrite(ledArmedPin, HIGH);
digitalWrite(ledSilentPin, LOW);
}
digitalWrite(ledDisarmedPin, LOW);
} else {
digitalWrite(ledArmedPin, LOW);
digitalWrite(ledSilentPin, LOW);
digitalWrite(ledDisarmedPin, HIGH);
}
for (int i = 0; i < 3; i++) {
digitalWrite(ledSensorPins[i], sensorLatched[i] ? HIGH : LOW);
}
}
void resetSensorLEDs() {
for (int i = 0; i < 3; i++) {
sensorLatched[i] = false;
digitalWrite(ledSensorPins[i], LOW);
}
}
// ---------- دستورات ریموت ----------
void handleRemoteCommand(int key) {
switch (key) {
case 0: // فعالسازی عادی
if (!systemArmed || silentMode) {
systemArmed = true;
silentMode = false;
sensorTriggered = false;
resetSensorLEDs();
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;
resetSensorLEDs();
digitalWrite(ledPin, HIGH);
saveSystemState();
requestBeep(1);
Serial.println("🔇 دزدگیر فعال شد (سایلنت)");
}
break;
case 3: // فقط قطع آژیر
if (buzzerActive) {
buzzerActive = false;
digitalWrite(buzzerPin, LOW);
requestBeep(1);
Serial.println("🛑 آژیر به صورت دستی قطع شد");
}
break;
}
updateStatusLEDs();
}
// ---------- برنامه اصلی ----------
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);
pinMode(ledArmedPin, OUTPUT);
pinMode(ledDisarmedPin, OUTPUT);
pinMode(ledSilentPin, OUTPUT);
for (int i = 0; i < 3; i++) {
pinMode(ledSensorPins[i], OUTPUT);
digitalWrite(ledSensorPins[i], LOW);
}
Timer1.initialize(100000);
Timer1.attachInterrupt(timerISR);
loadSystemState();
updateStatusLEDs();
}
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();
if (!sensorLatched[i]) {
sensorLatched[i] = true;
Serial.print("🚨 حرکت شناسایی شده توسط سنسور ");
Serial.println(i + 1);
updateStatusLEDs();
}
}
}
}
// خاموشی خودکار آژیر
if (buzzerActive && millis() - lastMotionTime > alarmDuration) {
buzzerActive = false;
digitalWrite(buzzerPin, LOW);
Serial.println("🔕 آژیر به صورت خودکار خاموش شد");
}
}