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);
  }

 

}

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

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 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 байт.
 
bester
Offline
Зарегистрирован: 25.06.2016

Вызов и смс будет приходить на оба номера или только на тот номер с которого ставилась охрана?

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

bester пишет:

Вызов и смс будет приходить на оба номера или только на тот номер с которого ставилась охрана?


Сейчас занимаюсь данным вопросом:
При постановке - смс тому кто поставил,
При сработке датчика двери вызов первому номеру, смс обоим номерам,
При второй сработке датчика движения смс обоим номерам.
Есть другие предложения?
Хочу еще добавить в смс номер с которого поставили на охрану и баланс на счете - незнаю есть ли смысл.

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

Подробней прочитал предыдущее сообщение, понял, пока сделано так, что смс посылается на все номера

Думаю это правильно

А при снятии или постановке охраны по звонку, смс нужна с информацией номера того, с чьего телефона была снята или поставлена охрана

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

bester пишет:

А при снятии или постановке охраны по звонку, смс нужна с информацией номера того, с чьего телефона была снята или поставлена охрана


Сделано: при постановке/снятии смс подтверждение только тому кто ставит,
Сделаю: при сработке датчиков смс всем номерам, в смс номер поставившего на охрану.

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

очередная доработка:

при постановке/ снятии с охраны смс тому кто ставит/снимает.

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

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

#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", "79123456789"};     // массив номеров хозяев вставить свои номера
char SensorOn[] = "Dvijeniye na objekte! ";
char DoorOn[]   = "Dver' otkrita! ";
String LastEvent = LastEvent;
char* CALLING_TELL = "70000000000";                 // для определиня длинны номера, ничего не менять!

void setup() {             /// При подаче питания сигнализация выкл
    Serial.begin(9600);
    pinMode(DoorPin, INPUT_PULLUP);
    pinMode(Sensor, INPUT_PULLUP);
    pinMode(Led, OUTPUT);
    pinMode(Buz, OUTPUT);
    digitalWrite(Sensor, LOW);            // дадим датчику время на калибровку
      digitalWrite(Led, HIGH);             // включим светодиод для инициализации     
      digitalWrite(Buz, HIGH);             // пикаем сиреной 2 раза
      delay(100);
      digitalWrite(Buz, LOW);
      delay(500); 
      digitalWrite(Buz, HIGH);
      delay(100); 
      digitalWrite(Buz, LOW); 
  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.find("+CLIP: \"");              // обрезаем номер до числового
      mySerial.readBytes(CALLING_TELL, 11);    // записываем номер во временную переменную
      for (char z=0; z<(sizeof(TELL)/sizeof(TELL[0])); z++){
       if ((TELL[z]) == CALLING_TELL);         // сравниваем номер с номерами из массива
      }
  Serial.println ("RING: " + String(CALLING_TELL));
      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(100);
  Serial.println((LastEvent) + "\n\r" + ("Zvonil: ") + (CALLING_TELL)); 
       if (mySerial.find(TELL[1])) {                     // если вызов со второго номера
        sms(String(LastEvent), String(TELL[1]));         // Посылаем СМС на него
       } else sms(String(LastEvent), String(TELL[0]));   // иначе посылаем СМС или на первый
       delay(2000);
  clearsms();
   } 
//===========================Первое срабатывание датчика движения======
    if (digitalRead(Sensor) && flag1==0 && guard==1){
       digitalWrite(Buz, HIGH);                              // включаем сирену 5 сек
  Serial.println("Sensor");
  flag1++;
       delay(5000);                                          
       digitalWrite(Buz, LOW);                               // выключаем сирену
       delay(2000);                                          // ждем 2 сек
  }
//===========================Повторное срабатывание датчика движения========
    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) + "\n\r" + ("Postavil: ") + (CALLING_TELL)), String(TELL[j]));   // Посылаем СМС движение и состояние системы
  Serial.println ((SensorOn) + (LastEvent) + "\n\r" + ("Postavil: ") + (CALLING_TELL));
        delay(2000);
        }
  flag1++;
       delay(10000);                                          
       digitalWrite(Buz, LOW);        
  }
    if (flag1>=2) {                                          // возвращаемся к первому срабатыванию датчика движения
      flag1=0; 
    }
//==========================Cрабатывание датчика двери========
    if (digitalRead(DoorPin) && guard==1) { 
       digitalWrite(Buz, HIGH);                          // сирена 
  guard=0;
  eepromconfig();
       mySerial.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);
  Serial.println((DoorOn) + (LastEvent) + "\n\r" + ("Postavil: ") + (CALLING_TELL));
        for(char j=0;j<2;j++){
        sms(String((DoorOn) + (LastEvent) + "\n\r" + ("Postavil: ") + (CALLING_TELL)), String(TELL[j]));   // Посылаем СМС дверь открыта и состояние системы  
        delay(1000);
       } 
       delay(20000);                               // время сирены 20сек                                   
       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

pasha413 пишет:

 

при постановке/ снятии с охраны смс тому кто ставит/снимает.

 

Не так не пойдет, смс всем надо отсылать. Кто то снимет с охраны и в это время я захочу пройти на объект. Я что сделаю? Правильно позвоню на охрану, что бы снять с охраны, т.к я не знаю, что она снята. Охрана вместо того, чтоб сняться наоборот встанет на охрау, и тогда бл... ревун всех соседей разбудит.

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

Если решите снять с охраны, а она снята, придет смс о постановке на охрану, и зачем снимать с охраны если не на объекте?
Тогда могу доработать скетч под Вашу необходимость (плевое дело - сделать отправку смс на оба номера)
В данный момент никак не могу победить получение баланса в нормальном виде.

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

pasha413 пишет:
и зачем снимать с охраны если не на объекте?

Так допустим ее уже сняли с охраны со второго телефона, через 5 минут иду я и хочу снять с охраны, я то же не знаю, что охрана уже снята вторым телефоном, смс то получил только второй телефон.

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

Нет, кто ставит/снимает тому и смс о снятии/постаноаке.
Сняли вторым телефоном - туда смс off, ставите первым - на первый on.

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

Можете сделать так? поставили на охрау первым номером, всем остальным и первому приходит смс, что охрана снята номером таким то и при снятии так же - всем смс, что охрана снята таким то номером. снимают-ставят на охрану вторым номером-все остальные номера знают, что снимал или ставил на охрану второй номер. 

pasha413
Offline
Зарегистрирован: 27.11.2016
#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", "79123456789"};     // массив номеров хозяев
char SensorOn[] = "Dvijeniye na objekte! ";
char DoorOn[]   = "Dver' otkrita! ";
String LastEvent = LastEvent;
char* CALLING_TELL = "70000000000";                 // для определиня длинны номера, ничего не менять!

void setup() {             /// При подаче питания сигнализация выкл
    Serial.begin(9600);
    pinMode(DoorPin, INPUT_PULLUP);
    pinMode(Sensor, INPUT_PULLUP);
    pinMode(Led, OUTPUT);
    pinMode(Buz, OUTPUT);
    digitalWrite(Sensor, LOW);            // дадим датчику время на калибровку
      digitalWrite(Led, HIGH);             // включим светодиод для инициализации     
      digitalWrite(Buz, HIGH);             // пикаем сиреной 2 раза
      delay(100);
      digitalWrite(Buz, LOW);
      delay(500); 
      digitalWrite(Buz, HIGH);
      delay(100); 
      digitalWrite(Buz, LOW); 
  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.find("+CLIP: \"");              // обрезаем номер до числового
      mySerial.readBytes(CALLING_TELL, 11);    // записываем номер во временную переменную
      for (char z=0; z<(sizeof(TELL)/sizeof(TELL[0])); z++){
       if ((TELL[z]) == CALLING_TELL);         // сравниваем номер с номерами из массива
      }
  Serial.println ("RING: " + String(CALLING_TELL));
      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(100);
  Serial.println((LastEvent) + "\n\r" + ("Zvonil: ") + (CALLING_TELL)); 
        for(char j=0;j<2;j++){
        sms(String((LastEvent) + ("Zvonil: ") + (CALLING_TELL)), String(TELL[j]));         // Посылаем СМС на 2 номера
       delay(2000);
       }
  clearsms();
   } 
//===========================Первое срабатывание датчика движения======
    if (digitalRead(Sensor) && flag1==0 && guard==1){
       digitalWrite(Buz, HIGH);                              // включаем сирену 5 сек
  Serial.println("Sensor");
  flag1++;
       delay(5000);                                          
       digitalWrite(Buz, LOW);                               // выключаем сирену
       delay(2000);                                          // ждем 2 сек
  }
//===========================Повторное срабатывание датчика движения========
    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) + "\n\r" + ("Postavil: ") + (CALLING_TELL)), String(TELL[j]));   // Посылаем СМС движение и состояние системы
  Serial.println ((SensorOn) + (LastEvent) + "\n\r" + ("Postavil: ") + (CALLING_TELL));
        delay(2000);
        }
  flag1++;
       delay(10000);                                          
       digitalWrite(Buz, LOW);        
  }
    if (flag1>=2) {                                          // возвращаемся к первому срабатыванию датчика движения
      flag1=0; 
    }
//==========================Cрабатывание датчика двери========
    if (digitalRead(DoorPin) && guard==1) { 
       digitalWrite(Buz, HIGH);                          // сирена 
  guard=0;
  eepromconfig();
       mySerial.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);
  Serial.println((DoorOn) + (LastEvent) + "\n\r" + ("Postavil: ") + (CALLING_TELL));
        for(char j=0;j<2;j++){
        sms(String((DoorOn) + (LastEvent) + "\n\r" + ("Postavil: ") + (CALLING_TELL)), String(TELL[j]));   // Посылаем СМС дверь открыта и состояние системы  
        delay(1000);
       } 
       delay(20000);                               // время сирены 20сек                                   
       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 пишет:

Можете сделать так? поставили на охрау первым номером, всем остальным и первому приходит смс, что охрана снята номером таким то и при снятии так же - всем смс, что охрана снята таким то номером. снимают-ставят на охрану вторым номером-все остальные номера знают, что снимал или ставил на охрану второй номер. 

прикрепил скетч, должно работать:

 при постановке/снятии смс обоим номерам (состояние системы и звонил номер 89123456789).

 

Скетч использует 8088 байт (56%) памяти устройства. Всего доступно 14336 байт.
Глобальные переменные используют 655 байт (63%) динамической памяти, оставляя 369 байт для локальных переменных. Максимум: 1024 байт.
 
bester
Offline
Зарегистрирован: 25.06.2016

Завтра попробую

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

крутая сига...

контроля наличия регистрации в гсм сети нету...

контроля зависания и ответа 590го - нету..

возможности выключить и включить 590й если он завис - нету..

мигаем светодиодом и если в это время прилетела смс - то нафик ее.. кому она нужна - теряем..

перезаписать  номер хозяина чрез смс с паролем - не можем..

и т.д..

ЗЫ: лучше не морочится а китайскую купить - в десятки и десятки раз надежнее, хотя и китай - туфта.

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

Темой не ошибся? тебе сюда.  http://arduino.ru/forum/obshchii/interesnoe-na-aliexpress-i-ebay

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

спасибо, не ошибся. 

Сейчас ведь хомячкв набежит код себе переписывать - а оно же нни в дугу работать нормально не будет, только и виснуть в самые неожиданные моменты, по разным причинам виснуть. От причин висяков нужно сразу избавляться.

 

ЗЫ:  если кто не понимает, приведу еще один пример проблемы в программе которых там валом:

while(mySerial.find("STARTUP"));           // ждем команды от модема 

если по какой то причине STARTUP не принимается. то в этом месте прога наглухо виснет и никто не понимает почему..

в принципе это называется - "китаский код"... наверое именно так пишут китайцы на свои сигнализации которые везде всем продают. Тоже будем  по китайски делать или как?

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

например если хорошо подумать, то STARTUP совсем там не нужен, абсолютно.. он ничего не рашает а только создает лишнюю проблему.

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

Я вначале писал: "у меня Arduino nano v3 (ATmega168), поэтому как ни крути а все не вместишь в него.
Для моих нужд самое то, тем более цена вопроса в итоге проучается около 300р. За эти деньги ничего похожего не купишь.