#include <SoftwareSerial.h>
#include <EEPROM.h>
SoftwareSerial sim800(10, 11); // RX, TX
// تعریف ثابتها
const int sensorPin = 2; // وصل شده به پین دیجیتال 2 برای سنسور لرزش
const int doorPin = 3; // وصل شده به پین دیجیتال 3 برای دربهای پولدانه
const int remotePin1 = 4; // وصل شده به پین دیجیتال 4 برای ورودی ریموت کنترل 1
const int remotePin2 = 5; // وصل شده به پین دیجیتال 5 برای ورودی ریموت کنترل 2
const int remotePin3 = 6; // وصل شده به پین دیجیتال 6 برای ورودی ریموت کنترل 3
const int pumpRelayPin = 9; // وصل شده به پین دیجیتال 9 برای رله پمپ بنزین
const int switchPowerPin = 8; // وصل شده به پین دیجیتال 8 برای برق سویچ
const String phoneNumber = "+989188897790"; // شماره تلفن مقصد
const int lockPin = 12; // وصل شده به پین دیجیتال 12 برای کنترل قفل دربها
const int BuzzerPin = 13; // پین بوزر
const int EEPROM_ADDRESS = 0; // آدرس شروع EEPROM برای ذخیره سازی وضعیت
// تعریف وضعیتها با enum
enum AlarmState { INACTIVE, ACTIVE };
// متغیرهای وضعیت
AlarmState alarmState = INACTIVE;
unsigned long alarmStartTime = 0;
unsigned long lastResetTime = 0; // متغیر برای زمان آخرین بازنشانی
unsigned long myNumber = 123456789UL; // مثالی از یک unsigned long
unsigned long switchOffTime = 0; // زمانی که سوییچ خاموش شد
unsigned long switchOpenTime = 0; // زمانی که سوییچ دوباره باز شد
void setAlarmState(AlarmState newState) {
alarmState = newState;
}
void setup() {
// تنظیمات اولیه
pinMode(sensorPin, INPUT); // تنظیم پین به عنوان ورودی برای سنسور لرزش
pinMode(doorPin, INPUT); // تنظیم پین به عنوان ورودی برای دربهای پولدانه
pinMode(remotePin1, INPUT);// تنظیم پین به عنوان ورودی با مقاومت Pull-Up برای ریموت کنترل 1
pinMode(remotePin2, INPUT);// تنظیم پین به عنوان ورودی با مقاومت Pull-Up برای ریموت کنترل 2
pinMode(remotePin3, INPUT);// تنظیم پین به عنوان ورودی با مقاومت Pull-Up برای ریموت کنترل 3
pinMode(pumpRelayPin, OUTPUT); // تنظیم پین به عنوان خروجی برای رله پمپ بنزین
pinMode(switchPowerPin, INPUT); // تنظیم پین به عنوان ورودی با مقاومت Pull-Up برای برق سویچ
pinMode(lockPin, OUTPUT); // تنظیم پین به عنوان خروجی برای کنترل قفل دربها
pinMode(BuzzerPin, OUTPUT); // تنظیم پین به عنوان خروجی برای بوزر
Serial.begin(9600); // شروع ارتباط با سریال
sim800.begin(9600); // شروع ارتباط با ماژول سیم
delay(1000); // تاخیر برای استقرار ارتباط
}
void loop() {
// خواندن وضعیتهای ورودی
bool sensorState = digitalRead(sensorPin);
bool doorState = digitalRead(doorPin);
bool remote1State = digitalRead(remotePin1);
bool remote2State = digitalRead(remotePin2);
bool remote3State = digitalRead(remotePin3);
bool switchPowerState = digitalRead(switchPowerPin);
int switchState = digitalRead(switchPowerPin); // خواندن وضعیت فعلی سوییچ
// بررسی وضعیتهای ریموت کنترل و تغییر وضعیت دزدگیر
if (remote1State == HIGH) {
alarmState = ACTIVE;
Serial.println("دزدگیر فعال شد!");
delay(300);
} else if (remote2State == HIGH) {
alarmState = INACTIVE;
Serial.println("دزدگیر غیر فعال شد!");
delay(300);
}
// بررسی وضعیت دزدگیر قبل از الارم زدن
if (alarmState == ACTIVE && (sensorState == HIGH || doorState == LOW)) {
digitalWrite(BuzzerPin, HIGH);
delay(300);
Serial.println("الارم فعال شد!");
alarmStartTime = millis();
sendSMS(phoneNumber, "الارم فعال شد!");
}
// بررسی وضعیت ورودی سوم و خاموش کردن بوزر در صورت لزوم
if (remote3State == HIGH && digitalRead(BuzzerPin) == HIGH) {
Serial.println("الارم غیرفعال شد!");
digitalWrite(BuzzerPin, LOW);
delay(300);
}
// بررسی وضعیتهای سوچ خودرو و تغییر وضعیت دزدگیر
if (switchState == HIGH) { // اگر سوییچ خاموش شد
switchOffTime = millis(); // زمان خاموش شدن سوییچ را ذخیره کنید
}
if (switchState == LOW && (millis() - switchOffTime >= 10000)) { // اگر ال ای دی خاموش است و از 30 ثانیه گذشته است
setAlarmState(INACTIVE);
sendSMS(phoneNumber, "دزدگیر فعال شد!");
Serial.println("دزدگیر فعال شد!");
}
if (switchOpenTime - switchOffTime < 10000) { // اگر از زمانی که سوییچ خاموش شد، کمتر از 30 ثانیه گذشته باشد
setAlarmState(INACTIVE);
}
// بررسی وضعیت دزدگیر و کنترل رله پمپ بنزین
if (alarmState == ACTIVE) {
digitalWrite(pumpRelayPin, HIGH);
} else {
digitalWrite(pumpRelayPin, LOW);
}
// بررسی دریافت پیامک "فعال" و "غیرفعال"
if (receiveSMS("فعال")) {
setAlarmState(ACTIVE);
sendSMS(phoneNumber, "دزدگیر فعال شد!");
}
else if (receiveSMS("غیرفعال")) {
setAlarmState(INACTIVE);
sendSMS(phoneNumber, "دزدگیر غیرفعال شد!");
}
// بررسی وضعیت ارسال پیامک
checkSMS();
}
// تابع ارسال پیامک
void sendSMS(String phoneNumber, String message) {
sim800.println("AT+CMGF=1");
delay(100);
sim800.print("AT+CMGS=\"");
sim800.print(phoneNumber);
sim800.println("\"");
delay(100);
sim800.print(message);
delay(100);
sim800.println((char)26);
delay(1000);
}
// تابع بررسی پیامکها
void checkSMS() {
if (sim800.available()) {
String message = sim800.readString();
if (message.indexOf("وضعیت") != -1) {
sendSMS(phoneNumber, "وضعیت دزدگیر: " + String(alarmState == ACTIVE ? "فعال" : "غیرفعال"));
} else if (message.indexOf("فعال") != -1) {
alarmState = ACTIVE;
} else if (message.indexOf("غیرفعال") != -1) {
alarmState = INACTIVE;
}
}
}
bool receiveSMS(String command) {
if (sim800.available()) {
String message = sim800.readString();
if (message.indexOf(command) != -1) {
return true;
}
}
return false;
}
// تابع برای بازنشانی زمان میلیثانیه
void resetMillis() {
lastResetTime = millis();
}
// تابع برای بررسی و بازنشانی زمان میلیثانیه
void checkAndResetMillis() {
if (millis() - lastResetTime >= 1000) {
// اگر زمان گذشته از یک ثانیه بیشتر بود، زمان را بازنشانی کنید
resetMillis();
}
}