#include <SoftwareSerial.h> // اضافه کردن کتابخانه برای ارتباط سریال نرمافزاری
#include <avr/wdt.h> // اضافه کردن کتابخانه برای Watchdog Timer
#include <TinyGPS++.h> // اضافه کردن کتابخانه GPS
SoftwareSerial sim800(0, 1); // تعریف پورت سریال نرمافزاری برای ماژول SIM800 (پینهای 0 و 1)
SoftwareSerial gpsSerial(2, 3); // تعریف پورت سریال نرمافزاری برای GPS (پینهای 2 و 3)
TinyGPSPlus gps; // ایجاد شیء GPS
// تعریف ثابتها برای پینها
const int pumpRelayPin = 4; // پین رله پمپ
const int lockPin = 5; // پین قفل دربها
const int buzzerPin = 13; // پین بوزر
const int openPin = 6; // پین باز کردن دربها
const int rightWindowLifter = 7; // پین شیشه بالابر سمت راست
const int rightWindowEncoder = 8; // پین انکودر شیشه بالابر سمت راست
const int leftWindowLifter = 9; // پین شیشه بالابر سمت چپ
const int leftWindowEncoder = 10; // پین انکودر شیشه بالابر سمت چپ
const int voltageSensorPin = A4; // پین سنسور ولتاژ
const int indicatorlight = 11; // پین چراغ راهنما
const int alarmStarlight = 12; // پین چشمک زن دزدگیر
// پینهای 74HC165
const int dataPin = A0; // پین Q7 (Pin 1)
const int clockPin = A1; // پین CP (Pin 2)
const int latchPin = A2; // پین CE (Pin 3)
const int loadPin = A3; // پین SH/LD (Pin 15)
// معرفی ورودیهایی که به 74HC165 متصل هستند
const int shockSensorPin = 0; // پین سنسور لرزش
const int doorPin = 1; // پین درب
const int remotePin1 = 2; // پین ریموت کنترل 1
const int remotePin2 = 3; // پین ریموت کنترل 2
const int remotePin3 = 4; // پین ریموت کنترل 3
const int remotePin4 = 5; // پین ریموت کنترل 4
const int switchPowerPin = 6; // پین برق سوئیچ
const int extraSensorPin = 7; // پین سنسور اضافی (در صورت نیاز)
const String phoneNumber = "+0000000000000"; // شماره تلفن مقصد
// تعریف وضعیتها با استفاده از enum
enum AlarmState { INACTIVE, ACTIVE, ACTIVE_SILENT };
// متغیرهای وضعیت
AlarmState alarmState = INACTIVE; // وضعیت اولیه دزدگیر (غیرفعال)
unsigned long alarmStartTime = 0; // زمان شروع دزدگیر
unsigned long switchOffTime = 0; // زمان خاموش شدن سوئیچ
unsigned long previousVoltageTime = 0; // زمان قبلی برای هشدار ولتاژ پایین
unsigned long indicatorlightTime = 0; // زمان چراغ راهنما
unsigned long lastStatusSMS = 0; // زمان آخرین ارسال پیامک وضعیت
unsigned long rightWindowLifterTime = 0 ;// متغیر زمان برای شیشه بالابر راست
unsigned long leftWindowLifterTime = 0 ;// متغیر زمان برای شیشه بالابر چپ
const float voltageThreshold = 11.0; // حداقل ولتاژ مجاز
bool lockPinState = false; // وضعیت قفل پین
bool switchPower2State = false; // وضعیت برق سوئیچ
bool ActiveBuzzer = false; // وضعیت بوزر
bool switchPower3State = false; // وضعیت برق سوئیچ دوم
bool rightWindowEncoderState = false; // وضعیت انکودر شیشه بالابر سمت راست
bool leftWindowEncoderState = false; // وضعیت انکودر شیشه بالابر سمت چپ
bool voltageBuzzerState = false; // وضعیت بازر ولتاز
bool doorPinState = false; // وضعیت درب ها
bool shockSensorPinState = false; // وضعیت سنسور های لرزش
bool switchPower4State = false; // وضعیت برق سویچ سوم
// تنظیمات اولیه
void setup() {
// تنظیم پینها به عنوان ورودی یا خروجی
pinMode(pumpRelayPin, OUTPUT); // تنظیم پین رله پمپ به عنوان خروجی
pinMode(lockPin, OUTPUT); // تنظیم پین قفل دربها به عنوان خروجی
pinMode(buzzerPin, OUTPUT); // تنظیم پین بوزر به عنوان خروجی
pinMode(openPin, OUTPUT); // تنظیم پین باز کردن دربها به عنوان خروجی
pinMode(leftWindowLifter, OUTPUT); // پین شیشه بالابر سمت چپ
pinMode(leftWindowEncoder, INPUT); // پین انکودر شیشه بالابر سمت چپ
pinMode(rightWindowLifter, OUTPUT); // پین شیشه بالابر سمت راست
pinMode(rightWindowEncoder, INPUT); // پین انکودر شیشه بالابر سمت راست
pinMode(indicatorlight, OUTPUT); // تنظیم پین چراغ راهنما به عنوان خروجی
pinMode(alarmStarlight, OUTPUT); // تنظیم پین چشمک زن دزدگیر به عنوان خروجی
// تنظیم پینهای 74HC165
pinMode(dataPin, INPUT);
pinMode(clockPin, OUTPUT);
pinMode(latchPin, OUTPUT);
pinMode(loadPin, OUTPUT);
Serial.begin(9600); // شروع ارتباط سریال با نرخ 9600
sim800.begin(9600); // شروع ارتباط سریال با ماژول SIM800
Serial.available();
gpsSerial.begin(9600); // شروع ارتباط سریال با ماژول GPS
delay(1000); // تاخیر برای اطمینان از پایداری ارتباط
wdt_enable(WDTO_8S); // فعال کردن Watchdog Timer با تایمر 4 ثانیه
// تنظیم ماژول SIM800
sim800.println("AT"); // ارسال دستور AT برای اطمینان از ارتباط با ماژول
delay(1000); // تاخیر برای اطمینان از دریافت و پردازش دستور
sim800.println("AT+CLIP=1"); // فعالسازی Caller ID
delay(1000); // تاخیر برای اطمینان از دریافت و پردازش دستور
sim800.println("AT+CSCS=\"GSM\""); // تنظیم کاراکتر ست
delay(1000); // تاخیر برای اطمینان از دریافت و پردازش دستور
sim800.println("AT+CMGF=1"); // تنظیم ماژول به حالت متن
delay(1000); // تاخیر برای اطمینان از دریافت و پردازش دستور
sim800.println("AT+CLCC=1"); // فعالسازی گزارش تماس
delay(1000); // تاخیر برای اطمینان از دریافت و پردازش دستور
}
// تابع خواندن ورودیها
void readInputs(
bool &shockSensorState, // تابع سنسور ظربه درب ها
bool &doorState, // تابع سنسور درب ها
bool &remote1State, // تابع پین ریموت کنترل 1
bool &remote2State, // تابع پین ریموت کنترل 2
bool &remote3State, // تابع پین ریموت کنترل 3
bool &remote4State, // تابع پین ریموت کنترل 4
bool &switchPowerState, // تابع سویچ
int &sensorValue // تابع سسنسور ولتاژ ورودی
){
uint8_t inputStates = read74HC165();
shockSensorState = bitRead(inputStates, 0); // خواندن وضعیت سنسور
doorState = bitRead(inputStates, 1); // خواندن وضعیت درب
remote1State = bitRead(inputStates, 2); // خواندن وضعیت ریموت کنترل 1
remote2State = bitRead(inputStates, 3); // خواندن وضعیت ریموت کنترل 2
remote3State = bitRead(inputStates, 4); // خواندن وضعیت ریموت کنترل 3
remote4State = bitRead(inputStates, 5); // خواندن وضعیت ریموت کنترل 4
switchPowerState = bitRead(inputStates, 6); // خواندن وضعیت سوئیچ
sensorValue = analogRead(voltageSensorPin); // خواندن ولتاژ سنسور
}
// تابع خواندن ورودیها از 74HC165
uint8_t read74HC165() {
uint8_t value = 0;
digitalWrite(loadPin, LOW);
delayMicroseconds(5);
digitalWrite(loadPin, HIGH);
delayMicroseconds(5);
for (int i = 0; i < 8; i++) {
value |= digitalRead(dataPin) << i;
digitalWrite(clockPin, HIGH);
delayMicroseconds(5);
digitalWrite(clockPin, LOW);
delayMicroseconds(5);
}
return value;
}
// تابع تنظیم وضعیت دزدگیر
void setAlarmState(AlarmState newState) {
alarmState = newState; // تنظیم وضعیت جدید برای دزدگیر
}
// تابع ارسال پیامک
void sendSMS(String phoneNumber, String message) {
sim800.println("AT+CMGF=1"); // تنظیم ماژول SIM800 به حالت متن
delay(100);
sim800.print("AT+CMGS=\""); // شروع ارسال پیامک
sim800.print(phoneNumber); // شماره تلفن مقصد
sim800.println("\"");
delay(100);
sim800.print(message); // متن پیامک
delay(100);
sim800.println((char)26); // پایان ارسال پیامک
delay(1000);
}
// تابع بررسی دریافت پیامک
bool receiveSMS(String command) {
if (sim800.available()) { // بررسی در دسترس بودن پیامک
String message = sim800.readString(); // خواندن پیامک دریافتی
return (message.indexOf(command) != -1); // بررسی وجود دستور مورد نظر در پیامک
}
return false;
}
// تابع بررسی پیامکها
void checkSMS() {
if (sim800.available()) { // بررسی در دسترس بودن پیامک
String message = sim800.readString(); // خواندن پیامک دریافتی
if (message.indexOf("وضعیت") != -1) {
String statusMessage = "وضعیت دزدگیر: ";
if (alarmState == ACTIVE) {
statusMessage += "فعال";
} else if (alarmState == INACTIVE) {
statusMessage += "غیرفعال";
} else if (alarmState == ACTIVE_SILENT) {
statusMessage += "فعال (سایلنت)";
}
sendSMS(phoneNumber, statusMessage); // ارسال وضعیت دزدگیر
}
}
}
// بررسی پیامکهای دریافتی
void checreceiveSMS() {
if (receiveSMS("فعال") ) {
checkactivealarmState();
sendSMS(phoneNumber, "دزدگیر فعال شد!"); // ارسال پیامک
} else if (receiveSMS("غیرفعال") ) {
checkiactinvealarmState();
sendSMS(phoneNumber, "دزدگیر غیرفعال شد!"); // ارسال پیامک
}else if (receiveSMS("سایلنت") ) {
checkactivesilentalarmState();
sendSMS(phoneNumber, "دزدگیر حالت سایلنت فعال شد!"); // ارسال پیامک
}
}
// تابع دریافت موقعیت مکانی از GPS
String getGPSLocation() {
String location = "";
if (gps.location.isValid()) { // بررسی معتبر بودن موقعیت مکانی
location += "Lat: " + String(gps.location.lat(), 6); // دریافت عرض جغرافیایی
location += ", Lon: " + String(gps.location.lng(), 6); // دریافت طول جغرافیایی
} else {
location = "موقعیت مکانی نامعتبر"; // پیام در صورت نامعتبر بودن موقعیت مکانی
}
return location;
}
// تابع برسی وضعیت فعال دزدگیرخودرو
void checkactivealarmState() {
alarmState = ACTIVE; // فعال کردن دزدگیر
switchPower2State = true; // تنظیم وضعیت برق سوئیچ
switchPower3State = false; // تنظیم وضعیت برق سوئیچ دوم
ActiveBuzzer = false; // غیر فعال کردن بوزر
shockSensorPinState = false; // وضعیت سنسور های لرزش
doorPinState = false; // وضعیت درب ها
voltageBuzzerState = false; // تغییر وضعیت تابع بیزر برای الارم ولتاژ
Serial.println("دزدگیر فعال شد!"); // پیام در سریال مانیتور
delay(500);
}
// برسی تابع وضعیت غیر فعال دزدگیر خودرو
void checkiactinvealarmState() {
alarmState = INACTIVE; // غیرفعال کردن دزدگیر
switchOffTime = millis(); // ذخیره زمان خاموش شدن سوئیچ
switchPower2State = false; // تنظیم وضعیت برق سوئیچ
ActiveBuzzer = false; // غیر فعال کردن بوزر
switchPower3State = false; // تنظیم وضعیت برق سوئیچ دوم
Serial.println("دزدگیر غیر فعال شد!"); // پیام در سریال مانیتور
digitalWrite(buzzerPin, LOW); // خاموش کردن بوزر
digitalWrite(rightWindowLifter, LOW); // خاموش کردن شیشه بالابر سمت راست
digitalWrite(leftWindowLifter, LOW); // خاموش کردن شیشه بالابر سمت چپ
digitalWrite(indicatorlight, LOW); // خاموش کردن چراغ راهنما
delay(500);
}
// برسی تایع وضعیت فعال سسایلنت دزدگیر خودرو
void checkactivesilentalarmState() {
alarmState = ACTIVE_SILENT; // فعال کردن دزدگیر در حالت سایلنت
switchPower2State = true; // تنظیم وضعیت برق سوئیچ
switchPower3State = false; // تنظیم وضعیت برق سوئیچ دوم
ActiveBuzzer = false; // غیر فعال کردن بوزر
shockSensorPinState = false; // وضعیت سنسور های لرزش
doorPinState = false; // وضعیت درب ها
voltageBuzzerState = false; // تغییر وضعیت تابع بیزر برای الارم ولتاژ
Serial.println("دزدگیر حالت سایلنت فعال شد!"); // پیام در سریال مانیتور
delay(500);
}
// تابع بررسی و تغییر وضعیت دزدگیر
void checkRemoteStates(bool remote1State, bool remote2State, bool remote3State, bool remote4State) {
if (remote1State == HIGH) {
checkactivealarmState();
} else if (remote2State == HIGH) {
checkiactinvealarmState();
} else if (remote3State == HIGH && ActiveBuzzer == true) {
Serial.println("الارم غیرفعال شد!"); // پیام در سریال مانیتور
digitalWrite(buzzerPin, LOW); // خاموش کردن بوزر
digitalWrite(indicatorlight, LOW); // خاموش کردن چراغ راهنما
switchPower2State = true; // تنظیم وضعیت برق سوئیچ
ActiveBuzzer = false; // غیر فعال کردن بوزر
doorPinState = false; // وضعیت درب ها
shockSensorPinState = false; // وضعیت سنسور های لرزش
delay(500);
} else if (remote4State == HIGH) {
checkactivesilentalarmState();
}
}
// تابع بررسی و مدیریت سنسور درب
void checkAlarmdoors( bool doorState) {
if ((alarmState == ACTIVE || alarmState == ACTIVE_SILENT) && doorState == HIGH && doorPinState == false) {
if (alarmState == ACTIVE_SILENT) {
Serial.println("سنسور درب فعال شد!"); // پیام در سریال مانیتور
alarmStartTime = millis(); // ذخیره زمان شروع الارم
sendSMS(phoneNumber, "سنسور درب فعال شد!"); // ارسال پیامک
ActiveBuzzer = true; // فعال کردن بوزر
doorPinState = true; // وضعیت درب ها
} else {
Serial.println("سنسور درب فعال شد!"); // پیام در سریال مانیتور
alarmStartTime = millis(); // ذخیره زمان شروع الارم
sendSMS(phoneNumber, "سنسور درب فعال شد!"); // ارسال پیامک
digitalWrite(buzzerPin, HIGH); // روشن کردن بوزر
Serial.println("الارم فعال شد!"); // پیام در سریال مانیتور
ActiveBuzzer = true; // فعال کردن بوزر
doorPinState = true; // وضعیت درب ها
delay(300);
}
}
}
// کنترل درب های خودرو در وضعیت دزدگیر غیر فعال
void checdoorState (bool doorState){
if (doorState == HIGH && alarmState == INACTIVE && doorPinState == false) { // برسی وضعبت درب خودرو در وضعیت دزدگیر غیر فعال
Serial.println("درب خودرو باز شد !"); // پیام در سریال مانیتور
doorPinState = true; // وضعیت درب ها
delay(300);
}
if (doorState == LOW && alarmState == INACTIVE && doorPinState == true ) {
doorPinState = false; // وضعیت درب ها
Serial.println("درب خودرو بسته شد !"); // پیام در سریال مانیتور
delay(300);
}
}
// تابع بررسی و مدیریت الارم سنسور لرزش
void checkAlarmshockSensor( bool shockSensorState) {
if ((alarmState == ACTIVE || alarmState == ACTIVE_SILENT) && shockSensorState == HIGH && shockSensorPinState == false) {
if (alarmState == ACTIVE_SILENT) {
Serial.println("سنسور لرزش فعال شد!"); // پیام در سریال مانیتور
alarmStartTime = millis(); // ذخیره زمان شروع الارم
sendSMS(phoneNumber, "سنسور لرزش فعال شد!"); // ارسال پیامک
shockSensorPinState = true; // وضعیت سنسور های لرزش
ActiveBuzzer = true; // فعال کردن بوزر
} else {
Serial.println("سنسور لرزش فعال شد!"); // پیام در سریال مانیتور
alarmStartTime = millis(); // ذخیره زمان شروع الارم
sendSMS(phoneNumber, "سنسور لرزش فعال شد!"); // ارسال پیامک
digitalWrite(buzzerPin, HIGH); // روشن کردن بوزر
Serial.println("الارم فعال شد!"); // پیام در سریال مانیتور
shockSensorPinState = true; // وضعیت سنسور های لرزش
ActiveBuzzer = true; // فعال کردن بوزر
delay(300);
}
}
}
// تابع بررسی وضعیت بوزر
void checkBuzzer() {
if (ActiveBuzzer && (millis() - alarmStartTime >= 10000)) { // بررسی زمان فعال بودن بوزر
Serial.println("الارم غیرفعال شد!"); // پیام در سریال مانیتور
sendSMS(phoneNumber, "الارم غیرفعال شد!"); // ارسال پیامک
digitalWrite(buzzerPin, LOW); // خاموش کردن بوزر
ActiveBuzzer = false; // غیر فعال کردن بوزر
switchPower2State = true; // تنظیم وضعیت برق سوئیچ
switchPower3State = false; // تنظیم وضعیت برق سوئیچ دوم
ActiveBuzzer = false; // غیر فعال کردن بوزر
shockSensorPinState = false; // وضعیت سنسور های لرزش
doorPinState = false; // وضعیت درب ها
voltageBuzzerState = false; // تغییر وضعیت تابع بیزر برای الارم ولتاژ
delay(300);
}
}
// تابع بررسی وضعیت سوئیچ خودرو
void checkSwitchPower(bool switchPowerState) {
if (switchPowerState == HIGH && !switchPower2State && !switchPower3State) {
switchOffTime = millis(); // ذخیره زمان خاموش شدن سوئیچ
} else if (switchPowerState == LOW && !switchPower2State && !switchPower3State && (millis() - switchOffTime >= 10000)) { // بررسی زمان خاموش بودن سوئیچ
setAlarmState(ACTIVE); // فعال کردن دزدگیر
sendSMS(phoneNumber, "دزدگیر فعال شد!"); // ارسال پیامک
Serial.println("دزدگیر فعال شد!"); // پیام در سریال مانیتور
switchPower2State = true; // تنظیم وضعیت برق سوئیچ
} else if (switchPowerState == HIGH && (alarmState == ACTIVE_SILENT || alarmState == ACTIVE) && switchPower2State) {
digitalWrite(buzzerPin, HIGH); // روشن کردن بوزر
Serial.println("الارم سویچ فعال شد!"); // پیام در سریال مانیتور
alarmStartTime = millis(); // ذخیره زمان شروع الارم
sendSMS(phoneNumber, "الارم سویچ فعال شد!"); // ارسال پیامک
switchPower2State = false; // تنظیم وضعیت برق سوئیچ
switchPower3State = true; // تنظیم وضعیت برق سوئیچ دوم
ActiveBuzzer = true; // فعال کردن بوزر
delay(300);
}
if (switchPowerState == HIGH && switchPower4State == false && alarmState == INACTIVE ){ // پرینت باز بودن درب خودرو
Serial.println("سویچ خودرو باز شد !"); // پیام در سریال مانیتور
switchPower4State = true; // وضعیت برق سویچ سوم
delay(300);
}
if (switchPowerState == LOW && switchPower4State == true && alarmState == INACTIVE ) { // پرینت بسته بودن درب خودرو
Serial.println("سویچ خودرو بسته شد !"); // پیام در سریال مانیتور
switchPower4State = false; // وضعیت برق سویچ سوم
delay(300);
}
}
// تابع کنترل چشمک زن و راهنماها
void checkIndicators(bool doorState) {
if ((digitalRead(buzzerPin) == HIGH) || ActiveBuzzer || (doorState == HIGH)) { // بررسی وضعیت بوزر یا درب باز
unsigned long currentMillis = millis();
if (currentMillis - indicatorlightTime >= 500) { // بررسی زمان برای چشمک زدن چراغ راهنما
indicatorlightTime = currentMillis; // ذخیره زمان فعلی
digitalWrite(indicatorlight, !digitalRead(indicatorlight)); // تغییر وضعیت چراغ راهنما
}
} else {
digitalWrite(indicatorlight, LOW); // خاموش کردن چراغ راهنما
ActiveBuzzer = false; // غیر فعال کردن بوزر
}
}
// تابع کنترل قفل دربها و شیشه بالابرها
void checkLocksAndWindows() {
if ((alarmState == ACTIVE_SILENT || alarmState == ACTIVE) && !lockPinState) {
digitalWrite(lockPin, HIGH); // قفل کردن دربها
digitalWrite(rightWindowLifter, HIGH); // فعال کردن شیشه بالابر سمت راست
digitalWrite(leftWindowLifter, HIGH); // فعال کردن شیشه بالابر سمت چپ
rightWindowEncoderState = false; // تنظیم وضعیت انکودر شیشه بالابر سمت راست
leftWindowEncoderState = false; // تنظیم وضعیت انکودر شیشه بالابر سمت چپ
Serial.println("شیشه بالابر سمت راست و چپ فعال شدند!"); // پیام در سریال مانیتور
Serial.println("دربها قفل شدند!"); // پیام در سریال مانیتور
rightWindowLifterTime = millis(); // ذخیره زمان شروع شیشه بالابر راست
leftWindowLifterTime = millis(); // ذخیره زمان شروع شیشه بالابر چپ
delay(1000);
digitalWrite(lockPin, LOW); // خاموش کردن پین قفل
lockPinState = true; // تنظیم وضعیت قفل پین
} else if (alarmState == INACTIVE && lockPinState) {
lockPinState = false; // تنظیم وضعیت قفل پین
digitalWrite(openPin, HIGH); // باز کردن دربها
Serial.println("دربها باز شدند!"); // پیام در سریال مانیتور
delay(1000);
digitalWrite(openPin, LOW); // خاموش کردن پین باز کردن دربها
}
if (digitalRead(rightWindowLifter) == HIGH && digitalRead(rightWindowEncoder) == LOW && !rightWindowEncoderState) {
digitalWrite(rightWindowLifter, LOW); // خاموش کردن شیشه بالابر سمت راست
Serial.println("شیشه بالابر سمت راست غیر فعال شد!"); // پیام در سریال مانیتور
rightWindowEncoderState = true; // تنظیم وضعیت انکودر شیشه بالابر سمت راست
delay(300);
}
if (digitalRead(rightWindowLifter) == HIGH && (millis() - rightWindowLifterTime >= 15000)) {
digitalWrite(rightWindowLifter, LOW); // خاموش کردن شیشه بالابر سمت راست
Serial.println("شیشه بالابر سمت راست غیر فعال شد!"); // پیام در سریال مانیتور
rightWindowEncoderState = true; // تنظیم وضعیت انکودر شیشه بالابر سمت راست
delay(300);
}
if (digitalRead(leftWindowLifter) == HIGH && digitalRead(leftWindowEncoder) == LOW && !leftWindowEncoderState) {
digitalWrite(leftWindowLifter, LOW); // خاموش کردن شیشه بالابر سمت چپ
Serial.println("شیشه بالابر سمت چپ غیر فعال شد!"); // پیام در سریال مانیتور
leftWindowEncoderState = true; // تنظیم وضعیت انکودر شیشه بالابر سمت چپ
delay(300);
}
if (digitalRead(leftWindowLifter) == HIGH && (millis() - leftWindowLifterTime >= 15000)) {
digitalWrite(leftWindowLifter, LOW); // خاموش کردن شیشه بالابر سمت چپ
Serial.println("شیشه بالابر سمت چپ غیر فعال شد!"); // پیام در سریال مانیتور
leftWindowEncoderState = true; // تنظیم وضعیت انکودر شیشه بالابر سمت چپ
delay(300);
}
}
// تابع بررسی ولتاژ باطری
void checkBatteryVoltage(int sensorValue) {
float voltage = sensorValue * (5.0 / 1023.0) * 2.4; // تبدیل مقدار سنسور به ولتاژ
if (voltage < voltageThreshold) { // بررسی ولتاژ پایین
if ((alarmState == ACTIVE_SILENT || alarmState == ACTIVE ) && voltageBuzzerState == false ) {
Serial.println("الارم ولتاژ پایین فعال شد!"); // پیام در سریال مانیتور
alarmStartTime = millis(); // ذخیره زمان شروع الارم
digitalWrite(buzzerPin, HIGH); // روشن کردن بوزر
ActiveBuzzer = true; // فعال کردن بوزر
voltageBuzzerState = true;
}
unsigned long currentMillis = millis();
if (currentMillis - previousVoltageTime >= 20000) { // بررسی زمان برای ارسال پیامک
Serial.println("هشدار: ولتاژ پایین است!"); // پیام در سریال مانیتور
sendSMS(phoneNumber, "هشدار: ولتاژ پایین است!"); // ارسال پیامک
previousVoltageTime = currentMillis; // ذخیره زمان فعلی
delay(300);
}
}
}
// کنترل چشمک زن دزدگیر بر اساس وضعیت دزدگیر
void checalarmStarlight() {
if (alarmState == ACTIVE_SILENT || alarmState == ACTIVE) {
digitalWrite(alarmStarlight, HIGH); // روشن کردن چشمک زن دزدگیر
} else {
digitalWrite(alarmStarlight, LOW); // خاموش کردن چشمک زن دزدگیر
}
}
// تنظیم وضعیت رله پمپ بر اساس وضعیت دزدگیر
void checpumpRelayState() {
if (alarmState == ACTIVE_SILENT || alarmState == ACTIVE) {
digitalWrite(pumpRelayPin, LOW);
} else {
digitalWrite(pumpRelayPin, HIGH);
}
}
// بررسی تماس ورودی
void callsim() {
if (sim800.available()) { // بررسی در دسترس بودن داده از ماژول
String response = sim800.readString(); // خواندن داده دریافتی از ماژول
Serial.println(response); // نمایش داده دریافتی در سریال مانیتور
if (response.indexOf("RING") != -1) { // بررسی تماس ورودی
delay(1000); // تاخیر کوتاه برای اطمینان از شروع تماس
// پاسخ به تماس
sim800.println("ATA"); // ارسال دستور ATA برای پاسخ به تماس
delay(2000); // تاخیر برای اطمینان از اتصال تماس
// انتظار برای دستورات ورودی
while (true) {
if (sim800.available()) { // بررسی در دسترس بودن داده از ماژول
char c = sim800.read(); // خواندن داده دریافتی از ماژول
Serial.print(c); // نمایش داده دریافتی در سریال مانیتور
if (c == '1') { // اگر دستور کلید شماره 1 وارد شد
checkactivealarmState();
} else if (c == '2') { // اگر دستور کلید شماره 2 وارد شد
checkiactinvealarmState();
} else if (c == '3') { // اگر دستور کلید شماره 3 وارد شد
checkactivesilentalarmState();
}
if (sim800.available()) { // بررسی در دسترس بودن داده از ماژول
String hangupResponse = sim800.readString(); // خواندن داده دریافتی از ماژول
if (hangupResponse.indexOf("NO CARRIER") != -1) { // بررسی قطع تماس
break; // پایان حلقه در صورت قطع تماس
}
}
}
// قطع تماس
sim800.println("ATH"); // ارسال دستور ATH برای قطع تماس
}
}
}
}
// بررسی و ارسال موقعیت مکانی در صورت درخواست
void locationsms() {
if (receiveSMS("موقعیت")) {
String location = getGPSLocation(); // دریافت موقعیت مکانی
sendSMS(phoneNumber, location); // ارسال موقعیت مکانی از طریق پیامک
}
}
// حلقه اصلی برنامه
void loop() {
bool shockSensorState, doorState, remote1State, remote2State, remote3State, remote4State, switchPowerState;
int sensorValue;
// خواندن ورودیها
readInputs(shockSensorState, doorState, remote1State, remote2State, remote3State, remote4State, switchPowerState, sensorValue);
// بررسی و تغییر وضعیت دزدگیر
checkRemoteStates(remote1State, remote2State, remote3State, remote4State);
// بررسی و مدیریت الارم دربها
checkAlarmdoors(doorState);
//برسی و میریت الارم سنسسور لرزش
checkAlarmshockSensor(shockSensorState);
// بررسی وضعیت بوزر
checkBuzzer();
// بررسی وضعیت سوئیچ خودرو
checkSwitchPower(switchPowerState);
// کنترل چشمک زن و راهنماها
checkIndicators(doorState);
// کنترل قفل دربها و شیشه بالابرها
checkLocksAndWindows();
// بررسی ولتاژ باطری
checkBatteryVoltage(sensorValue);
// چشمک زن دزدگیر برسی
checalarmStarlight();
// برسی وضعیت درب های خودرو
checdoorState (doorState);
// برسی وضعیت رله پمپ قطع کن
checpumpRelayState();
// برسی وضعیت دریافت اس ام اس
checreceiveSMS();
// تابع برسی تماس
callsim();
// تابع برسی دریافت اس ام اس لوکیشن
locationsms();
// بررسی پیامکهای دریافتی
checkSMS();
// ریست کردن Watchdog Timer
wdt_reset();
// دریافت دادههای GPS
while (gpsSerial.available() > 0) {
gps.encode(gpsSerial.read()); // پردازش دادههای دریافتی از GPS
}
}