GSM сигнализация M590+Arduino

pasha413
Offline
Зарегистрирован: 27.11.2016

Здравствуйте. Я новичек в этом деле, только начинаю программировать.

нашел на просторах интернета скетч для GSM сигнализации вот здесь: http://mysku.me/blog/ebay/43282.html. Переделал его под себя, имеется:

- Arduino nano v3 (ATmega168);

- герконовый датчик отрытия двери, возможно 2;

- GSM модуль Neowey M590;

вообщм что у меня получилось:

В файл SoftwareSerial.h (C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\SoftwareSerial\src\SoftwareSerial.h) необходимо внести изменения



было так:

#define _SS_MAX_RX_BUFF 64 



стало так:

 

#define _SS_MAX_RX_BUFF 192

 

скетч:

#include <SoftwareSerial.
#include <EEPROM.h>
 
SoftwareSerial mySerial(2, 3); //На этих пинах подключен модем RX, TX
#define RLed 10 // Красный светодиод
#define BLed 11 // Синий светодиод
#define GLed 12 // Зеленый светодиод
#define AlarmPin 9 // Выход "тревожного" пина, при срабатывании датчика на этом пине устанавливается сигнал высокого уровня на время указанное в переменной AlarmInterval, по умолчанию 60 секунд.
#define DoorPin 7 // Номер входа, подключенный к датчику
int8_t DoorState = 0; // Переменная для хранения состояния датчика
int8_t DoorFlag = 1;
 
int8_t RLedState = LOW;
int8_t GLedState = LOW;
int8_t BLedState = LOW;
 
 
unsigned long previousAlarmMillis = 0;
uint16_t AlarmInterval = 60; // Секунд до отключения "тревожного" пина.
 
unsigned long previousMillis = 0;
uint16_t interval = 100;
 
uint8_t ch = 0;
int8_t sendsms = 1; //Отправка смс: 1 - включена, 0 - выключена. Глобальный параметр отправки сообщений. Управляется через смс командами SmsOn и SmsOff.
int8_t AlarmRing = 1; //Звонок: 1 - включен, 0 - выключен. Звонить на первый номер массива AlarmPhone при срабатывании датчика. Управляется через смс командами RingOn и RingOff.
int8_t guard = 1; //Охрана: 1 - включена, 0 - выключена. Если включена, будут отправляться смс при срабатывании датчиков
int8_t sendsmscaller; //Переменная для отправки смс о снятии или установки на охрану пользователям которые отсутствуют в массиве AlarmPhone
int8_t LedTestOn = 0;
int8_t LedOn = 1;
 
String val = "";
String RingPhone = "";
String LastEvent = "System: auto guard on";
 
int8_t ModemID = 0;
 
const char* AllowPhone[] = {"79******", "79******"}; //Номера которым разрешено управлять охраной. На первый номер будут отправляться смс монитора порта (для отладки)
int8_t CountPhone = sizeof(AllowPhone) / sizeof(AllowPhone[0]);
 
const char* AlarmPhone[] = {"79******", "79******"}; //Номера для отправки смс при срабатывании датчиков и о снятии или установки на охрану. На первый номер будет осуществляться вызов если AlarmRing = 1;
int8_t CountAlarmPhone = sizeof(AlarmPhone) / sizeof(AlarmPhone[0]);
 
 
/*
  EEPROM Data:
  № ячейки - значение;
  0 - если записана не 1, то необходимо затереть часть памяти eeprom'a и восстановить стандартную конфигурацию.
  10 - sendsms = 1; //Отправка смс: 1 - включена, 0 - выключена. Глобальный параметр отправки сообщений. Управляется через смс командами SmsOn и SmsOff.
  11 - AlarmRing = 1; //Звонок: 1 - включен, 0 - выключен. Звонить на первый номер массива AlarmPhone при срабатывании датчика. Управляется через смс командами RingOn и RingOff.
  12 - LedTestOn = 0;
  13 - LedOn = 1;
  14 - guard =1; //Охрана: 1 - включена, 0 - выключена. Если включена, будут отправляться смс при срабатывании датчиков
*/
void setup() {
 
  Serial.begin(9600);
  
  //EEPROM.update(0, 255); //reset config;
  eepromconfig();
 
  pinMode(RLed, OUTPUT);
  pinMode(GLed, OUTPUT);
  pinMode(BLed, OUTPUT);
  digitalWrite(RLed, HIGH);
  digitalWrite(GLed, HIGH);
  digitalWrite(BLed, HIGH);
 
  digitalWrite(RLed, LOW);
  delay(500);
  digitalWrite(RLed, HIGH);
  digitalWrite(GLed, LOW);
  delay(500);
  digitalWrite(GLed, HIGH);
  digitalWrite(BLed, LOW);
  delay(500);
  digitalWrite(BLed, HIGH);
 
  pinMode(DoorPin, INPUT);
 
  pinMode(AlarmPin, OUTPUT);
  digitalWrite(AlarmPin, LOW);
  InitModem();
}
 
void loop() {
  if (LedTestOn == 0) digitalWrite(BLed, HIGH);  
  if (LedTestOn == 1) LedTest();
  Led();
  AlarmPinOff();
  Detect();
  if (mySerial.available()) {  //Если GSM модуль что-то послал нам, то
    while (mySerial.available()) {  //сохраняем входную строку в переменную val
      ch = mySerial.read();
      val += char(ch);
      delay(20);
    }
    if (val.indexOf("+PBREADY") > -1) InitModem(); //Если модем во время работы перезагрузился, выполняем настройку
    if (val.indexOf("RING") > -1) {  //Если звонок обнаружен, то проверяем номер
      if (CheckPhone() == 1) {
        mySerial.println("ATH0");  //Разрываем связь
        sendsmscaller = 1;
        //        Serial.println("--- MASTER RING DETECTED ---");
        MasterRing();
      } else {
        //        Serial.println("--- UNKNOWN RING DETECTED ---");
        mySerial.println("ATH0");  //Разрываем связь
      }
    } else if (val.indexOf("+CMT:") > -1) {  //Если пришло смс, то проверяем номер
      if (CheckPhone() == 1) {
        sendsmscaller = 1;
        //        Serial.println("--- MASTER SMS DETECTED ---");
        MasterSms();
      }
    } 
  }
  if (Serial.available()) {  //Если в мониторе порта ввели что-то
    while (Serial.available()) {  //Сохраняем строку в переменную val
      ch = Serial.read();
      val += char(ch);
      delay(20);
    }
    mySerial.println(val);  //передача всех команд, набранных в мониторе порта в GSM модуль
    ConsolePrint();
    val = "";  //Очищаем
  }
}
 
void eepromconfig(){
//EEPROM
  pinMode(13, OUTPUT);
  if (EEPROM.read(0) != 1) {
    for (int i = 0 ; i < 20 ; i++) {
//    for (int i = 0 ; i < EEPROM.length() ; i++) {
      EEPROM.update(i, 255);
      //delay(10);
    }
    EEPROM.update(10, 1);  // sendsms = 1; //Отправка смс: 1 - включена, 0 - выключена. Глобальный параметр отправки сообщений. Управляется через смс командами SmsOn и SmsOff.
    EEPROM.update(11, 1);  // AlarmRing = 1; //Звонок: 1 - включен, 0 - выключен. Звонить на первый номер массива AlarmPhone при срабатывании датчика. Управляется через смс командами RingOn и RingOff.
    EEPROM.update(12, 0);  // LedTestOn = 0;
    EEPROM.update(13, 1);  // LedOn = 1;
    EEPROM.update(14, 1); //Охрана: 1 - включена, 0 - выключена. Если включена, будут отправляться смс при срабатывании датчиков
    EEPROM.update(0, 1);
    digitalWrite(13, HIGH);
  } 
  if (EEPROM.read(0) == 1) {
    sendsms = EEPROM.read(10);  // sendsms = 1; //Отправка смс: 1 - включена, 0 - выключена. Глобальный параметр отправки сообщений. Управляется через смс командами SmsOn и SmsOff.
    AlarmRing = EEPROM.read(11);  // AlarmRing = 1; //Звонок: 1 - включен, 0 - выключен. Звонить на первый номер массива AlarmPhone при срабатывании датчика. Управляется через смс командами RingOn и RingOff.
    LedTestOn = EEPROM.read(12);  // LedTestOn = 0;
    LedOn = EEPROM.read(13);  // LedOn = 1;
    guard = EEPROM.read(14); //Охрана: 1 - включена, 0 - выключена. Если включена, будут отправляться смс при срабатывании датчиков
  }
//EEPROM
}
 
void InitModem() {
  delay(2000);  //Время на инициализацию модуля
  Serial.begin(9600);  //Скорость порта
  //  Serial.println("GSM Alarm v1.0");
  mySerial.begin(9600);
  mySerial.println("AT");
  delay(100);
  mySerial.println("ATI");
  delay(100);
  if (mySerial.find("M590")) ModemID = 1;
  mySerial.println("ATI");
  delay(100);
  mySerial.println("AT+CLIP=1");  //Включаем АОН
  delay(100);
  mySerial.println("AT+CMGF=1");  //Режим кодировки СМС - обычный (для англ.)
  delay(100);
  mySerial.println("AT+CSCS=\"GSM\"");  //Режим кодировки текста
  delay(100);
  mySerial.println("AT+CNMI=2,2"); //Отображение смс в терминале сразу после приема (без этого сообщения молча падают в память)
  delay(100);
}
 
int CheckPhone() {
  for (int i = 0; i < CountPhone; i++) {
    if (val.indexOf(AllowPhone[i]) > -1) {
      RingPhone = AllowPhone[i];
      Serial.println("Event: +" + RingPhone);
      return 1;
    }
  }
  return 0;
}
 
void Detect() {
  // Считываем значения с входа
  DoorState = digitalRead(DoorPin);
  if (DoorState == LOW && DoorFlag == 0) {
    DoorFlag = 1;
    delay(100);
    if (LedOn == 1) digitalWrite(GLed, LOW);
    Alarm();
  }
  if (DoorState == HIGH && DoorFlag == 1) {
    DoorFlag = 0;
    delay(100);
  }
}
 
void Led() {
  if (guard == 1) {
    digitalWrite(GLed, HIGH);
    digitalWrite(RLed, LOW);
  }
  if (guard == 0) {
    digitalWrite(RLed, HIGH);
    if (LedOn == 1) digitalWrite(GLed, LOW);
  }
}
 
void LedTest() {
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis > interval) {
    previousMillis = currentMillis;
    if (RLedState == LOW)
      RLedState = HIGH;
    else
      RLedState = LOW;
    digitalWrite(BLed, RLedState);
  }
}
 
void AlarmPinOff() {
  unsigned long currentAlarmMillis = millis();
  if (currentAlarmMillis - previousAlarmMillis > AlarmInterval * 1000) {
    digitalWrite(AlarmPin, LOW);
    }
}
 
void Alarm() {
  if (guard == 1) {
    digitalWrite(AlarmPin, HIGH);
    previousAlarmMillis = millis();
    for (int i = 0; i < CountAlarmPhone; i++) {
      sms(String("Srabotal datchik dveri!"), String("+" + String(AlarmPhone[i])));
      //      Serial.println("Srabotal datchik dveri! Send sms: +" + String(AlarmPhone[i]));
      delay(1000);
    }
    if (AlarmRing == 1) {
      mySerial.println("ATD+" + String(AlarmPhone[0]) + ";");
      delay(1000);
    }
  }
}
 
void MasterRing() {
  if (guard == 1) GuardOff();
  else if (guard == 0) GuardOn();
}
 
void GuardOff() {
  guard = 0;
  EEPROM.update(14, guard);
  LastEvent = "Guard Off. Phone +" + RingPhone;
  Serial.println(LastEvent);
  delay(1000);
  for (int i = 0; i < CountAlarmPhone; i++) {
    if (RingPhone == String(AlarmPhone[i])) sendsmscaller = 0;
    delay(1000);
    sms(String(LastEvent), String("+" + String(AlarmPhone[i])));
    delay(1000);
  }
  if (sendsmscaller == 1) {
    delay(1000);
    sms(String("Guard Off"), String("+" + RingPhone));
    delay(1000);
  }
}
 
void GuardOn() {
  guard = 1;
  EEPROM.update(14, guard);
  DoorFlag = 1;
  LastEvent = "Guard On. Phone +" + RingPhone;
  Serial.println(LastEvent);
  delay(1000);
  for (int i = 0; i < CountAlarmPhone; i++) {
    if (RingPhone == String(AlarmPhone[i])) sendsmscaller = 0;
    delay(1000);
    sms(String(LastEvent), String("+" + String(AlarmPhone[i])));
    delay(1000);
  }
  if (sendsmscaller == 1) {
    delay(1000);
    sms(String("Guard On"), String("+" + RingPhone));
    delay(1000);
  }
}
 
void MasterSms() {
  val.toLowerCase();
    if ((val.indexOf("ringon") > -1)) {
    delay(1000);
    AlarmRing = 1;
    EEPROM.update(11, AlarmRing);
    sms(String("RingOn: Alarm Ring is ON"), String("+" + RingPhone));
    delay(1000);
  }
  if ((val.indexOf("ringoff") > -1)) {
    delay(1000);
    AlarmRing = 0;
    EEPROM.update(11, AlarmRing);
    sms(String("RingOff: Alarm Ring is OFF"), String("+" + RingPhone));
    delay(1000);
  }
  if ((val.indexOf("smson") > -1)) {
    delay(1000);
    sendsms = 1;
    EEPROM.update(10, sendsms);
    sms(String("SmsOn: Alarm SMS is ON"), String("+" + RingPhone));
    delay(1000);
  }
  if ((val.indexOf("smsoff") > -1)) {
    delay(1000);
    sendsms = 0;
    EEPROM.update(10, sendsms);    
    sms(String("SmsOff: Alarm SMS is OFF"), String("+" + RingPhone));
    delay(1000);
  }
  if ((val.indexOf("guardon") > -1)) {
    delay(1000);
    GuardOn();
  }
  if ((val.indexOf("guardoff") > -1)) {
    delay(1000);
    GuardOff();
  }
  if ((val.indexOf("info") > -1)) {
    delay(1000);
    sms(String("Info: " + LastEvent), String("+" + RingPhone));
    delay(1000);
  }
  if ((val.indexOf("clear") > -1)) {
    clearsms();
    delay(2000);
    sms(String("Clear: All messages removed"), String("+" + RingPhone));
    delay(1000);
  }
 }
 
void ConsolePrint() {
  val.toLowerCase();
  if ((val.indexOf("clear") > -1)) {  //если увидели команду отправки СМС
    clearsms();
    delay(2000);
  }
 }
 
void clearsms() {
  if (ModemID == 1) mySerial.println("AT+CMGD=0,4");
  if (ModemID == 2) mySerial.println("AT+CMGD=4");
}
 
void sms(String text, String phone) {  // Процедура отправки СМС
  if (sendsms == 1 ) {
    mySerial.println("AT+CMGS=\"" + phone + "\"");
    delay(500);
    mySerial.print(text);
    delay(500);
    mySerial.print((char)26);
    delay(500);
    Serial.println("SMS sended! Phone: " + phone + "; Message: " + text);
    delay(5000);
  } else {
    delay(1000);
    Serial.println("Silent mode, SMS not sended! Phone: " + phone + "; Message: " + text);
  }

 

}

но почему-то не работает - не реагирует на смс и звонки, в мониторе порта тишина. подскажите что нетак?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

pasha413 пишет:

что нетак?

Для начала, код не так выложен. В таком виде его смотреть никто не будет (разве что в приступе мазахизма).

pasha413
Offline
Зарегистрирован: 27.11.2016


Извиняюсь, уже не отредактировать сообщение.

в мониторе порта тишина

вот скетч: 


#include <SoftwareSerial.
#include <EEPROM.h>
 
SoftwareSerial mySerial(2, 3); //На этих пинах подключен модем RX, TX
#define RLed 10 // Красный светодиод
#define BLed 11 // Синий светодиод
#define GLed 12 // Зеленый светодиод
#define AlarmPin 9 // Выход "тревожного" пина, при срабатывании датчика на этом пине устанавливается сигнал высокого уровня на время указанное в переменной AlarmInterval, по умолчанию 60 секунд.
#define DoorPin 7 // Номер входа, подключенный к датчику
int8_t DoorState = 0; // Переменная для хранения состояния датчика
int8_t DoorFlag = 1;
 
int8_t RLedState = LOW;
int8_t GLedState = LOW;
int8_t BLedState = LOW;
 
 
unsigned long previousAlarmMillis = 0;
uint16_t AlarmInterval = 60; // Секунд до отключения "тревожного" пина.
 
unsigned long previousMillis = 0;
uint16_t interval = 100;
 
uint8_t ch = 0;
int8_t sendsms = 1; //Отправка смс: 1 - включена, 0 - выключена. Глобальный параметр отправки сообщений. Управляется через смс командами SmsOn и SmsOff.
int8_t AlarmRing = 1; //Звонок: 1 - включен, 0 - выключен. Звонить на первый номер массива AlarmPhone при срабатывании датчика. Управляется через смс командами RingOn и RingOff.
int8_t guard = 1; //Охрана: 1 - включена, 0 - выключена. Если включена, будут отправляться смс при срабатывании датчиков
int8_t sendsmscaller; //Переменная для отправки смс о снятии или установки на охрану пользователям которые отсутствуют в массиве AlarmPhone
int8_t LedTestOn = 0;
int8_t LedOn = 1;
 
String val = "";
String RingPhone = "";
String LastEvent = "System: auto guard on";
 
int8_t ModemID = 0;
 
const char* AllowPhone[] = {"79******", "79******"}; //Номера которым разрешено управлять охраной. На первый номер будут отправляться смс монитора порта (для отладки)
int8_t CountPhone = sizeof(AllowPhone) / sizeof(AllowPhone[0]);
 
const char* AlarmPhone[] = {"79******", "79******"}; //Номера для отправки смс при срабатывании датчиков и о снятии или установки на охрану. На первый номер будет осуществляться вызов если AlarmRing = 1;
int8_t CountAlarmPhone = sizeof(AlarmPhone) / sizeof(AlarmPhone[0]);
 
 
/*
  EEPROM Data:
  № ячейки - значение;
  0 - если записана не 1, то необходимо затереть часть памяти eeprom'a и восстановить стандартную конфигурацию.
  10 - sendsms = 1; //Отправка смс: 1 - включена, 0 - выключена. Глобальный параметр отправки сообщений. Управляется через смс командами SmsOn и SmsOff.
  11 - AlarmRing = 1; //Звонок: 1 - включен, 0 - выключен. Звонить на первый номер массива AlarmPhone при срабатывании датчика. Управляется через смс командами RingOn и RingOff.
  12 - LedTestOn = 0;
  13 - LedOn = 1;
  14 - guard =1; //Охрана: 1 - включена, 0 - выключена. Если включена, будут отправляться смс при срабатывании датчиков
*/
void setup() {
 
  Serial.begin(9600);
  
  //EEPROM.update(0, 255); //reset config;
  eepromconfig();
 
  pinMode(RLed, OUTPUT);
  pinMode(GLed, OUTPUT);
  pinMode(BLed, OUTPUT);
  digitalWrite(RLed, HIGH);
  digitalWrite(GLed, HIGH);
  digitalWrite(BLed, HIGH);
 
  digitalWrite(RLed, LOW);
  delay(500);
  digitalWrite(RLed, HIGH);
  digitalWrite(GLed, LOW);
  delay(500);
  digitalWrite(GLed, HIGH);
  digitalWrite(BLed, LOW);
  delay(500);
  digitalWrite(BLed, HIGH);
 
  pinMode(DoorPin, INPUT);
 
  pinMode(AlarmPin, OUTPUT);
  digitalWrite(AlarmPin, LOW);
  InitModem();
}
 
void loop() {
  if (LedTestOn == 0) digitalWrite(BLed, HIGH);  
  if (LedTestOn == 1) LedTest();
  Led();
  AlarmPinOff();
  Detect();
  if (mySerial.available()) {  //Если GSM модуль что-то послал нам, то
    while (mySerial.available()) {  //сохраняем входную строку в переменную val
      ch = mySerial.read();
      val += char(ch);
      delay(20);
    }
    if (val.indexOf("+PBREADY") > -1) InitModem(); //Если модем во время работы перезагрузился, выполняем настройку
    if (val.indexOf("RING") > -1) {  //Если звонок обнаружен, то проверяем номер
      if (CheckPhone() == 1) {
        mySerial.println("ATH0");  //Разрываем связь
        sendsmscaller = 1;
        //        Serial.println("--- MASTER RING DETECTED ---");
        MasterRing();
      } else {
        //        Serial.println("--- UNKNOWN RING DETECTED ---");
        mySerial.println("ATH0");  //Разрываем связь
      }
    } else if (val.indexOf("+CMT:") > -1) {  //Если пришло смс, то проверяем номер
      if (CheckPhone() == 1) {
        sendsmscaller = 1;
        //        Serial.println("--- MASTER SMS DETECTED ---");
        MasterSms();
      }
    } 
  }
  if (Serial.available()) {  //Если в мониторе порта ввели что-то
    while (Serial.available()) {  //Сохраняем строку в переменную val
      ch = Serial.read();
      val += char(ch);
      delay(20);
    }
    mySerial.println(val);  //передача всех команд, набранных в мониторе порта в GSM модуль
    ConsolePrint();
    val = "";  //Очищаем
  }
}
 
void eepromconfig(){
//EEPROM
  pinMode(13, OUTPUT);
  if (EEPROM.read(0) != 1) {
    for (int i = 0 ; i < 20 ; i++) {
//    for (int i = 0 ; i < EEPROM.length() ; i++) {
      EEPROM.update(i, 255);
      //delay(10);
    }
    EEPROM.update(10, 1);  // sendsms = 1; //Отправка смс: 1 - включена, 0 - выключена. Глобальный параметр отправки сообщений. Управляется через смс командами SmsOn и SmsOff.
    EEPROM.update(11, 1);  // AlarmRing = 1; //Звонок: 1 - включен, 0 - выключен. Звонить на первый номер массива AlarmPhone при срабатывании датчика. Управляется через смс командами RingOn и RingOff.
    EEPROM.update(12, 0);  // LedTestOn = 0;
    EEPROM.update(13, 1);  // LedOn = 1;
    EEPROM.update(14, 1); //Охрана: 1 - включена, 0 - выключена. Если включена, будут отправляться смс при срабатывании датчиков
    EEPROM.update(0, 1);
    digitalWrite(13, HIGH);
  } 
  if (EEPROM.read(0) == 1) {
    sendsms = EEPROM.read(10);  // sendsms = 1; //Отправка смс: 1 - включена, 0 - выключена. Глобальный параметр отправки сообщений. Управляется через смс командами SmsOn и SmsOff.
    AlarmRing = EEPROM.read(11);  // AlarmRing = 1; //Звонок: 1 - включен, 0 - выключен. Звонить на первый номер массива AlarmPhone при срабатывании датчика. Управляется через смс командами RingOn и RingOff.
    LedTestOn = EEPROM.read(12);  // LedTestOn = 0;
    LedOn = EEPROM.read(13);  // LedOn = 1;
    guard = EEPROM.read(14); //Охрана: 1 - включена, 0 - выключена. Если включена, будут отправляться смс при срабатывании датчиков
  }
//EEPROM
}
 
void InitModem() {
  delay(2000);  //Время на инициализацию модуля
  Serial.begin(9600);  //Скорость порта
  //  Serial.println("GSM Alarm v1.0");
  mySerial.begin(9600);
  mySerial.println("AT");
  delay(100);
  mySerial.println("ATI");
  delay(100);
  if (mySerial.find("M590")) ModemID = 1;
  mySerial.println("ATI");
  delay(100);
  mySerial.println("AT+CLIP=1");  //Включаем АОН
  delay(100);
  mySerial.println("AT+CMGF=1");  //Режим кодировки СМС - обычный (для англ.)
  delay(100);
  mySerial.println("AT+CSCS=\"GSM\"");  //Режим кодировки текста
  delay(100);
  mySerial.println("AT+CNMI=2,2"); //Отображение смс в терминале сразу после приема (без этого сообщения молча падают в память)
  delay(100);
}
 
int CheckPhone() {
  for (int i = 0; i < CountPhone; i++) {
    if (val.indexOf(AllowPhone[i]) > -1) {
      RingPhone = AllowPhone[i];
      Serial.println("Event: +" + RingPhone);
      return 1;
    }
  }
  return 0;
}
 
void Detect() {
  // Считываем значения с входа
  DoorState = digitalRead(DoorPin);
  if (DoorState == LOW && DoorFlag == 0) {
    DoorFlag = 1;
    delay(100);
    if (LedOn == 1) digitalWrite(GLed, LOW);
    Alarm();
  }
  if (DoorState == HIGH && DoorFlag == 1) {
    DoorFlag = 0;
    delay(100);
  }
}
 
void Led() {
  if (guard == 1) {
    digitalWrite(GLed, HIGH);
    digitalWrite(RLed, LOW);
  }
  if (guard == 0) {
    digitalWrite(RLed, HIGH);
    if (LedOn == 1) digitalWrite(GLed, LOW);
  }
}
 
void LedTest() {
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis > interval) {
    previousMillis = currentMillis;
    if (RLedState == LOW)
      RLedState = HIGH;
    else
      RLedState = LOW;
    digitalWrite(BLed, RLedState);
  }
}
 
void AlarmPinOff() {
  unsigned long currentAlarmMillis = millis();
  if (currentAlarmMillis - previousAlarmMillis > AlarmInterval * 1000) {
    digitalWrite(AlarmPin, LOW);
    }
}
 
void Alarm() {
  if (guard == 1) {
    digitalWrite(AlarmPin, HIGH);
    previousAlarmMillis = millis();
    for (int i = 0; i < CountAlarmPhone; i++) {
      sms(String("Srabotal datchik dveri!"), String("+" + String(AlarmPhone[i])));
      //      Serial.println("Srabotal datchik dveri! Send sms: +" + String(AlarmPhone[i]));
      delay(1000);
    }
    if (AlarmRing == 1) {
      mySerial.println("ATD+" + String(AlarmPhone[0]) + ";");
      delay(1000);
    }
  }
}
 
void MasterRing() {
  if (guard == 1) GuardOff();
  else if (guard == 0) GuardOn();
}
 
void GuardOff() {
  guard = 0;
  EEPROM.update(14, guard);
  LastEvent = "Guard Off. Phone +" + RingPhone;
  Serial.println(LastEvent);
  delay(1000);
  for (int i = 0; i < CountAlarmPhone; i++) {
    if (RingPhone == String(AlarmPhone[i])) sendsmscaller = 0;
    delay(1000);
    sms(String(LastEvent), String("+" + String(AlarmPhone[i])));
    delay(1000);
  }
  if (sendsmscaller == 1) {
    delay(1000);
    sms(String("Guard Off"), String("+" + RingPhone));
    delay(1000);
  }
}
 
void GuardOn() {
  guard = 1;
  EEPROM.update(14, guard);
  DoorFlag = 1;
  LastEvent = "Guard On. Phone +" + RingPhone;
  Serial.println(LastEvent);
  delay(1000);
  for (int i = 0; i < CountAlarmPhone; i++) {
    if (RingPhone == String(AlarmPhone[i])) sendsmscaller = 0;
    delay(1000);
    sms(String(LastEvent), String("+" + String(AlarmPhone[i])));
    delay(1000);
  }
  if (sendsmscaller == 1) {
    delay(1000);
    sms(String("Guard On"), String("+" + RingPhone));
    delay(1000);
  }
}
 
void MasterSms() {
  val.toLowerCase();
    if ((val.indexOf("ringon") > -1)) {
    delay(1000);
    AlarmRing = 1;
    EEPROM.update(11, AlarmRing);
    sms(String("RingOn: Alarm Ring is ON"), String("+" + RingPhone));
    delay(1000);
  }
  if ((val.indexOf("ringoff") > -1)) {
    delay(1000);
    AlarmRing = 0;
    EEPROM.update(11, AlarmRing);
    sms(String("RingOff: Alarm Ring is OFF"), String("+" + RingPhone));
    delay(1000);
  }
  if ((val.indexOf("smson") > -1)) {
    delay(1000);
    sendsms = 1;
    EEPROM.update(10, sendsms);
    sms(String("SmsOn: Alarm SMS is ON"), String("+" + RingPhone));
    delay(1000);
  }
  if ((val.indexOf("smsoff") > -1)) {
    delay(1000);
    sendsms = 0;
    EEPROM.update(10, sendsms);    
    sms(String("SmsOff: Alarm SMS is OFF"), String("+" + RingPhone));
    delay(1000);
  }
  if ((val.indexOf("guardon") > -1)) {
    delay(1000);
    GuardOn();
  }
  if ((val.indexOf("guardoff") > -1)) {
    delay(1000);
    GuardOff();
  }
  if ((val.indexOf("info") > -1)) {
    delay(1000);
    sms(String("Info: " + LastEvent), String("+" + RingPhone));
    delay(1000);
  }
  if ((val.indexOf("clear") > -1)) {
    clearsms();
    delay(2000);
    sms(String("Clear: All messages removed"), String("+" + RingPhone));
    delay(1000);
  }
 }
 
void ConsolePrint() {
  val.toLowerCase();
  if ((val.indexOf("clear") > -1)) {  //если увидели команду отправки СМС
    clearsms();
    delay(2000);
  }
 }
 
void clearsms() {
  if (ModemID == 1) mySerial.println("AT+CMGD=0,4");
  if (ModemID == 2) mySerial.println("AT+CMGD=4");
}
 
void sms(String text, String phone) {  // Процедура отправки СМС
  if (sendsms == 1 ) {
    mySerial.println("AT+CMGS=\"" + phone + "\"");
    delay(500);
    mySerial.print(text);
    delay(500);
    mySerial.print((char)26);
    delay(500);
    Serial.println("SMS sended! Phone: " + phone + "; Message: " + text);
    delay(5000);
  } else {
    delay(1000);
    Serial.println("Silent mode, SMS not sended! Phone: " + phone + "; Message: " + text);
  }
 

}

 

pasha413
Offline
Зарегистрирован: 27.11.2016

т.к с предыдущей сигнализацией ничего не вышло ( мало памяти). решил допиливать другую, и в принципе вроде все работает.

задачи стояли такие:

 - постановка\снятие с охраны звонком, 

 - подтверждение постановки\снятия смской хозяину,

 - при срабатывании датчика (шлейфа) вызов хозяину, и смс.

 - при срабатывании датчика, если дверь осталась открыта (после сброса вызова), охрана снимается; если закрыта то остается на охране.

Что немного не устраиввает:

 - подтверждающая смс приходит со статусом программы (1 - включена сигнализация, 2 - снято). хотелось бы видеть в смс: on\off,

 - если возможно то прописать 2 номера, и слать подтверждающие( либо при срабатываении датчика) смс обоим номерам

прикрепляю скетч, что скажете, порекомендуете: 

/// GSM сигналка c установкой по звонку

#include <EEPROM.h>
#include <SoftwareSerial.h>                  // если программный
SoftwareSerial mySerial(2, 3); // RX, TX
#define LED 13
#define Buz 6                                // нога на сирену
#define SH1 A2                               // шлейыф
//#define SH2 A3
#define TELLNUMBER "ATD+79123456789;"                 // номен на который будем звонить
#define SMSNUMBER "+79123456789"                      // номер на который будем отправлять SMS
#define TELMODE "79123456789"                         // номер для установки на охрану

byte mode = 0;              // 0 - только включили
                            // 1 - установлена охрана
                            // 2 - снята с охраны
                            // при добавлении не забываем посмотреть на 41 строку

void setup() {
  delay(2000);                               // чтобы нечего не повисало при включении
  mySerial.begin(9600);                      // незабываем указать скорость работы UART модема
  Serial.begin(9600);
  pinMode(LED, OUTPUT);
  pinMode(Buz, OUTPUT);                      // нога на сирену
  pinMode(SH1, INPUT_PULLUP);                // нога на растяжку 
//  pinMode(SH2, INPUT_PULLUP);              // нога на растяжку
                                          
  mode = EEPROM.read(0);                     // читаем режим из еепром
  if (mode > 2) mode = 2;                    // проверяем значение в еепром 
  delay(1000);                            
  digitalWrite(LED, HIGH);                   // на время включаем лед  
  delay(2000);                               // ждем включения модема
  while(mySerial.find("STARTUP"));           // ждем команды от модема  
     Serial.println("GSM NEOWAY M590");
     Serial.println();
     Serial.println("Turn on AOH:");
     mySerial.println("AT+CLIP=1");          // включить АОН
     delay(100);
     Serial.println("Text format sms:");
     mySerial.println("AT+CMGF=1");          // текстовый формат SMS
     delay(100);
     Serial.println("Mode GSM:");
     mySerial.println("AT+CSCS=\"GSM\"");    // кодировка текста - GSM
     delay(100);
  mySerial.println("ATE0");                  // выключаем эхо  
  while(1){                                  // ждем подключение модема к сети
        mySerial.println("AT+COPS?");
        if (mySerial.find("+COPS: 0")) break;
           digitalWrite(LED, LOW);           // блымаем светодиодом
           delay(500);  
           digitalWrite(LED, HIGH);  
           delay(500); 
           }
    Serial.println("Modem OK"); 
    digitalWrite(LED, LOW);                  // блымаем светодиодом
    delay(500);   
    digitalWrite(LED, HIGH);
    delay(500); 
    digitalWrite(LED, LOW);   
    Serial.println(mode); 
    //sms(String(mode), String(SMSNUMBER));  // ВПИШИТЕ НОМЕР, с которого Вы будете звонить на модуль                  Serial.println(mode);
}

void loop() {

  if (mode == 1){                            // если в режиме охраны
    if (digitalRead(SH1)){                   // проверяем датчики, если обрыв
        mySerial.println(TELLNUMBER);        // отзваниваемся
           {digitalWrite(Buz, HIGH);}        // включаем сирену
           delay(5000);
          if (mySerial.find("NO CARRIER")){  // ищим сброс вызова,  
              mode = 2;                      // снимаем охранку
              EEPROM.write(0, mode);
                 Serial.println(TELLNUMBER); 
                 Serial.println("Alarm"); 
                 Serial.println(mode); 
                 //sms(String("Alarm"), String(SMSNUMBER)); // ВПИШИТЕ НОМЕР, с которого Вы будете звонить на модуль                  Serial.println(mode);
                 //sms(String(mode), String(SMSNUMBER)); // ВПИШИТЕ НОМЕР, с которого Вы будете звонить на модуль                  Serial.println(mode);

                 delay(5000);   
      }
    }  
                 digitalWrite(Buz, LOW);       // отключаем сирену
  }

  if (mode == 2){                           // если охрана снята,   
    if (digitalRead(SH1)){                  // проверяем датчики, 
      digitalWrite(LED, HIGH);              // включаем LED
    }
    else digitalWrite(LED, LOW);            // иначе гасим его
  }
  
   if(mySerial.find("RING")){                    // ищим RING, если нашли RING
      mySerial.println("AT+CLIP=1");             // включаем АОН, 
      while(1){                                  // в цикле
       if (mySerial.find(TELMODE)){              // ищим номер телефона, если нашли
         mode = (mode==2 ? 1 : 2);               // меняем режим  
         if (mode == 1){
           Serial.println(mode); 
           //sms(String(mode), String(SMSNUMBER)); // ВПИШИТЕ НОМЕР, с которого Вы будете звонить на модуль                  Serial.println(mode);
           delay(250);
           digitalWrite(Buz, LOW);                 // блымаем светодиодом
           delay(100);   
           digitalWrite(Buz, HIGH);
           delay(100); 
           digitalWrite(Buz, LOW);   
       }
         if (mode == 2){
           Serial.println(mode); 
           //sms(String(mode), String(SMSNUMBER)); // ВПИШИТЕ НОМЕР, с которого Вы будете звонить на модуль                  Serial.println(mode);
           delay(250);
           digitalWrite(Buz, LOW);                 // блымаем светодиодом
           delay(100);   
           digitalWrite(Buz, HIGH);
           delay(100); 
           digitalWrite(Buz, LOW);
           delay(100); 
           digitalWrite(Buz, HIGH);
           delay(100); 
           digitalWrite(Buz, LOW);
       }
         EEPROM.write(0, mode);                 // пишим его в еепром
         break;                                 // и выходим
   }
       
       else{                                    // иначе 
         mySerial.println("AT+CPAS");           // спрашиваем состояние модема   
         delay(100);
         if (mySerial.find("+CPAS: 0")) break;  // и если он в "готовности", выходим из цикла
       }                                        // если звонок в процессе, возвращает +CPAS: 3
      }                                         // и крутимся дальше
       
        mySerial.println("AT+CLIP=0");          // выключаем АОН, 
        delay(500);
        mySerial.println("ATH0");               // сбрасываем вызов 

         digitalWrite(LED, LOW);                // сигнализируем об этом
         delay(500);  
         digitalWrite(LED, HIGH);
         delay(250); 
         digitalWrite(LED, LOW);   
    } 
}

void sms(String text, String phone)             // отправка СМС
{
  Serial.println("Start SMS send");
  mySerial.println("AT+CMGS=\"" + phone + "\"");
  delay(500);
  mySerial.print(text);
  delay(500);
  mySerial.print((char)26);
  delay(500);
  Serial.println("SMS send OK");
  delay(2000);
}

R2PM
Offline
Зарегистрирован: 28.12.2015

Доброе время суток!!!

Подскажите с GSM  модулем SIM 800L работать будет последний скетч?

Виктор

pasha413
Offline
Зарегистрирован: 27.11.2016

Здравствуйте. Я думаю что все должно работать, судя из  http://www.2150692.ru/faq/46 .

кстати скетч брал тут: 

http://arduinolab.pw/index.php/2016/04/28/gsm-signalizaciya-dlya-dachi-n...

 

R2PM
Offline
Зарегистрирован: 28.12.2015

Доброе время суток!!!!

Попробывал Ваш проект - в принцыпе как писали так и работает!!!

Не планируете увеличение функциональности  - LCD дисплей, датчики температуры,  движения, фото и передача на сотовый тлф.

Виктор

pasha413
Offline
Зарегистрирован: 27.11.2016

Сейчас только сигнализация, но вообще насчет температуры давно думаю, жду ардуину с 328 atmega, сейчас у меня 168.

R2PM
Offline
Зарегистрирован: 28.12.2015

Доброе время суток!!!

Вот по данной ссылке неплохое работающее устройство http://pikabu.ru/story/okhrannaya_signalizatsiya_ili_sistema_opoveshcheniya_na_arduino_4355796.

Можно попробывать  объединить  = на мой взгляд неплохое устройство получиться.

Виктор

 

pasha413
Offline
Зарегистрирован: 27.11.2016

Спасибо, видел это видео. Буду пробовать добавить датчик температуры, с запросом температуры по СМС.

pasha413
Offline
Зарегистрирован: 27.11.2016

Доработал скетч, такие опции:

 - постановка/снятие с охраны звонком с прописанного номера, с подтверждением смс (Alarm: on / Alarm: off) и звуковой сирены.            

    постановка 1 пик сирены,      снятие 2 пика сирены

 - при срабатывании датчика (шлейфа) вызов хозяину, снятие с охраны, и смс (Datchik dveri// off).

 - статус светодиод Led Pin7 на охране моргает 0,2/2сек. при снятой охране, если открыть дверь горит.

 

/// GSM сигналка c установкой по звонку и смс подтверждением

#include <EEPROM.h>
#include <SoftwareSerial.h>                        
SoftwareSerial mySerial(2, 3); // RX, TX

#define Led 7    // статус
#define Buz 6                                         // сирена
#define DoorPin 4                                     // концевик
#define SMSNUMBER "+79123456789"                      // номер на который будем отправлять SMS
#define TELLNUMBER "ATD+79123456789;"                 // номен на который будем звонить
#define TELMODE "79123456789"                         // номер для установки на охрану

int ch = 0;
String val = "";

byte mode = 0;             // 1 - установлена охрана
                           // 0 - снята с охраны

String guard = " guard ";

void setup() {
  delay(2000);                                      // чтобы нечего не повисало при включении
  Serial.begin(9600);
  
  eepromconfig();
  
  pinMode(Led, OUTPUT);
  pinMode(Buz, OUTPUT);                      
  pinMode(DoorPin, INPUT_PULLUP);            
  
   digitalWrite(Led, HIGH);                         // мигнем светодиодом о включении     
   delay(500); 
   digitalWrite(Led, LOW);
 
  InitModem();

  mode = EEPROM.read(0);                            // читаем режим из еепром
  if (mode != 0) mode = 0;                          // проверяем значение в еепром, пишем 0
  delay(1000);                             
    Serial.println(guard);
}

void loop() {
  if (mode == 1)  {                                 // если в режиме охраны
           {  
           digitalWrite(Led, HIGH);                 // мигаем светодиодом через 0,2/2сек         
           delay(200); 
           digitalWrite(Led, LOW);
           delay(2000); 
         } 
    if (digitalRead(DoorPin)){                      // проверяем датчики, если обрыв
        mySerial.println(TELLNUMBER);               // отзваниваемся
        digitalWrite(Buz, HIGH);                    // включаем сирену
        delay(10000);
          if (mySerial.find("NO CARRIER")){         // ищим сброс вызова,  
              mode = 0;                             // снимаем охранку,
              EEPROM.write(0, mode);
       eepromconfig();       
              
              delay(5000);                          // время сирены после сброса вызова
        } 
              Serial.println("datchik dveri!"); 
              Serial.println(guard); 
              sms(String("Datchik dveri//   " + String(guard)), String(SMSNUMBER));        
      } digitalWrite(Buz, LOW);                     // отключаем сирену
  }
  if (mode == 0){                                   // если охрана снята,   
    if (digitalRead(DoorPin)){                      // проверяем датчики, 
        digitalWrite(Led, HIGH);                    // включаем LED постоянно при открытой двери
      } else digitalWrite(Led, LOW);                // иначе гасим его,
}
  
   if(mySerial.find("RING")){                       // ищим RING, если нашли RING
      mySerial.println("AT+CLIP=1");                // включаем АОН, 
      while(1){                                     // в цикле
       if (mySerial.find(TELMODE)){                 // ищим номер телефона, если нашли
         mode = (mode==0 ? 1 : 0);                  // меняем режим  
         if (mode == 1) {
           eepromconfig();
           delay(250);
           digitalWrite(Buz, HIGH);                 // пикаем сиреной 1 раз
           delay(100); 
           digitalWrite(Buz, LOW);   
 }
         if (mode == 0)  {
           eepromconfig();
           delay(250);
           digitalWrite(Buz, HIGH);                 // пикаем сиреной 2 раза
           delay(100); 
           digitalWrite(Buz, LOW);
           delay(250); 
           digitalWrite(Buz, HIGH);
           delay(100); 
           digitalWrite(Buz, LOW);
     }
         EEPROM.write(0, mode);                     // пишим его в еепром
         break;                                     // и выходим
 }     else{                                      // иначе 
         mySerial.println("AT+CPAS");               // спрашиваем состояние модема   
         delay(100);
         if (mySerial.find("+CPAS: 0")) break;      // и если он в "готовности", выходим из цикла
       }                                            // если звонок в процессе, возвращает +CPAS: 3
      }                                             // и крутимся дальше
        delay(500);
        mySerial.println("ATH0");                   // сбрасываем вызов 
        Serial.println(guard); 
        delay(500);
        sms(String("Alarm: " + String(guard)), String(SMSNUMBER)); 
        delay(2000);
        clearsms();
  Serial.println("clearsms"); 
   } 
}

void eepromconfig() {
    if (mode == 1) guard = "on";
    if (mode == 0) guard = "off";
}

  void InitModem() {
     delay(2000);                                   // ждем включения модема
     Serial.begin(9600); 
     mySerial.begin(9600);
     Serial.println("GSM NEOWAY M590");
     Serial.println("AT");
     mySerial.println("AT");
     delay(100);
     mySerial.println("AT+CLIP=1");                 // включить АОН
     delay(100);
     mySerial.println("AT+CMGF=1");                 // текстовый формат SMS
     delay(100);
     mySerial.println("AT+CSCS=\"GSM\"");           // кодировка текста - GSM
     delay(100);
     mySerial.println("AT+CNMI=2,2");
     delay(100);
     Serial.println("Modem OK"); 
     delay(1000);                                   // ждем 
}
 
void clearsms() {
  mySerial.println("AT+CMGD=1,4");
  } 

void sms(String text, String phone) {               // отправка СМС
  Serial.println("Start SMS send"); 
  mySerial.println("AT+CMGS=\"" + phone + "\"");
  delay(500);
  mySerial.print(text);
  delay(500);
  mySerial.print((char)26);
  delay(500);
  Serial.println("SMS send OK");
  delay(3000);
}

 

pasha413
Offline
Зарегистрирован: 27.11.2016

Подскажите, как сделать: при вызове обонента, если вызов не сброшен, включается автоответчик и снимаютсяденьги. 

Что требуется: если вызов не сброшен в течении 20 секунд сбросить его прогшраммно.

ак это сделать?.

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

когда посылаеться вызов(т.е. из mySerial.println(TELLNUMBER);)берем и смотрим set_time=millis(); и ставим флаг razriv=1; . и потом проверкой допустим в loop вконце проверяем если millis()>=set_time + 20000 и razriv==1 то сбрасываем вызов mySerial.println("AT0");  , делаем повторный звонок mySerial.println(TELLNUMBER) и когда поймем что вызов сами сбросили или приняли, т.е. делаем проверку millis()<set_time+20000 и mySerial.find("NO CARRIER"),  сбрасываем флаг razriv=0; ну а если что то не так, то там уже догадеешься, главное логику объяснил

pasha413
Offline
Зарегистрирован: 27.11.2016

Спасибо попробую. Мне нужен один вызов, а потом я отправляю СМС со статусом.

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

просто вызов может не дойти, потому что вне зоны доступа был, а так 100 процентов дойдет и сигнализация поймет что вы 100 процентов узналди об этом

pasha413
Offline
Зарегистрирован: 27.11.2016

Еще немного оптимизировал и доработал скетч:

теперь работает так:

- при подаче питания сигнализация выключена, отправляет смс: снято с охраны;

- при звонке с прописанного номера включает (либо выкл) сигнализацию с смс подтверждением (снято или поставлено на охрану);

- при срабатывании геркона двери: включается сирена, и звонит на прописанный номер, снимает с охраны, отправляет смс открыта дверь и снято с охраны;

- при первом срабатывании датчика движения сирена звучит 5 сек (отпугивание), 5 сек ждет, далее в стандартном режиме:

- при повторном срабатывании датчика движения сирена 10 сек, и смс "движение", при следующих срабатываниях все повторяется с предыдущего пункта.

 

#include<SoftwareSerial.h>
SoftwareSerial mySerial(2, 3);

#define DoorPin 4                              // концевик
#define Sensor 5                               // датчик движения
#define Led 6                                  // статус
#define Buz 7                                  // сирена

int flag1=0;
int mode=0;

#define SMSNUMBER "+79123456789"               // номер на который будем отправлять SMS
#define TELLNUMBER "ATD+79123456789;"          // номер на который будем звонить
#define TELMODE "79123456789"                  // номер для установки на охрану
char PowerOn[]  = "Postanovka na ohranu! ";
char PowerOff[] = "Snyato s ohrani! ";
char SensorOn[] = "Dvijeniye na objekte! ";
char DoorOn[]   = "Dver' otkrita! ";
String guard = guard;

void setup() {              /// При подаче питания сигнализация выкл
    Serial.begin(9600);
    pinMode(4, INPUT_PULLUP);
    pinMode(5, INPUT_PULLUP); 
    pinMode(6, OUTPUT);
    pinMode(7, OUTPUT);
      digitalWrite(Led, HIGH);                         // мигнем светодиодом о включении     
  InitModem();
    if (mode != 0) mode = 0;                           // проверяем значение в еепром, пишем 0
  eepromconfig();
      delay(2000);
      digitalWrite(Led, LOW);
      //Serial.println(guard);
      sms(String(guard), String(SMSNUMBER));           // отправляем смс о статусе сигнализации при включении
}

void loop() {
  if (mode == 1) {                                 // если в режиме охраны
           digitalWrite(Led, HIGH);                // мигаем светодиодом через 0,2/2сек         
           delay(200); 
           digitalWrite(Led, LOW);
           delay(2000); 
 } 
  if (mode == 0) {                                 // !!! если охрана снята, можно удалить если не надо
    if (digitalRead(DoorPin)){                     // проверяем датчики, 
       digitalWrite(Led, HIGH);                    // включаем LED постоянно при открытой двери
 } else digitalWrite(Led, LOW);                    // иначе гасим его,
}
  //===============================Ищим RING=============================== 
  if(mySerial.find("RING")){                        // если нашли RING
      Serial.println("RING");
      mySerial.println("AT+CLIP=1");                // включаем АОН, 
      while(1){                                     // в цикле
       if (mySerial.find(TELMODE)){                 // ищим номер телефона, если нашли
         mode = (mode==0 ? 1 : 0);                  // меняем режим  
         if (mode == 1) {
  eepromconfig();
           digitalWrite(Buz, HIGH);                 // пикаем сиреной 1 раз
           delay(100);
           digitalWrite(Buz, LOW);   
 }
         if (mode == 0)  {
  eepromconfig();
           digitalWrite(Buz, HIGH);                 // пикаем сиреной 2 раза
           delay(100);
           digitalWrite(Buz, LOW);
           delay(500); 
           digitalWrite(Buz, HIGH);
           delay(100); 
           digitalWrite(Buz, LOW);
     }
         break;                                     // и выходим
 }     else{                                        // иначе 
         mySerial.println("AT+CPAS");               // спрашиваем состояние модема   
         delay(100);
         if (mySerial.find("+CPAS: 0")) break;      // и если он в "готовности", выходим из цикла
       }                                            // если звонок в процессе, возвращает +CPAS: 3
     }                                              // и крутимся дальше
        delay(500);
        mySerial.println("ATH0");                   // сбрасываем вызов 
  eepromconfig();
        delay(500);
        Serial.println(guard); 
        sms(String(guard), String(SMSNUMBER));      // смс со статусом сигнализации
        delay(2000);
  clearsms();
   } 
   //===========================Первое срабатывание датчика движения======
    if (digitalRead(Sensor) && flag1==0 && mode==1){
       digitalWrite(Buz, HIGH);                              // сирена 5 сек
  flag1++;
       delay(5000);                                          
       digitalWrite(Buz, LOW);
       delay(5000);                                          // ждем 5 сек
  }
  //===========================Повторное срабатывание датчика движения========
    if (digitalRead(Sensor) && flag1==1 && mode==1){
       digitalWrite(Buz, HIGH);                              // сирена 10 сек
       Serial.println(SensorOn);
       sms(String(SensorOn), String(SMSNUMBER));             // Посылаем СМС: датчик движения
  flag1++;
       delay(10000);                                          
       digitalWrite(Buz, LOW);        
  }
    if (flag1>=2) {                                          // возвращаемся к первому срабатыванию датчика движения
      flag1=0; 
    }
 //==========================Cрабатывание датчика двери========
    if (digitalRead(DoorPin) && mode==1){ 
       digitalWrite(Buz, HIGH);                    // сирена сек
  mode=0;
  eepromconfig();
       Serial.print((DoorOn) + (guard));
       mySerial.println(TELLNUMBER);               // отзваниваемся
       mySerial.println("NO CARRIER");             // ищим сброс вызова
       mySerial.println("ATH");                    // сбрасываем вызов
     if (mySerial.find("NO CARRIER") || mySerial.find("ATH")); {     // ищим сброс вызова или сбрасываем 
       sms(String(DoorOn + guard), String(SMSNUMBER));               // Посылаем СМС: открыта дверь
    }
       delay(20000);                               // время сирены                                    
       digitalWrite(Buz, LOW);        
  }
}

void eepromconfig() {                   /// конфигурирование
    if (mode == 1) guard = PowerOn;
    if (mode == 0) guard = PowerOff;
}

void InitModem()  {                     /// включение и инициализация модема
     delay(2000);                                  // ждем включения модема
     Serial.begin(9600); 
     mySerial.begin(9600);
     Serial.println("GSM NEOWAY M590");
     mySerial.println("AT");
     delay(100);
     mySerial.println("AT+CLIP=1");                // включить АОН
     delay(100);
     mySerial.println("AT+CMGF=1");                // текстовый формат SMS
     delay(100);
     mySerial.println("AT+CSCS=\"GSM\"");          // кодировка текста - GSM
     delay(100);
     mySerial.println("AT+CNMI=2,2");
     delay(100);
     Serial.println("Modem OK"); 
     delay(1000);                                  
}
 
void clearsms() {                       /// очистка смс с симкарты
  mySerial.println("AT+CMGD=1,4");
  } 

void sms(String text, String phone) {              /// отправка СМС
  Serial.println("Start SMS send"); 
  mySerial.println("AT+CMGS=\"" + phone + "\"");
  delay(500);
  mySerial.print(text);
  delay(500);
  mySerial.print((char)26);
  delay(500);
  Serial.println("SMS send OK");
  delay(3000);
}

 

bester
Offline
Зарегистрирован: 25.06.2016

pasha413 пишет:

- при срабатывании геркона двери: включается сирена, и звонит на прописанный номер, снимает с охраны, отправляет смс открыта дверь и снято с охраны;

Звонок проходит, а смс почему то неотправляет. При обнаружении движения смс отправляет. В чем причина?

 

pasha413
Offline
Зарегистрирован: 27.11.2016

bester пишет:

Звонок проходит, а смс почему то неотправляет. При обнаружении движения смс отправляет. В чем причина?

так когда смс не отправляет, при открытии двери?

я сначала закомментрую строки с отправкой смс, а вместо них вывожу сообщения в монитор порта, при первом срабатывании ДД: Serial.println(SensorOn); повторное срабатывание: Serial.println(SensorOn + LastEvent); а уже потом - если все нормально выводится, уже потом налаживаю отправку СМС.

я немного оптимизировал (немного меньше весит), но не проверял, должно так же работать. Еще допилю чтоб датчик движения срабатывал при движении в несколько секунд (на помехи не отрабатывал).



#include<SoftwareSerial.h>
SoftwareSerial mySerial(2, 3);

#define DoorPin 4                              // концевик
#define Sensor 5                               // датчик движения
#define Led 6                                  // статус
#define Buz 7                                  // сирена

int flag1=0;                                   // 
int guard = 0;                                 // Охрана: 1 - включена, 0 - выключена.

#define SMSNUMBER "+79123456789"               // номер на который будем отправлять SMS
#define TELLNUMBER "ATD+79123456789"          // номен на который будем звонить
#define TELMODE "79123456789"                  // номер для установки на охрану
char SensorOn[] = "Dvijeniye na objekte! ";
char DoorOn[]   = "Dver' otkrita! ";
String LastEvent = LastEvent;

void setup() {              /// При подаче питания сигнализация выкл
    Serial.begin(9600);
    pinMode(4, INPUT_PULLUP);
    pinMode(5, INPUT_PULLUP); 
    pinMode(6, OUTPUT);
    pinMode(7, OUTPUT);
      digitalWrite(Led, HIGH);                         // мигнем светодиодом о включении     
  InitModem();
    if (guard != 0) guard = 0;                           // проверяем значение в еепром, пишем 0
  eepromconfig();
      delay(2000);
      digitalWrite(Led, LOW);
      Serial.println(LastEvent);
      sms(String(LastEvent), String(SMSNUMBER));           // отправляем смс о статусе сигнализации при включении
}

void loop() {
  LED();
//===============================Ищим RING=============================== 
  if(mySerial.find("RING")){                        // если нашли RING
      Serial.println("RING");
      mySerial.println("AT+CLIP=1");                // включаем АОН, 
      while(1){                                     // в цикле
       if (mySerial.find(TELMODE)){                 // ищим номер телефона, если нашли
         guard = (guard==0 ? 1 : 0);                  // меняем режим  
         if (guard == 1) {
  eepromconfig();
           digitalWrite(Buz, HIGH);                 // пикаем сиреной 1 раз
           delay(100);
           digitalWrite(Buz, LOW);   
 }
         if (guard == 0)  {
  eepromconfig();
           digitalWrite(Buz, HIGH);                 // пикаем сиреной 2 раза
           delay(100);
           digitalWrite(Buz, LOW);
           delay(500); 
           digitalWrite(Buz, HIGH);
           delay(100); 
           digitalWrite(Buz, LOW);
     }
         break;                                     // и выходим
 }     else{                                        // иначе 
         mySerial.println("AT+CPAS");               // спрашиваем состояние модема   
         delay(100);
         if (mySerial.find("+CPAS: 0")) break;      // и если он в "готовности", выходим из цикла
       }                                            // если звонок в процессе, возвращает +CPAS: 3
     }                                              // и крутимся дальше
        delay(500);
        mySerial.println("ATH0");                   // сбрасываем вызов 
  eepromconfig();
        delay(1000);
        Serial.println(LastEvent); 
        sms(String(LastEvent), String(SMSNUMBER));      // смс со статусом сигнализации
        delay(2000);
  clearsms();
   } 
//===========================Первое срабатывание датчика движения======
    if (digitalRead(Sensor) && flag1==0 && guard==1){
       digitalWrite(Buz, HIGH);                              // сирена 5 сек
       Serial.println("Sensor");
  flag1++;
       delay(5000);                                          
       digitalWrite(Buz, LOW);
       delay(5000);                                          // ждем 5 сек
  }
//===========================Повторное срабатывание датчика движения========
    if (digitalRead(Sensor) && flag1==1 && guard==1){
       digitalWrite(Buz, HIGH);                              // сирена 10 сек
       Serial.println(SensorOn);
       sms(String(SensorOn), String(SMSNUMBER));             // Посылаем СМС: датчик движения
  flag1++;
       delay(10000);                                          
       digitalWrite(Buz, LOW);        
  }
    if (flag1>=2) {                                          // возвращаемся к первому срабатыванию датчика движения
      flag1=0; 
    }
//==========================Cрабатывание датчика двери========
    if (digitalRead(DoorPin) && guard==1){ 
       digitalWrite(Buz, HIGH);                    // сирена 
  guard=0;
  eepromconfig();
       Serial.println((DoorOn) + (LastEvent));
       mySerial.println(TELLNUMBER);               // отзваниваемся
       mySerial.println("NO CARRIER");             // ищим сброс вызова
       mySerial.println("ATH");                    // сбрасываем вызов
     if (mySerial.find("NO CARRIER") || mySerial.find("ATH")); {       // ищим сброс вызова или сбрасываем 
       sms(String(DoorOn + LastEvent), String(SMSNUMBER));               // Посылаем СМС: открыта дверь
    }
       delay(20000);                               // время сирены                                    
       digitalWrite(Buz, LOW);        
  }
}

void LED() {
  if (guard == 1) {                                // если в режиме охраны
           digitalWrite(Led, HIGH);                // мигаем светодиодом через 0,2/2сек         
           delay(200); 
           digitalWrite(Led, LOW);
           delay(2000); 
 } 
  if (guard == 0) {                                //  если охрана снята, можно удалить если не надо
    if (digitalRead(DoorPin)){                     // проверяем датчики, 
       digitalWrite(Led, HIGH);                    // включаем LED постоянно при открытой двери
    } else digitalWrite(Led, LOW);                 // иначе гасим его,
  }
}

void eepromconfig() {                   /// конфигурирование
    if (guard == 1) LastEvent = "System -> On";
    if (guard == 0) LastEvent = "System -> Off";
}

void InitModem()  {                     /// включение и инициализация модема
     delay(2000);                                  // ждем включения модема
     Serial.begin(9600); 
     mySerial.begin(9600);
     Serial.println("GSM NEOWAY M590");
     mySerial.println("AT");
     delay(100);
     mySerial.println("AT+CLIP=1");                // включить АОН
     delay(100);
     mySerial.println("AT+CMGF=1");                // текстовый формат SMS
     delay(100);
     mySerial.println("AT+CSCS=\"GSM\"");          // кодировка текста - GSM
     delay(100);
     mySerial.println("AT+CNMI=2,2");
     delay(100);
     Serial.println("Modem OK"); 
     delay(1000);                                  
}

void clearsms() {                       /// очистка смс с симкарты
  mySerial.println("AT+CMGD=1,4");
  } 

void sms(String text, String phone) {              /// отправка СМС
  Serial.println("Start SMS send"); 
  mySerial.println("AT+CMGS=\"" + phone + "\"");
  delay(500);
  mySerial.print(text);
  delay(500);
  mySerial.print((char)26);
  delay(500);
  Serial.println("SMS send OK");
  delay(3000);
}

 

 

имейте ввиду, что у меня в программе при движении низкий уровень, возможно вам нужно будет изменить это.

bester
Offline
Зарегистрирован: 25.06.2016

При срабтке ДД смс приходят, а при размыкании периметра приходит только вызов, а смс нет. Новый код не пробовал и к сожалению не умею работать с Serial. Кстати, по моему когда к нано был подключен UART-адаптер и открыт монитор порта, смс при открытии двери приходили, а вот подключаю питание с блока питания 4ампера смс нет при открытии двери, только вызов. Может с этим как то связано?

pasha413
Offline
Зарегистрирован: 27.11.2016

советую подключить снова к компу и посмотреть монитор порта, и посмотреть будет ли приходить в монитор порта строка: Dver' otkrita!.

перед всеми строками sms(String...) сделайте вот так:    //sms(String(   чтоб не тратить деньги на смс, будет работать только вызов. И смотрите в мониторе порта отработки датчиков, если все отрабатывает - сообщения появляются, все должно быть хорошо. я завтра возьму с собой ардуинку и снова проверю скетч.

bester
Offline
Зарегистрирован: 25.06.2016

у вас на BOOT и GND перемычка стоит? Я их только замыкаю на время. Можете сделать чтоб они програмно взамыкались, при срабатывании ДД или открытии двери и посте вызова и отправки смс снова замыкались для отключения GSM модуля в целях экономии энергии?

pasha413
Offline
Зарегистрирован: 27.11.2016

Да, яэто не указал, нога модема BOOT подключена на GND. по идее можно сделать. мой модем потребляет в дежурке около 20мА, и мне не интересно отключение модема.

bester
Offline
Зарегистрирован: 25.06.2016

смс закоментировал, в порт приходит Dver' otkrita! Snyato s ohrani! Dver' otkrita! Snyato s ohrani! Но почему смс Dvijeniye na objekte! приходит, а  Dver' otkrita! Snyato s ohrani!- нет. 

 
pasha413
Offline
Зарегистрирован: 27.11.2016

bester пишет:

смс закоментировал, в порт приходит Dver' otkrita! Snyato s ohrani! Dver' otkrita! Snyato s ohrani! Но почему смс Dvijeniye na objekte! приходит, а  Dver' otkrita! Snyato s ohrani!- нет. 

непонял, 2 раза приходит "Dver' otkrita! Snyato s ohrani!"?
попробуйте изменить строку отправки смс датчика двери на эту, будет ли приходить:
     sms(String(DoorOn), String(SMSNUMBER));
завтра днем посмотрю  приходит ли у меня сообщение. отпишусь.
bester
Offline
Зарегистрирован: 25.06.2016

раскоментировал отправку смс. И опять при срабатывании ДД смс приходят, а при открытии двери идет вызов, смс нет, хотя в порт пишет:

Dver' otkrita! Snyato s ohrani!

Start SMS send

SMS send OK
 
pasha413
Offline
Зарегистрирован: 27.11.2016

Строку отправки смс изменили? У меня раз так было как-то отправилась СМС, но не пришла , пришла она позже и не одна.
Вообще только завтра, рабочий день кончился, пора домой.

bester
Offline
Зарегистрирован: 25.06.2016

тоже завтра попробую строку заменить, на которую вы указали

Кстати заказывал 3 штуки м590, в 2-х разных местах, рабочей оказалась только одна, на двух других КЗ по питанию

 

 

pasha413
Offline
Зарегистрирован: 27.11.2016

Я заказывал один набор, паял сам, работает :)

bester
Offline
Зарегистрирован: 25.06.2016

ну я тоже паял сам, КЗ в самих м590

bester
Offline
Зарегистрирован: 25.06.2016

Не получилось все равно, после открытия двери проходит вызов, а смс не отправляется

Почему, Dver' otkrita! Snyato s ohrani! и Start SMS send в одной строке? Может в этом причина не отправки смс?

Без "guard" тоже не отправляется
pasha413
Offline
Зарегистрирован: 27.11.2016

Да, я разбираюсь с этим вопросом. старанно, но работало сначала.

по отдельности вызов или смс все работает, а вместе нехочет отправлять смс, хоть до звонка, хоть после.

ПС: все оказалось элементарно запутано - надо изменить в строке с find  на  println

if (mySerial.println("NO CARRIER" || "ATH")) {     // ищим сброс вызова или сбрасываем

и все заработало.

последний подправленный скетч:

#include<SoftwareSerial.h>
SoftwareSerial mySerial(2, 3);

#define DoorPin 4                              // концевик
#define Sensor 5                               // датчик движения
#define Led 6                                  // статус
#define Buz 7                                  // сирена

int flag1=0;                                   // 
int guard = 0;                                 // Охрана: 1 - включена, 0 - выключена.

#define SMSNUMBER "+79123456789"               // номер на который будем отправлять SMS
#define TELLNUMBER "ATD+79123456789;"          // номен на который будем звонить
#define TELMODE "79123456789"                  // номер для установки на охрану
char SensorOn[] = "Dvijeniye na objekte! ";
char DoorOn[]   = "Dver' otkrita! ";
String LastEvent = LastEvent;

void setup() {              /// При подаче питания сигнализация выкл
    Serial.begin(9600);
    pinMode(4, INPUT_PULLUP);
    pinMode(5, INPUT_PULLUP); 
    pinMode(6, OUTPUT);
    pinMode(7, OUTPUT);
      digitalWrite(Led, HIGH);                         // мигнем светодиодом о включении     
  InitModem();
    if (guard != 0) guard = 0;                           // проверяем значение в еепром, пишем 0
  eepromconfig();
      delay(2000);
      digitalWrite(Led, LOW);
      Serial.println(LastEvent);
      sms(String(LastEvent), String(SMSNUMBER));           // отправляем смс о статусе сигнализации при включении
}

void loop() {
  LED();
//===============================Ищим RING=============================== 
  if(mySerial.find("RING")){                        // если нашли RING
      Serial.println("RING");
      mySerial.println("AT+CLIP=1");                // включаем АОН, 
      while(1){                                     // в цикле
       if (mySerial.find(TELMODE)){                 // ищим номер телефона, если нашли
         guard = (guard==0 ? 1 : 0);                  // меняем режим  
         if (guard == 1) {
  eepromconfig();
           digitalWrite(Buz, HIGH);                 // пикаем сиреной 1 раз
           delay(100);
           digitalWrite(Buz, LOW);   
 }
         if (guard == 0)  {
  eepromconfig();
           digitalWrite(Buz, HIGH);                 // пикаем сиреной 2 раза
           delay(100);
           digitalWrite(Buz, LOW);
           delay(500); 
           digitalWrite(Buz, HIGH);
           delay(100); 
           digitalWrite(Buz, LOW);
     }
         break;                                     // и выходим
 }     else{                                        // иначе 
         mySerial.println("AT+CPAS");               // спрашиваем состояние модема   
         delay(100);
         if (mySerial.find("+CPAS: 0")) break;      // и если он в "готовности", выходим из цикла
       }                                            // если звонок в процессе, возвращает +CPAS: 3
     }                                              // и крутимся дальше
        delay(500);
        mySerial.println("ATH0");                   // сбрасываем вызов 
  eepromconfig();
        delay(1000);
        Serial.println(LastEvent); 
        sms(String(LastEvent), String(SMSNUMBER));      // смс со статусом сигнализации
        delay(2000);
  clearsms();
   } 
//===========================Первое срабатывание датчика движения======
    if (digitalRead(Sensor) && flag1==0 && guard==1){
       digitalWrite(Buz, HIGH);                              // сирена 5 сек
       Serial.println("Sensor");
  flag1++;
       delay(5000);                                          
       digitalWrite(Buz, LOW);
       delay(5000);                                          // ждем 5 сек
  }
//===========================Повторное срабатывание датчика движения========
    if (digitalRead(Sensor) && flag1==1 && guard==1){
       digitalWrite(Buz, HIGH);                              // сирена 10 сек
  eepromconfig();
       Serial.println(SensorOn);
       sms(String((SensorOn) + (LastEvent)), String(SMSNUMBER));             // Посылаем СМС: датчик движения
  flag1++;
       delay(10000);                                          
       digitalWrite(Buz, LOW);        
  }
    if (flag1>=2) {                                          // возвращаемся к первому срабатыванию датчика движения
      flag1=0; 
    }
//==========================Cрабатывание датчика двери========
    if (digitalRead(DoorPin) && guard==1){ 
       digitalWrite(Buz, HIGH);                    // сирена 
  guard=0;
  eepromconfig();
       Serial.println((DoorOn) + (LastEvent));
       mySerial.println(TELLNUMBER);               // отзваниваемся
       Serial.println(TELLNUMBER);
       mySerial.println("NO CARRIER");             // ищим сброс вызова
       mySerial.println("ATH");                    // сбрасываем вызов
     if (mySerial.println("NO CARRIER" || "ATH")) {     // ищим сброс вызова или сбрасываем 
       delay(2000);
       sms(String((DoorOn) + (LastEvent)), String(SMSNUMBER));   // Посылаем СМС: открыта дверь
       } 
       delay(20000);                              // время сирены                                    
       digitalWrite(Buz, LOW);        
  }
}

void LED() {
  if (guard == 1) {                                // если в режиме охраны
           digitalWrite(Led, HIGH);                // мигаем светодиодом через 0,2/2сек         
           delay(200); 
           digitalWrite(Led, LOW);
           delay(2000); 
 } 
  if (guard == 0) {                                //  если охрана снята, можно удалить если не надо
    if (digitalRead(DoorPin)){                     // проверяем датчики, 
       digitalWrite(Led, HIGH);                    // включаем LED постоянно при открытой двери
    } else digitalWrite(Led, LOW);                 // иначе гасим его,
  }
}

void eepromconfig() {                   /// конфигурирование
    if (guard == 1) LastEvent = "System -> On";
    if (guard == 0) LastEvent = "System -> Off";
}

void InitModem()  {                     /// включение и инициализация модема
     delay(2000);                                  // ждем включения модема
     Serial.begin(9600); 
     mySerial.begin(9600);
     Serial.println("GSM NEOWAY M590");
     mySerial.println("AT");
     delay(100);
     mySerial.println("AT+CLIP=1");                // включить АОН
     delay(100);
     mySerial.println("AT+CMGF=1");                // текстовый формат SMS
     delay(100);
     mySerial.println("AT+CSCS=\"GSM\"");          // кодировка текста - GSM
     delay(100);
     mySerial.println("AT+CNMI=2,2");
     delay(100);
     Serial.println("Modem OK"); 
     delay(1000);                                  
}
 
void clearsms() {                       /// очистка смс с симкарты
  mySerial.println("AT+CMGD=1,4");
  } 

void sms(String text, String phone) {              /// отправка СМС
  Serial.println("Start SMS send"); 
  mySerial.println("AT+CMGS=\"" + phone + "\"");
  delay(500);
  mySerial.print(text);
  delay(500);
  mySerial.print((char)26);
  delay(500);
  Serial.println("SMS send OK");
  delay(5000);
}

 

bester
Offline
Зарегистрирован: 25.06.2016

Залил последний скетч - при открытии двери не приходит не вызов ни смс, от срабатывания ДД смс приходят.

Все работает, я "7" в наборе номера пропустил.

А почему для атмега8 скетч не компилируется? Места вроде хватает. Можете еще что то оптимизировамь, чтоб на атмега8 залез скетч?

Размер все-таки большой похоже, буду ардуино на атмега 168 заказывать. А если на атмега 8 попробовать без загрузчика залить hex, как думаете, получится?

pasha413
Offline
Зарегистрирован: 27.11.2016

Так много не оптимизировать, если только либо датчик двери, либо датчик движения удалять.
Я promini 328 5V заказал (еще хочу модем на плате поменьше заказать, чтоб вообще компактно было), да и esp8266 для изучения.

bester
Offline
Зарегистрирован: 25.06.2016

У меня вот такой есть- работает https://ru.aliexpress.com/item/1pcs-Smallest-SIM800L-GPRS-GSM-Module-MicroSIM-Card-Core-BOard-Quad-band-TTL-Serial-Port/32657711064.html?spm=2114.13010608.0.0.o9sWP1 , заказывал его после того, как пришли два м590 и оба не рабочие.

pasha413
Offline
Зарегистрирован: 27.11.2016

С помощью инженера программиста еще доработал скетч, добавив массив номеров (2 номера, можно больше добавить с небольшой доработкой).

остался открытым вопрос: как в монитор порта вывести номер звонящего?

завтра попытаюсь доработать до состояния: кто ставит на охрану тому и приходит смс.



#include<SoftwareSerial.h>
SoftwareSerial mySerial(2, 3);

#define DoorPin 4                              // концевик
#define Sensor 5                               // датчик движения
#define Led 6                                  // статус
#define Buz 7                                  // сирена

int flag1=0;                                  // флаг состояния
int guard = 0;                                // Охрана: 1 - включена, 0 - выключена.

char* TELL[2] = {"79123456789", "79123456788"};                   // номера хозяина
char SensorOn[] = "Dvijeniye na objekte! ";
char DoorOn[]   = "Dver' otkrita! ";
String LastEvent = LastEvent;

void setup() {              /// При подаче питания сигнализация выкл
    Serial.begin(9600);
    pinMode(4, INPUT_PULLUP);
    pinMode(5, INPUT_PULLUP);
    pinMode(6, OUTPUT);
    pinMode(7, OUTPUT);
      digitalWrite(Led, HIGH);                     // мигнем светодиодом о включении     
  InitModem();
    if (guard != 0) guard = 0;                     // проверяем значение в еепром, пишем 0
  eepromconfig();
      delay(2000);
      digitalWrite(Led, LOW);
  Serial.println(LastEvent);
  for(char j=0;j<2;j++){
        sms(String(LastEvent), String(TELL[j]));   // Посылаем СМС: 
        delay(2000);
    } 
}

void loop() {
  LED();
//===============================Ищим RING=============================== 
  if(mySerial.find("RING")){                        // если нашли RING
      mySerial.println("AT+CLIP=1");                 // включаем АОН, 
      Serial.println("RING");
      delay(500);
      while(1){                                     // в цикле
       if (mySerial.find(TELL[0]) || mySerial.find(TELL[1])) {                 // ищим номер телефона, если нашли
         guard = (guard==0 ? 1 : 0);                  // меняем режим  
         if (guard == 1) {
  eepromconfig();
           digitalWrite(Buz, HIGH);                 // пикаем сиреной 1 раз
           delay(100);
           digitalWrite(Buz, LOW);   
 }
         if (guard == 0)  {
  eepromconfig();
           digitalWrite(Buz, HIGH);                 // пикаем сиреной 2 раза
           delay(100);
           digitalWrite(Buz, LOW);
           delay(500); 
           digitalWrite(Buz, HIGH);
           delay(100); 
           digitalWrite(Buz, LOW);
     }
         break;                                     // и выходим
 }     else{                                        // иначе 
         mySerial.println("AT+CPAS");               // спрашиваем состояние модема   
         delay(100);
         if (mySerial.find("+CPAS: 0")) break;      // и если он в "готовности", выходим из цикла
       }                                            // если звонок в процессе, возвращает +CPAS: 3
     }                                              // и крутимся дальше
        delay(500);
        mySerial.println("ATH0");                   // сбрасываем вызов 
  eepromconfig();
        delay(1000);
  Serial.println(LastEvent); 
        for(char j=0;j<2;j++){
        sms(String(LastEvent), String(TELL[j]));   // Посылаем СМС: 
        delay(2000);
       } 
        delay(2000);
  clearsms();
   } 
//===========================Первое срабатывание датчика движения======
    if (digitalRead(Sensor) && flag1==0 && guard==1){
       digitalWrite(Buz, HIGH);                              // сирена 5 сек
  Serial.println("Sensor");
  flag1++;
       delay(5000);                                          
       digitalWrite(Buz, LOW);
       delay(5000);                                          // ждем 5 сек
  }
//===========================Повторное срабатывание датчика движения========
    if (digitalRead(Sensor) && flag1==1 && guard==1){
       digitalWrite(Buz, HIGH);                              // сирена 10 сек
  eepromconfig();
  Serial.println(SensorOn);
       for(char j=0;j<2;j++){
        sms(String((SensorOn) + (LastEvent)), String(TELL[j]));   // Посылаем СМС:
        delay(2000);
        }
  flag1++;
       delay(10000);                                          
       digitalWrite(Buz, LOW);        
  }
    if (flag1>=2) {                                          // возвращаемся к первому срабатыванию датчика движения
      flag1=0; 
    }
//==========================Cрабатывание датчика двери========
    if (digitalRead(DoorPin/* || Door2Pin*/) && guard==1) { 
       digitalWrite(Buz, HIGH);                    // сирена 
  guard=0;
  eepromconfig();
  Serial.println((DoorOn) + (LastEvent));
       mySerial.println("ATD+"+(String)TELL[0]+";");               // отзваниваемся
  Serial.println("ATD+"+(String)TELL[0]+";");
       delay(100);
      if (mySerial.find("OK")) Serial.println("OK!");
      else Serial.println("error");
      mySerial.println("NO CARRIER");             // ищим сброс вызова
       mySerial.println("ATH");                    // сбрасываем вызов
     if (mySerial.println("NO CARRIER" || "ATH")) {     // ищим сброс вызова или сбрасываем 
       delay(2000);
        for(char j=0;j<2;j++){
        sms(String((DoorOn) + (LastEvent)), String(TELL[j]));   // Посылаем СМС:  
        delay(2000);
       } 
       delay(20000);                              // время сирены                                    
       digitalWrite(Buz, LOW);        
    }
  }
}

void LED() {
  if (guard == 1) {                                // если в режиме охраны
           digitalWrite(Led, HIGH);                // мигаем светодиодом через 0,2/2сек         
           delay(200); 
           digitalWrite(Led, LOW);
           delay(2000); 
 } 
  if (guard == 0) {                                //  если охрана снята, можно удалить если не надо
    if (digitalRead(DoorPin)){                     // проверяем датчики, 
       digitalWrite(Led, HIGH);                    // включаем LED постоянно при открытой двери
    } else digitalWrite(Led, LOW);                 // иначе гасим его,
  }
}

void eepromconfig() {                   /// конфигурирование
    if (guard == 1) LastEvent = "System -> On";
    if (guard == 0) LastEvent = "System -> Off";
}

void InitModem()  {                     /// включение и инициализация модема
     delay(2000);                                  // ждем включения модема
  Serial.begin(9600); 
     mySerial.begin(9600);
  Serial.println("GSM NEOWAY M590");
     mySerial.println("AT");
     delay(100);
     mySerial.println("AT+CLIP=1");                // включить АОН
     delay(100);
     mySerial.println("AT+CMGF=1");                // текстовый формат SMS
     delay(100);
     mySerial.println("AT+CSCS=\"GSM\"");          // кодировка текста - GSM
     delay(100);
     mySerial.println("AT+CNMI=2,2");
     delay(100);
  Serial.println("Modem OK"); 
     delay(1000);                                  
}
 
void clearsms() {                       /// очистка смс с симкарты
  mySerial.println("AT+CMGD=1,4");
  } 

void sms(String text, String phone) {              /// отправка СМС
  Serial.println("Start SMS send"); 
    mySerial.println("AT+CMGS=\"" + phone + "\"");
    delay(500);
    mySerial.print(text);
    delay(500);
    mySerial.print((char)26);
    delay(500);
  Serial.println("SMS send OK");
    delay(5000);
}

установил arduino ide 1.8.1 скетч стал весить еще меньше:

Скетч использует 7768 байт (54%) памяти устройства. Всего доступно 14336 байт.
Глобальные переменные используют 591 байт (57%) динамической памяти, оставляя 433 байт для локальных переменных. Максимум: 1024 байт.