#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 ledArmedPin = 10;
const int ledDisarmedPin = 11;
const int ledSilentPin = 12;
const int ledSensorPins[3] = {A0, A1, A2};
// پینهای باتری بکاپ
const int batteryRelayPin = A5; // رله شارژ باتری
const int batteryAnalogPin = A3; // ورودی ولتاژ باتری
// ولتاژهای مرزی شارژ
const float batteryStartCharge = 12.4;
const float batteryStopCharge = 12.8;
// وضعیت سیستم
bool systemArmed = false;
bool silentMode = false;
bool buzzerActive = false;
volatile bool sensorTriggered = false;
bool sensorLatched[3] = {false, false, false};
bool remoteLock[4] = {false, false, false, false};
unsigned long lastMotionTime = 0;
unsigned long alarmDuration = 20000;
// تایمر بوق
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;
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 activateAlarm() {
if (!silentMode) {
buzzerActive = true;
digitalWrite(buzzerPin, HIGH);
}
}
void updateStatusLEDs() {
digitalWrite(ledArmedPin, systemArmed && !silentMode);
digitalWrite(ledSilentPin, systemArmed && silentMode);
digitalWrite(ledDisarmedPin, !systemArmed);
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();
saveSystemState();
requestBeep(1);
Serial.println("✅ دزدگیر فعال شد (عادی)");
}
break;
case 1:
if (systemArmed) {
systemArmed = false;
silentMode = false;
buzzerActive = false;
sensorTriggered = false;
digitalWrite(buzzerPin, LOW);
saveSystemState();
requestBeep(1);
Serial.println("❌ دزدگیر غیرفعال شد");
}
break;
case 2:
if (!systemArmed || !silentMode) {
systemArmed = true;
silentMode = true;
sensorTriggered = false;
resetSensorLEDs();
saveSystemState();
requestBeep(1);
Serial.println("🔇 دزدگیر فعال شد (سایلنت)");
}
break;
case 3:
if (buzzerActive) {
buzzerActive = false;
digitalWrite(buzzerPin, LOW);
requestBeep(1);
Serial.println("🛑 آژیر به صورت دستی قطع شد");
}
break;
}
updateStatusLEDs();
}
// ---------- setup ----------
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(ledArmedPin, OUTPUT);
pinMode(ledDisarmedPin, OUTPUT);
pinMode(ledSilentPin, OUTPUT);
for (int i = 0; i < 3; i++) pinMode(ledSensorPins[i], OUTPUT);
pinMode(batteryRelayPin, OUTPUT);
digitalWrite(batteryRelayPin, LOW); // شارژ قطع در شروع
Timer1.initialize(100000);
Timer1.attachInterrupt(timerISR);
loadSystemState();
updateStatusLEDs();
}
// ---------- loop ----------
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("🔕 آژیر به صورت خودکار خاموش شد");
}
// --- کنترل شارژ باتری با هیسترزیس ---
static bool isCharging = false; // وضعیت فعلی شارژ
int rawBattery = analogRead(batteryAnalogPin);
float voltageBattery = (rawBattery * 5.0 / 1023.0) * 2.6;
// فعالسازی شارژ وقتی باتری زیر 12.4 بیاد
if (!isCharging && voltageBattery < 12.4) {
digitalWrite(batteryRelayPin, HIGH);
isCharging = true;
Serial.println("🔋 شارژ باتری فعال شد");
}
// قطع شارژ وقتی ولتاژ به 12.6 یا بیشتر رسید
else if (isCharging && voltageBattery >= 12.6) {
digitalWrite(batteryRelayPin, LOW);
isCharging = false;
Serial.println("✅ شارژ باتری قطع شد");
}
}