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

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

А с чего Вы взяли, что он сравнивается первым? Где печати из строк 73 и 77. Почему Вы их не привели?

Я вот так уверет, что он сравнивается не с первым, а со вторым - пустым.

Переделайте checkPhone вот так

int CheckPhone() {
  Serial.print("Val="); Serial.println(val);
  for (i = 0; i <= 4; i++) {
    Serial.print("i="); Serial.print(i); Serial.print("; AlarmPhone[i]=>"); Serial.print(AlarmPhone[i]); Serial.println('<');
    if (val.indexOf(AlarmPhone[i]) > -1) {
      RingPhone = AlarmPhone[i];
      Serial.println("Comparison OK: Alarm: " + RingPhone);
      return 1;
    }
  }
  return 0;
}

и покажите мне что печатает, только всё, а не обрывки.

 

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

вот: 

Val=
RING

+CLIP: "7911138----",145,,,"",0

i=0; AlarmPhone[i]=>79111386232<
Comparison OK: Alarm: 79111386232
Master Ring OK!

OK

вот номера из ЕЕПРОМ:

AlarmPhone[0]: 79111111111
AlarmPhone[1]: 
AlarmPhone[2]: 
AlarmPhone[3]: 
AlarmPhone[4]: 

 

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

странно, перенос строки

return 0;

 в 79 строку помог.

теперь норм сравнивает свой/чухой

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

Не знаю, что Вы куда перенесли. Только попробуйте напечатать списо телефонов из EEPROM где-нибудь ещё, после их ввода.

Например, в том же checkPhone - узнаете много интересного. И мне печать покажите

int CheckPhone() {
	for (i = 0; i <= 4 ; i++) {
	   Serial.print("AlarmPhone[");
	   Serial.print(i);
	   Serial.print("]=");
	   Serial.println(AlarmPhone[i]);
	 }
  Serial.print("Val="); Serial.println(val);
  for (i = 0; i <= 4; i++) {
	 Serial.print("i="); Serial.print(i); Serial.print("; AlarmPhone[i]=>"); Serial.print(AlarmPhone[i]); Serial.println('<');
    if (val.indexOf(AlarmPhone[i]) > -1) {
      RingPhone = AlarmPhone[i];
      Serial.println("Comparison OK: Alarm: " + RingPhone);
      return 1;
    }
  }
  return 0;
}

 

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

ЕвгенийП пишет:

Не знаю, что Вы куда перенесли. Только попробуйте напечатать списо телефонов из EEPROM где-нибудь ещё, после их ввода.

Например, в том же checkPhone - узнаете много интересного. И мне печать покажите

int CheckPhone() {
	for (i = 0; i <= 4 ; i++) {
	   Serial.print("AlarmPhone[");
	   Serial.print(i);
	   Serial.print("]=");
	   Serial.println(AlarmPhone[i]);
	 }
  Serial.print("Val="); Serial.println(val);
  for (i = 0; i <= 4; i++) {
	 Serial.print("i="); Serial.print(i); Serial.print("; AlarmPhone[i]=>"); Serial.print(AlarmPhone[i]); Serial.println('<');
    if (val.indexOf(AlarmPhone[i]) > -1) {
      RingPhone = AlarmPhone[i];
      Serial.println("Comparison OK: Alarm: " + RingPhone);
      return 1;
    }
  }
  return 0;
}

 


в 152 посте, список телефонов получен командой phone из еепром. доберусь до компа еще попробую.

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

Причём тут 152 второй. Сделайте то, что я просил. Я не сомневаюсь, что в епром всё нормально, а вот в том, что Вы не читаете их друга на друга - сомневаюсь. Сделайте.

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

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

[0]: 79111111111
[1]: 
[2]: 
[3]: 
[4]: 
AT

OK
ATI

NEOWAY
M590
REVISION 01.30e

OK
AT+CLIP=1


Val=
RING

+CLIP: "79111380000",145,,,"",0

i=0; AlarmPhone[i]=>79111111111<
i=1; AlarmPhone[i]=><
Comparison OK: Alarm: 
Master Ring OK!
ATH0

OK

 

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

Нет, здесь нет моей печати, что в строках 2-7. Что-то Вы не так вставили. Покажите-ка скетч.

pasha413
Offline
Зарегистрирован: 27.11.2016
#include <EEPROM.h> 
#include<SoftwareSerial.h>
SoftwareSerial mySerial(2, 3);

int i;
uint8_t ch = 0;
char Phone[12] = "";   
byte Adress[5] = {25, 40, 55, 70, 85}; //занимаем ячейки для пяти номеров.

String val = "";             
String RingPhone = "";  // номер звонившего.
String AlarmPhone[5];   // номера для постановки/снятии с охраны и отправки смс.

void setup() {
    Serial.begin(9600);
  InitModem();
  eepromconfig();
}

void loop() {
  if (mySerial.available()) {          // есть данные от GSM модуля.
    delay(200);                        // выждем, чтобы строка успела попасть в порт целиком.
    while (mySerial.available()) {     // сохраняем входную строку в переменную val.
      ch = mySerial.read();
      val += char(ch);
      delay(50);
    }
    if (val.indexOf(F("+PBREADY")) > -1) InitModem(); // если модем перезапустился запускаем инициализацию.
    if (val.indexOf(F("RING")) > -1) {                 // если обнаружен вызов.
      if (CheckPhone() == 1) {                        // проверяем номер, если наш.
        mySerial.println(F("ATH0"));                  // сбрасываем вызов.
  Serial.println("Master Ring OK!");
//  MasterRing();                      
      } else {
  Serial.println("NO Master Ring!");
        mySerial.println(F("ATH0"));                  // если не наш, сбрасываем его.
        } 
    } else                                            // пишем переменные в монитор порта.
  Serial.println(val);                            
    val = "";
  }  if (Serial.available()) { 
    while (Serial.available()) { 
     uint8_t ch = Serial.read();
      val += char(ch);
      delay(20);
    }
  Serial.println(val);
  ConsolePrint();
    val = "";  
  }
}

void eepromconfig() {
    pinMode(13, OUTPUT);
    if (EEPROM.read(0) != 1) {
      for (int i = 0 ; i < 20 ; i++) {
        EEPROM.update(i, 255);
        delay(10);
      }
      EEPROM.update(0, 1);   // 
      digitalWrite(13, HIGH);
    }   
    if (EEPROM.read(0) == 1) {
       for (i = 0; i <= 4 ; i++) {
         EEPROM.get(Adress[i], Phone);        // считываем массив символов
         AlarmPhone[i] = Phone;
  Serial.println(String(F("[")) + i + String(F("]: ")) + AlarmPhone[i]); 
       } 
    }
}

int CheckPhone() {
  for (i = 0; i <= 4 ; i++) {
     Serial.print("AlarmPhone[");
     Serial.print(i);
     Serial.print("]=");
     Serial.println(AlarmPhone[i]);
   }
  Serial.print("Val="); Serial.println(val);
  for (i = 0; i <= 4; i++) {
   Serial.print("i="); Serial.print(i); Serial.print("; AlarmPhone[i]=>"); Serial.print(AlarmPhone[i]); Serial.println('<');
    if (val.indexOf(AlarmPhone[i]) > -1) {
      RingPhone = AlarmPhone[i];
      Serial.println("Comparison OK: Alarm: " + RingPhone);
      return 1;
    }
  }
  return 0;
}


void ConsolePrint() {
    if(val.indexOf(F("master:")) > -1) { // добавление мастер-номера
      master(val.substring(19, 20).toInt(), val.substring(7, 18));
// sms типа: " master:79111111111 1 " - номер + ячейка, куда записать номер
    }
    if(val.indexOf(F("phone")) > -1)   { // проверка мастер-номеров     
  Masterphone();
    }
    if(val.indexOf(F("reset")) > -1)   { // сброс ЕЕПРОМ
      for (int i = 0 ; i < 100 ; i++) {
       EEPROM.update(i, 0);
      } 
  Serial.println(F("reset all!"));  
  Masterphone();
    }
}

void Masterphone () {
      for (i = 0; i <= 4 ; i++) {
        EEPROM.get(Adress[i], Phone);        // считываем массив символов
         AlarmPhone[i] = Phone;
  Serial.println(String(F("AlarmPhone[")) + i + String(F("]: ")) + AlarmPhone[i]); 
      } 
}

int master (int i, String num) {
      if (i <= 4) {
        num.toCharArray(Phone, 12);
  Serial.println(String(F("[")) + i + String(F("]: ")) + Phone);
        EEPROM.put(Adress[i], Phone);           // записываем массив в EEPROM 
      num = "";
      } else Serial.println(F("MAX number [4]!"));          // у меня 5 номеров максимум
}

void InitModem() {       /// === инициализация модема === ///
  delay(2000);
  Serial.begin(9600); 
  mySerial.begin(9600);
  mySerial.println(F("AT"));
  delay(100);
  mySerial.println(F("ATI"));
  delay(100);
  mySerial.println(F("AT+CLIP=1"));
  delay(100);
  mySerial.println(F("AT+CMGF=1")); 
  delay(100);
  mySerial.println(F("AT+CSCS=\"GSM\""));
  delay(100);
  mySerial.println(F("AT+CNMI=2,2")); // 0,0,0
  delay(100);
}

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

 

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

pasha413 пишет:
Вообщем если есть пустая ячейка памяти номеров из 5 забиты то любой (чужой) номер определяет как свой. если забить все 5 ечеек , то норм работает!

Я Вам уже писал, что это происходит потому, что indexOf "находит" пустую строку. Т.е. если Вы при помощи indexOf ищете пустую строку, то он всегда скажет, что нашел. Проверяйте на пустые строки и не ищите их indexOf, и всё будет нормально.

А мою печать Вы мне так и не покажете? Ну, дело хозяйское.

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

еще раз напишу:
157 пост это ответ на CheckPhone по вашему коду!
159 пост это полный код с вашим CheckPhone!
так понимаюval не успевает попасть в мон тор, поэтому прилетает позже?

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

pasha413 пишет:
еще раз напишу: 157 пост это ответ на CheckPhone по вашему коду! 159 пост это полный код с вашим CheckPhone! так понимаюval не успевает попасть в мон тор, поэтому прилетает позже?

Да, вот нет, что-то там не так. Вот смотрите в коде строки 73-78. Должны печататься все пять AlarmPhone, а печатаются только 2 (строки 24-25 лога). Так не должно быть.

Давайте строкам 73-78 присобачим начало и конец, посмотрим ещё разок. Вот так запустите

Serial.println("------ Test print begins -------);  
for (i = 0; i <= 4 ; i++) {
     Serial.print("AlarmPhone[");
     Serial.print(i);
     Serial.print("]=");
     Serial.println(AlarmPhone[i]);
   }
Serial.println("------ Test print ended-------);  

 

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

загрузил скетч

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

int i;
uint8_t ch = 0;
char Phone[12] = "";   
byte Adress[5] = {25, 40, 55, 70, 85}; //занимаем ячейки для пяти номеров.

String val = "";             
String RingPhone = "";  // номер звонившего.
String AlarmPhone[5];   // номера для постановки/снятии с охраны и отправки смс.

void setup() {
    Serial.begin(9600);
  InitModem();
  eepromconfig();
}

void loop() {
  if (mySerial.available()) {          // есть данные от GSM модуля.
    delay(200);                        // выждем, чтобы строка успела попасть в порт целиком.
    while (mySerial.available()) {     // сохраняем входную строку в переменную val.
      ch = mySerial.read();
      val += char(ch);
      delay(50);
    }
    if (val.indexOf(F("+PBREADY")) > -1) InitModem(); // если модем перезапустился запускаем инициализацию.
    if (val.indexOf(F("RING")) > -1) {                 // если обнаружен вызов.
      if (CheckPhone() == 1) {                        // проверяем номер, если наш.
        mySerial.println(F("ATH0"));                  // сбрасываем вызов.
  Serial.println("Master Ring OK!");
//  MasterRing();                      
      } else {
  Serial.println("NO Master Ring!");
        mySerial.println(F("ATH0"));                  // если не наш, сбрасываем его.
        } 
    } else                                            // пишем переменные в монитор порта.
  Serial.println(val);                            
    val = "";
  }  if (Serial.available()) { 
    while (Serial.available()) { 
     uint8_t ch = Serial.read();
      val += char(ch);
      delay(20);
    }
  Serial.println(val);
  ConsolePrint();
    val = "";  
  }
}

void eepromconfig() {
    pinMode(13, OUTPUT);
    if (EEPROM.read(0) != 1) {
      for (int i = 0 ; i < 20 ; i++) {
        EEPROM.update(i, 255);
        delay(10);
      }
      EEPROM.update(0, 1);   // 
      digitalWrite(13, HIGH);
    }   
    if (EEPROM.read(0) == 1) {
       for (i = 0; i <= 4 ; i++) {
         EEPROM.get(Adress[i], Phone);        // считываем массив символов
         AlarmPhone[i] = Phone;
  Serial.println(String(F("[")) + i + String(F("]: ")) + AlarmPhone[i]); 
       } 
    }
}

int CheckPhone() {
Serial.println("------ Test print begins -------");  
for (i = 0; i <= 4 ; i++) {
     Serial.print("AlarmPhone[");
     Serial.print(i);
     Serial.print("]=");
     Serial.println(AlarmPhone[i]);
   }
Serial.println("------ Test print ended-------");  
  Serial.print("Val="); Serial.println(val);
  for (i = 0; i <= 4; i++) {
   Serial.print("i="); Serial.print(i); Serial.print("; AlarmPhone[i]=>"); Serial.print(AlarmPhone[i]); Serial.println('<');
    if (val.indexOf(AlarmPhone[i]) > -1) {
      RingPhone = AlarmPhone[i];
      Serial.println("Comparison OK: Alarm: " + RingPhone);
      return 1;
    }
  }
  return 0;
}


void ConsolePrint() {
    if(val.indexOf(F("master:")) > -1) { // добавление мастер-номера
      master(val.substring(19, 20).toInt(), val.substring(7, 18));
// sms типа: " master:79111111111 1 " - номер + ячейка, куда записать номер
    }
    if(val.indexOf(F("phone")) > -1)   { // проверка мастер-номеров     
  Masterphone();
    }
    if(val.indexOf(F("reset")) > -1)   { // сброс ЕЕПРОМ
      for (int i = 0 ; i < 100 ; i++) {
       EEPROM.update(i, 0);
      } 
  Serial.println(F("reset all!"));  
  Masterphone();
    }
}

void Masterphone () {
      for (i = 0; i <= 4 ; i++) {
        EEPROM.get(Adress[i], Phone);        // считываем массив символов
         AlarmPhone[i] = Phone;
  Serial.println(String(F("AlarmPhone[")) + i + String(F("]: ")) + AlarmPhone[i]); 
      } 
}

int master (int i, String num) {
      if (i <= 4) {
        num.toCharArray(Phone, 12);
  Serial.println(String(F("[")) + i + String(F("]: ")) + Phone);
        EEPROM.put(Adress[i], Phone);           // записываем массив в EEPROM 
      num = "";
      } else Serial.println(F("MAX number [4]!"));          // у меня 5 номеров максимум
}

void InitModem() {       /// === инициализация модема === ///
  delay(2000);
  Serial.begin(9600); 
  mySerial.begin(9600);
  mySerial.println(F("AT"));
  delay(100);
  mySerial.println(F("ATI"));
  delay(100);
  mySerial.println(F("AT+CLIP=1"));
  delay(100);
  mySerial.println(F("AT+CMGF=1")); 
  delay(100);
  mySerial.println(F("AT+CSCS=\"GSM\""));
  delay(100);
  mySerial.println(F("AT+CNMI=2,2")); // 0,0,0
  delay(100);
}

команда "phone" дает номера

phone

AlarmPhone[0]: 79111380000
AlarmPhone[1]: 79111111111
AlarmPhone[2]: 
AlarmPhone[3]: 
AlarmPhone[4]: 

при звонке с непрописанного номера

[0]: 79111380000
[1]: 79111111111
[2]: 
[3]: 
[4]: 
AT

OK
ATI

NEOWAY
M590
REVISION 01.30e

OK
AT+CLIP=1


------ Test print begins -------
AlarmPhone[0]=79111380000
AlarmPhone[1]=79111111111
AlarmPhone[2]=
AlarmPhone[3]=
AlarmPhone[4]=
------ Test print ended-------
Val=
RING

+CLIP: "79531480000",145,,,"",0

i=0; AlarmPhone[i]=>79111380000<
i=1; AlarmPhone[i]=>79111111111<
i=2; AlarmPhone[i]=><
Comparison OK: Alarm: 
Master Ring OK!
ATH0

OK


+CMT: "+79531480000",,"17/04/25,16:38:56+18"
???? ??????? ??

еще вариант: записывать 1:

    if(val.indexOf(F("reset")) > -1)   { // сброс ЕЕПРОМ
      for (int i = 0 ; i < 100 ; i++) {
       EEPROM.update(i, 1);
      } 

тогда в порт пишет номера так:

i=0; AlarmPhone[i]=>79111380000<
i=1; AlarmPhone[i]=>79111111111<
i=2; AlarmPhone[i]=><
i=3; AlarmPhone[i]=><
i=4; AlarmPhone[i]=><

и номера нормально определяет, свой/чужой

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

Ну, в общем намудрили Вы ... просто не ищите пустыет строки и будет Вам счастье.

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

Вообщем вот что получилось.

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

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

       GSM сигнализация 
   При первом включении или сбросе на заводские:
- снята с охраны (нужно прописать мастер-номера).
- вызов при сработке датчиков включен.
- СМС оповещение включено.
- концевик двери включен.
- датчик движения включен.
- датчик газа/дыма включен.
- оповещение по аварийной температуре выключено (нужно прописать интервалы температуры).
 
При первом запуске Надо прописать основной мастер номер, 
для этого нужно позвонить с основного номера.
остальные номера добавляются по смс.
 

команды консоли:

  master:79111234567 1   master: - кодовое слово. 79111234567 номер мастера. 1 - ячейка куда сохранить/перезаписать номер.
  balance:100           balance: - кодовое слово. 100 номер баланса без * и #.
  phone                      прислать все прописанные мастер-номера.
  clear                        очистить все прописанные мастер-номера, состояние первого запуска.
  info                          состояние системы (датчиков вкл/выкл).
  reset                        сброс на заводские (первый запуск).
  money                     проверка баланса на сим (нужно прописать номер баланса). придет ответным смс.
  guardon/off            вкл/выкл сигнализации/либо вызовом с любого прописанного номера.
  rindon/off               вкл/выкл оповещения вызовом о сработке датчиков.
  smson/off               вкл/выкл оповещения смс о сработке датчиков.
  dooron/off              вкл/выкл концевик двери. 
  piron/off                 вкл/выкл датчик движения.
  gason/off                вкл/выкл датчик газа.  
  tempon/off             вкл/выкл аварийного оповещания об аварийной температуре.
  temp                        вывести температуру с датчика, показать мин и макс уставку.
  mint:10                   минимальная температура.
  maxt:90                  максимальная температура.

интересно что при команде tempon/off выполняется и команда temp. пока незнаю ка кэтого избежать.

вроде как-то так, и ни чего не забыл.

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


OneWire ds(8);                              // датчик температуры подключен к 8 пину, подтяжка 4.7кОм на +.
#define DOOR 4                              // концевик двери.
#define PIR 6                               // датчик движения.
#define GAS A0                              // датчик дыма.
#define BUZ 10                              // сирена.
#define GLed 11                             // состояние датчиков. горит - открыты.
#define BLed 12                             // состояние системы, моргает - норма.

// DOOR - если сработал, на входе "+" HIGH
// PIR  - если сработал, на входе "+" HIGH
// GAS  - если сработал, на входе "+" HIGH
// BUZ  - если "-" LOW, то горит. 
// GLed - если "-" LOW, то горит.
// BLed - если "-" LOW, то горит.

// RLED   -------           
// LED+   --------   RGB светодиод       
// GLED   ------           
// BLED   -----           

boolean Guard = 0;          // Охрана:             1 - вкл, 0 - выкл.
boolean AlarmRING = 1;      // вызов:              1 - вкл, 0 - выкл.
boolean SendSMS = 1;        // отправка смс:       1 - вкл, 0 - выкл.

boolean DOORon = 1;         // концевик двери:     1 - вкл, 0 - выкл.    
boolean PIRon = 1;          // датчик движения:    1 - вкл, 0 - выкл.
boolean GASon = 1;          // датчик дыма:        1 - вкл, 0 - выкл.
boolean TEMPon = 0;         // датчик темературы:  1 - вкл, 0 - выкл.

boolean DOORFlag = 1;       
boolean PIRFlag = 1;
boolean GASFlag = 1;
boolean TEMPFlag = 0;

boolean DOORState = LOW;    // Состояние концевика двери.
boolean PIRState = LOW;     // Состояние датчика движения.

boolean Firststart;         // первый старт.
uint8_t PIRcount = 3;       // Кол-во сигналов PIR - 3

int i;
int GASThres = 400;         // предельная концентрация газа
uint8_t ch = 0;
char Bal[4] = "";           
char TEMPmin[4];       // минимальный предел температуры
char TEMPmax[4];       // максимальный предел температуры
char Phone[12] = "";        
byte Adress[5] = {25, 40, 55, 70, 85}; //занимаем ячейки для пяти номеров.

String val = "";             
String temperatura;// переменная для хранения текущей температуры
String RingPhone = "";  // номер звонившего.
String AlarmPhone[5];   // номера для постановки/снятии с охраны и отправки смс.
String BalanceNumber;   // баланс симкарты

uint8_t PIRDetectCount = 0;
uint16_t previousAlarmMillis = 0;
uint8_t AlarmInterval = 10; // Секунд до отключения "тревожного" пина.

boolean BLedState = HIGH;
uint16_t previousMillis = 0;
uint8_t interval = 100;  

/* EEPROM Data:
  № ячейки - значение;
  0 - если записана не 1, то необходимо затереть часть памяти eeprom'a и восстановить стандартную конфигурацию.
  1 - Guard = 0;      // Охрана:                         1 - вкл, 0 - выкл.
  2 - AlarmRING = 1;  // Звонок:                         1 - вкл, 0 - выкл. 
  3 - SendSMS = 1;    // отправка смс:                   1 - вкл, 0 - выкл.
  4 - DOORon = 1;     // концевик двери:                 1 - вкл, 0 - выкл.
  5 - PIRon = 1;      // датчик движения:                1 - вкл, 0 - выкл.
  6 - GASon = 1;      // датчик дыма:                    1 - вкл, 0 - выкл.
  7 - TEMPon = 0;     // датчики аварийной температуры:  1 - вкл, 0 - выкл.
  8 - PIRcount = 3;   // количество срабатываний датчика  = 3.
  9 - Firststars = 1; // первый запуск = 1;
  10 - граница минимальной температуры
  15 - граница максимальной температуры
*/

void setup() {
    Serial.begin(9600);
  pinMode(DOOR, INPUT_PULLUP);
  pinMode(PIR, INPUT);
  pinMode(GAS, INPUT);
  pinMode(BUZ, OUTPUT);
  pinMode(GLed, OUTPUT);
  pinMode(BLed, OUTPUT);
    digitalWrite(BUZ, HIGH);
    digitalWrite(GLed, HIGH);
  InitModem();
  eepromconfig();
    digitalWrite(BLed, HIGH);
}

void loop() {
  Led();
  AlarmPinOff();
  Temperatura();
  Detect();
    if (mySerial.available()) {          // есть данные от GSM модуля.
    delay(200);                        // выждем, чтобы строка успела попасть в порт целиком.
    while (mySerial.available()) {     // сохраняем входную строку в переменную val.
      ch = mySerial.read();
      val += char(ch);
      delay(50);
    }
    if (val.indexOf(F("+PBREADY")) > -1) InitModem(); // если модем перезапустился запускаем инициализацию.
    if (val.indexOf(F("RING")) > -1) {                 // если обнаружен вызов.
      if (CheckPhone() == 1) {                        // проверяем номер, если наш.
        mySerial.println(F("ATH0"));                  // сбрасываем вызов.
  Serial.println(F("Master Ring OK!"));
  MasterRing();                      
      } else {
  Serial.println(F("NO Master Ring!"));
        mySerial.println(F("ATH0"));                  // если не наш, сбрасываем его.
        } 
    } else if (val.indexOf(F("+CMT:")) > -1) {        //если обнаружен СМС
  MasterSMS();
        if (CheckPhone() == 1) {                        //если СМС от хозяина
//  MasterSms();
        } 
      } else if (val.indexOf(F("+CUSD:")) > -1) { 
      delay(1000);
  eepromconfig();
      val = String(val.substring(val.indexOf(",") + 2,val.indexOf("?")) + String(F("\n"))); 
  Serial.println(val);
//sms(String(val), String("+" + RingPhone));
      delay(1000);
        } else                                            // пишем переменные в монитор порта.
  Serial.println(val);                            
    val = "";
  }  if (Serial.available()) { 
    while (Serial.available()) { 
     uint8_t ch = Serial.read();
      val += char(ch);
      delay(20);
    }
  Serial.println(val);
  ConsolePrint();
    val = "";  
  }
}

void eepromconfig() {
    pinMode(13, OUTPUT);
    if (EEPROM.read(0) != 1) {
      for (int i = 0 ; i < 20 ; i++) {
        EEPROM.update(i, 255);
        delay(10);
      }
      EEPROM.update(1, 0);   // Guard     охрана
      EEPROM.update(2, 1);   // AlarmRING вызов
      EEPROM.update(3, 1);   // SendSMS   смс
      EEPROM.update(4, 1);   // DOORon     датчик движения
      EEPROM.update(5, 1);   // PIRon     датчик движения
      EEPROM.update(6, 1);   // GASon     датчик газа
      EEPROM.update(7, 0);   // TEMPon    датчик температуры
      EEPROM.update(8, 1);   // PIRcount. 3 повторных срабатывания.
      EEPROM.update(9, 1);   // Firststart
      EEPROM.update(10, 1);     // 
      EEPROM.update(15, 1);    // 
      EEPROM.update(0, 1);   // 
      digitalWrite(13, HIGH);
       for (i = 0; i < 5 ; i++) {
         EEPROM.put(Adress[i], Phone);        // пишем массив символов
  Serial.println(F("EEPROM != 1/ RESET!")); 
      } 
    }
    if (EEPROM.read(0) == 1) {
      Guard = EEPROM.read(1);       //
      AlarmRING = EEPROM.read(2);   //
      SendSMS = EEPROM.read(3);     //
      DOORon = EEPROM.read(4);      //
      PIRon = EEPROM.read(5);       //
      GASon = EEPROM.read(6);       //
      TEMPon = EEPROM.read(7);      //
      PIRcount = EEPROM.read(8);    //
      Firststart = EEPROM.read(9);  //
      EEPROM.get(10, TEMPmin);      //
      EEPROM.get(15, TEMPmax);      //
  Masterphone();    
    }
}

int CheckPhone() {        /// === проверка телефона === ///
  if (Firststart == 0) {
    for (i = 0; i <= 4; i++) {
      if (val.indexOf(AlarmPhone[i]) > -1) {
        RingPhone = AlarmPhone[i];                   // если телефон наш, запоминаем его.
  Serial.println(String(F("Ring: ")) + RingPhone);          
        return 1;
      } 
    }  
  } else {
      int ind = val.indexOf("+CLIP:") + 8;
      String num = val.substring(ind, ind + 11);
      num.toCharArray(Phone, 12);
  Serial.println(String(F("[0]: ")) + Phone); 
      EEPROM.put(25, Phone);
      EEPROM.update(9, 0);
      Firststart = 0;
  Serial.println(String(F("Firststart: ")) + Firststart);
      return 1;
  }
  return 0;
}

void Detect() {           /// === чтение датчиков === ///
  DOORState = digitalRead(DOOR);
  PIRState = digitalRead(PIR);
  int Smoky = analogRead(GAS);
  
  if (DOORState == HIGH && DOORFlag == 0) { // датчик сработал
    DOORFlag = 1;
    delay(100);
  Serial.println("Dver' otkrita");
    if (DOORon == 1) Alarm(); 
  }
  if (DOORState == LOW && DOORFlag == 1)  { // Датчик успокоился
    DOORFlag = 0;
    delay(100);
  }
  if (PIRState == HIGH)                   { // датчик сработал
    PIRDetectCount++;
    if (PIRDetectCount == PIRcount && PIRFlag == 0) {
      PIRDetectCount = 0;
      PIRFlag = 1;
      delay(100);
  Serial.println(String(F("Dvizenie!  ")) + PIRcount);
    if (PIRon == 1) Alarm();
    }
  }
  if (PIRState == LOW && PIRFlag == 1)    { // Датчик успокоился
    PIRFlag = 0;
    delay(100);
  }
  if (Smoky > GASThres && GASFlag == 0)   { // датчик сработал
      GASFlag = 1;
      delay(100);
  Serial.println(F("Srabotal datchik gasa! "));
    if (GASon == 1) Alarm();
  } 
  if (Smoky < GASThres  && GASFlag == 1)  { // Датчик успокоился
      GASFlag = 0; 
      delay(100);
  }
/*  if (TEMPon == 1 && TEMPFlag == 0)       { //
    if (temperatura < TEMPmin || temperatura > TEMPmax) {
      TEMPFlag = 1;
      delay(100);
  Serial.println(String(F("Vnimanie, temperatura: ")) + temperatura + String(F("*C")));
  Serial.println(String(F("TEMPmin: ")) + TEMPmin + String(F(". TEMPmax: ")) + TEMPmax);
      Alarm();
    } 
  } else if (temperatura > TEMPmin || temperatura < TEMPmax) {
      TEMPFlag = 0;
      delay(100);
  }*/
}

void Alarm() {
  if (Guard == 1) {
    previousAlarmMillis = millis();
    digitalWrite(BUZ, LOW);
  Serial.println(F("Alarmon"));  
    for (int i = 0; i < 5; i++) {
      if (DOORFlag == 1 && SendSMS == 1) {
//sms(String(F("Srabotal datchik dveri! ")), String("+" + String(AlarmPhone[i])));
      }
      if (PIRFlag == 1 && SendSMS == 1) {
//sms(String(F("Srabotal datchik dvizheniya! ")), String("+" + String(AlarmPhone[i])));
      }
      if (GASFlag == 1 && SendSMS == 1) {
//sms(String(F("Srabotal datchik gasa! ")), String("+" + String(AlarmPhone[i])));
      }
      if (TEMPFlag == 1) {
//sms(String(F("Temperatura vyshla za granicy! )), String("+" + String(AlarmPhone[i])));
      }
      delay(1000);
    }
    if (AlarmRING == 1) {
      mySerial.println("ATD+" + String(AlarmPhone[0]) + ";");
      delay(1000);
    }
  }
}

void Led() {              /// === состояние светодиодов === ///
  if (Guard == 0) {
    digitalWrite(BLed, HIGH);
      if (DOORFlag == 1 || PIRFlag == 1 || GASFlag == 1) {
        digitalWrite(GLed, LOW);
      }
      if (DOORFlag == 0 || PIRFlag == 0 || GASFlag == 0) {
        digitalWrite(GLed, HIGH);
      } 
  }
  if (Guard == 1) {
  uint16_t currentMillis = millis();
  //проверяем не прошел ли нужный интервал, если прошел то
    if (currentMillis - previousMillis > interval) {
      // сохраняем время последнего переключения
      previousMillis = currentMillis;
      // если светодиод не горит, то зажигаем, и наоборот
      if (BLedState == HIGH) BLedState = LOW;
      else BLedState = HIGH;
      digitalWrite(BLed, BLedState);
    }
  }
}

void MasterRing() {
  if (Guard == 1) GuardOff();
  else if (Guard == 0) GuardOn();
}

void GuardOff() {
    Guard = 0;
    EEPROM.update(1, Guard);
    delay(1000);
  Serial.println(String(F("System -> off. Ring: ")) + RingPhone);
  for (i = 0; i < 5; i++) {
    if (RingPhone == String(AlarmPhone[i]));
    delay(1000);
//sms(String(F("System -> off. Ring: ")), String("+" + RingPhone));
    delay(1000);
  }
}

void GuardOn() {         
    Guard = 1;
    EEPROM.update(1, Guard);
    delay(1000);
  Serial.println(String(F("System -> on. Ring: ")) + RingPhone);
  for (i = 0; i < 5; i++) {
    if (RingPhone == String(AlarmPhone[i]));
    delay(1000);
//sms(String(F("System -> on. Ring: ")), String("+" + RingPhone));
    delay(1000);
  }
}

void AlarmPinOff() {      
  uint16_t currentAlarmMillis = millis();
  if (currentAlarmMillis - previousAlarmMillis > AlarmInterval * 1000) {
    digitalWrite(BUZ, HIGH);
  }
}

void ConsolePrint() {
    val.toLowerCase();
  if (val.indexOf(F("master:")) > -1)  { // добавление мастер-номера
      master(val.substring(19, 20).toInt(), val.substring(7, 18));
// sms типа: " master:79111386232 1 " - номер + ячейка, куда записать номер
    }
  if (val.indexOf(F("balance:")) > -1) { // добавление номера баланса
      balnum(val.substring(8, 13));
// sms типа: " balance:100 " - номер
    }
  if (val.indexOf(F("phone")) > -1)    { // проверка мастер-номеров     
  Serial.println(F("Phone:"));  
  Masterphone();
    }
  if (val.indexOf(F("clear")) > -1)    { // сброс телефонов
      for (i = 0 ; i >= 20 , i < 100 ; i++) {
       EEPROM.update(i, 1);
      } 
  Serial.println(F("Clear all phone!"));  
  Masterphone();
    }
  if (val.indexOf(F("mint:")) > -1)    { // минимальный предел температуры
    String mint(val.substring(5, 11));
// sms типа: " mint:8 " - 
    mint.toCharArray(TEMPmin, 4);
  Serial.println(String(F("MinT: ")) + TEMPmin);
    EEPROM.put(10, TEMPmin);           // записываем массив в EEPROM 
  }
  if (val.indexOf(F("maxt:")) > -1)    { // максимальный предел температуры
    String maxt(val.substring(5, 11));
// sms типа: " maxt:105 " - 
    maxt.toCharArray(TEMPmax, 4);
  Serial.println(String(F("MaxT: ")) + TEMPmax);
    EEPROM.put(15, TEMPmax);           // записываем массив в EEPROM 
  }
  if (val.indexOf(F("reset")) > -1)    { // сброс ЕЕПРОМ
//      for (i = 0; i < 100 ; i++) {
       EEPROM.update(0, 0);
//      } 
  Serial.println(F("Reset System!"));  
  }
  if (val.indexOf(F("info")) > -1)     { // инфо о состоянии системы
    delay(1000);
      Guard = EEPROM.read(1);       //
      AlarmRING = EEPROM.read(2);   //
      SendSMS = EEPROM.read(3);     //
      DOORon = EEPROM.read(4);      //
      PIRon = EEPROM.read(5);      //
      GASon = EEPROM.read(6);      //
      TEMPon = EEPROM.read(7);     //
      PIRcount = EEPROM.read(8);    //
  Serial.println(String(F("Guard: ")) + Guard + String(F(". RING: ")) + AlarmRING + String(F(". SMS: ")) + SendSMS);  
  Serial.println(String(F("DOOR: ")) + DOORon + String(F(". PIR: ")) + PIRon + String(F(". TEMP: ")) + TEMPon + String(F(". GAS: ")) + GASon);  
      delay(1000);
  }
  if (val.indexOf(F("temp")) > -1)     { // запрос баланса
  Temperatura();
    delay(1000);
      EEPROM.get(10, TEMPmin);      //
      EEPROM.get(15, TEMPmax);      //
  Serial.println(String(F("Temperatura ")) + temperatura + String(F("*C")));
  Serial.println(String(F("TEMPmin ")) + TEMPmin + String(F("; TEMPmax ")) + TEMPmax);
    delay(1000);
  }
  if (val.indexOf(F("money")) > -1)    { // запрос баланса
    delay(1000);
    balance();
    delay(1000);
  }
  if (val.indexOf(F("guardon")) > -1)  { // вкл сигнализации
    delay(1000);
    GuardOn();
  }
  if (val.indexOf(F("guardoff")) > -1) { // откл сигнализации
    delay(1000);
    GuardOff();
  }
  if (val.indexOf(F("ringon")) > -1)   { // вкл вызов при сработке
    delay(1000);
    AlarmRING = 1;
    EEPROM.update(2, AlarmRING);
  Serial.println(F("AlarmRing -> on"));      
    delay(1000);
  }
  if (val.indexOf(F("ringoff")) > -1)  { // выкл вызов при сработке
    delay(1000);
    AlarmRING = 0;
    EEPROM.update(2, AlarmRING);
  Serial.println(F("AlarmRing -> off"));  
    delay(1000);
  }
  if (val.indexOf(F("smson")) > -1)    { // вкл смс при сработке
    delay(1000);
    SendSMS = 1;
    EEPROM.update(3, SendSMS);
  Serial.println(F("SendSMS -> on"));  
    delay(1000);
  }
  if (val.indexOf(F("smsoff")) > -1)   { // выкл смс при сработке
    delay(1000);  
    SendSMS = 0;
    EEPROM.update(3, SendSMS);
  Serial.println(F("SendSMS -> off"));  
    delay(1000);
  }
  if (val.indexOf(F("dooron")) > -1)   { // вкл датчик движения
    delay(1000);
    DOORon = 1;
    EEPROM.update(4, DOORon);
  Serial.println(F("DOOR -> on"));  
    delay(1000);
  }
  if (val.indexOf(F("dooroff")) > -1)  { // выкл датчик движения
    delay(1000);
    DOORon = 0;
    EEPROM.update(4, DOORon);
  Serial.println(F("DOOR -> off"));  
    delay(1000);
  }
  if (val.indexOf(F("piron")) > -1)    { // вкл датчик движения
    delay(1000);
    PIRon = 1;
    EEPROM.update(5, PIRon);
  Serial.println(F("PIR -> on"));  
    delay(1000);
  }
  if (val.indexOf(F("piroff")) > -1)   { // выкл датчик движения
    delay(1000);
    PIRon = 0;
    EEPROM.update(5, PIRon);
  Serial.println(F("PIR -> off"));  
    delay(1000);
  }
  if (val.indexOf(F("gason")) > -1)    { // вкл датчика газа
    delay(1000);
    GASon = 1;
    EEPROM.update(6, GASon);
  Serial.println(F("GAS -> on"));  
    delay(1000);
  }
  if (val.indexOf(F("gasoff")) > -1)   { // выкл датчика газа
    delay(1000);
    GASon = 0;
    EEPROM.update(6, GASon);
  Serial.println(F("GAS -> off"));  
    delay(1000);
  }  if ((val.indexOf(F("tempon")) > -1)) {    // вкл аварийной темературы
    delay(1000);
    TEMPon = 1;
    EEPROM.update(7, TEMPon);
  Serial.println(F("TEMP -> on"));  
    delay(1000);
  }
  if (val.indexOf(F("tempon")) > -1)  { // выкл аварийной темературы
    delay(1000);
    TEMPon = 1;
    EEPROM.update(7, TEMPon);
  Serial.println(F("TEMP -> on"));  
    delay(1000);
  }
  if (val.indexOf(F("tempoff")) > -1)  { // выкл аварийной темературы
    delay(1000);
    TEMPon = 0;
    EEPROM.update(7, TEMPon);
  Serial.println(F("TEMP -> off"));  
    delay(1000);
  }
}

void MasterSMS() {        /// === мастер смс === ///
    val.toLowerCase();
  if (val.indexOf(F("master:")) > -1)  { // добавление мастер-номера
      master(val.substring(19, 20).toInt(), val.substring(7, 18));
// sms типа: " master:79111386232 1 " - номер + ячейка, куда записать номер
    }
  if (val.indexOf(F("balance:")) > -1) { // добавление номера баланса
      balnum(val.substring(8, 13));
// sms типа: " balance:100 " - номер
    }
  if (val.indexOf(F("phone")) > -1)    { // проверка мастер-номеров     
  Serial.println(F("Phone:"));  
  Masterphone();
    }
  if (val.indexOf(F("clear")) > -1)    { // сброс телефонов
      for (i = 0 ; i >= 20 , i < 100 ; i++) {
       EEPROM.update(i, 1);
      } 
  Serial.println(F("Clear all phone!"));  
  Masterphone();
    }
  if (val.indexOf(F("mint:")) > -1)    { // минимальный предел температуры
    String mint(val.substring(5, 11));
// sms типа: " mint:8 " - 
    mint.toCharArray(TEMPmin, 4);
  Serial.println(String(F("MinT: ")) + TEMPmin);
    EEPROM.put(10, TEMPmin);           // записываем массив в EEPROM 
  }
  if (val.indexOf(F("maxt:")) > -1)    { // максимальный предел температуры
    String maxt(val.substring(5, 11));
// sms типа: " maxt:105 " - 
    maxt.toCharArray(TEMPmax, 4);
  Serial.println(String(F("MaxT: ")) + TEMPmax);
    EEPROM.put(15, TEMPmax);           // записываем массив в EEPROM 
  }
  if (val.indexOf(F("reset")) > -1)    { // сброс ЕЕПРОМ
//      for (i = 0; i < 100 ; i++) {
       EEPROM.update(0, 0);
//      } 
  Serial.println(F("Reset System!"));  
  }
  if (val.indexOf(F("info")) > -1)     { // инфо о состоянии системы
    delay(1000);
      Guard = EEPROM.read(1);       //
      AlarmRING = EEPROM.read(2);   //
      SendSMS = EEPROM.read(3);     //
      DOORon = EEPROM.read(4);      //
      PIRon = EEPROM.read(5);      //
      GASon = EEPROM.read(6);      //
      TEMPon = EEPROM.read(7);     //
      PIRcount = EEPROM.read(8);    //
  Serial.println(String(F("Guard: ")) + Guard + String(F(". RING: ")) + AlarmRING + String(F(". SMS: ")) + SendSMS);  
  Serial.println(String(F("DOOR: ")) + DOORon + String(F(". PIR: ")) + PIRon + String(F(". TEMP: ")) + TEMPon + String(F(". GAS: ")) + GASon);  
      delay(1000);
  }
  if (val.indexOf(F("temp")) > -1)     { // запрос баланса
  Temperatura();
    delay(1000);
      EEPROM.get(10, TEMPmin);      //
      EEPROM.get(15, TEMPmax);      //
  Serial.println(String(F("Temperatura ")) + temperatura + String(F("*C")));
  Serial.println(String(F("TEMPmin ")) + TEMPmin + String(F("; TEMPmax ")) + TEMPmax);
    delay(1000);
  }
  if (val.indexOf(F("money")) > -1)    { // запрос баланса
    delay(1000);
    balance();
    delay(1000);
  }
  if (val.indexOf(F("guardon")) > -1)  { // вкл сигнализации
    delay(1000);
    GuardOn();
  }
  if (val.indexOf(F("guardoff")) > -1) { // откл сигнализации
    delay(1000);
    GuardOff();
  }
  if (val.indexOf(F("ringon")) > -1)   { // вкл вызов при сработке
    delay(1000);
    AlarmRING = 1;
    EEPROM.update(2, AlarmRING);
  Serial.println(F("AlarmRing -> on"));      
    delay(1000);
  }
  if (val.indexOf(F("ringoff")) > -1)  { // выкл вызов при сработке
    delay(1000);
    AlarmRING = 0;
    EEPROM.update(2, AlarmRING);
  Serial.println(F("AlarmRing -> off"));  
    delay(1000);
  }
  if (val.indexOf(F("smson")) > -1)    { // вкл смс при сработке
    delay(1000);
    SendSMS = 1;
    EEPROM.update(3, SendSMS);
  Serial.println(F("SendSMS -> on"));  
    delay(1000);
  }
  if (val.indexOf(F("smsoff")) > -1)   { // выкл смс при сработке
    delay(1000);  
    SendSMS = 0;
    EEPROM.update(3, SendSMS);
  Serial.println(F("SendSMS -> off"));  
    delay(1000);
  }
  if (val.indexOf(F("dooron")) > -1)   { // вкл датчик движения
    delay(1000);
    DOORon = 1;
    EEPROM.update(4, DOORon);
  Serial.println(F("DOOR -> on"));  
    delay(1000);
  }
  if (val.indexOf(F("dooroff")) > -1)  { // выкл датчик движения
    delay(1000);
    DOORon = 0;
    EEPROM.update(4, DOORon);
  Serial.println(F("DOOR -> off"));  
    delay(1000);
  }
  if (val.indexOf(F("piron")) > -1)    { // вкл датчик движения
    delay(1000);
    PIRon = 1;
    EEPROM.update(5, PIRon);
  Serial.println(F("PIR -> on"));  
    delay(1000);
  }
  if (val.indexOf(F("piroff")) > -1)   { // выкл датчик движения
    delay(1000);
    PIRon = 0;
    EEPROM.update(5, PIRon);
  Serial.println(F("PIR -> off"));  
    delay(1000);
  }
  if (val.indexOf(F("gason")) > -1)    { // вкл датчика газа
    delay(1000);
    GASon = 1;
    EEPROM.update(6, GASon);
  Serial.println(F("GAS -> on"));  
    delay(1000);
  }
  if (val.indexOf(F("gasoff")) > -1)   { // выкл датчика газа
    delay(1000);
    GASon = 0;
    EEPROM.update(6, GASon);
  Serial.println(F("GAS -> off"));  
    delay(1000);
  }  if ((val.indexOf(F("tempon")) > -1)) {    // вкл аварийной темературы
    delay(1000);
    TEMPon = 1;
    EEPROM.update(7, TEMPon);
  Serial.println(F("TEMP -> on"));  
    delay(1000);
  }
  if (val.indexOf(F("tempon")) > -1)  { // выкл аварийной темературы
    delay(1000);
    TEMPon = 1;
    EEPROM.update(7, TEMPon);
  Serial.println(F("TEMP -> on"));  
    delay(1000);
  }
  if (val.indexOf(F("tempoff")) > -1)  { // выкл аварийной темературы
    delay(1000);
    TEMPon = 0;
    EEPROM.update(7, TEMPon);
  Serial.println(F("TEMP -> off"));  
    delay(1000);
  }
    mySerial.println("AT+CMGD=1,4");       // очищаем смс
}

void balance() {          /// === проверка баланса сим-карты === ///
  EEPROM.get(21, Bal);        // считываем массив символов
  mySerial.println("AT+CUSD=1");
  delay(200);
  mySerial.println(String("ATD#") + Bal + String("#"));
  delay(200);
}

void Masterphone() {     /// === чтение мастер-номеров === ///
      for (i = 0; i <= 4 ; i++) {
        EEPROM.get(Adress[i], Phone);        // считываем массив символов
         AlarmPhone[i] = Phone;
  Serial.println(String(F("Phone [")) + i + String(F("]: ")) + AlarmPhone[i]); 
      } 
        EEPROM.get(21, Bal);        // считываем массив символов
  Serial.println(String(F("Balance []: ")) + Bal);
        Firststart = EEPROM.read(8);  //
  Serial.println(String(F("Firststart: ")) + Firststart);
}

int master (int i, String num) { /// === добавляем мастер-номер === ///
      if (i <= 4) {
        num.toCharArray(Phone, 12);
  Serial.println(String(F("[")) + i + String(F("]: ")) + Phone);
        EEPROM.put(Adress[i], Phone);           // записываем массив в EEPROM 
        if (i == 0) {
          EEPROM.update(8, 0);
          Firststart = 0;
  Serial.println(String(F("Firststart: ")) + Firststart);
        }      
      num = "";
      } else Serial.println(F("MAX number [4]!"));          // у меня 5 номеров максимум
}

int balnum (String num) { /// === добавляем номер баланса === ///
      num.toCharArray(Bal, 4);
  Serial.println(String(F("balance []: ")) + Bal);
      EEPROM.put(21, Bal);           // записываем массив в EEPROM 
      num = "";
}

void Temperatura() {      /// === измеряем температуру === ///
  byte data[2];
  ds.reset();
  ds.write(0xCC);
  ds.write(0x44);
  delay(750);
  ds.reset();
  ds.write(0xCC);
  ds.write(0xBE);
  data[0] = ds.read();
  data[1] = ds.read();
  int Temp = (data[1] << 8) + data[0];
  temperatura = Temp >> 4;
}

void InitModem() {        /// === инициализация модема === ///
  delay(2000);
  Serial.begin(9600); 
  mySerial.begin(9600);
  mySerial.println(F("AT"));
  delay(100);
  mySerial.println(F("ATI"));
  delay(100);
  mySerial.println(F("AT+CLIP=1"));
  delay(100);
  mySerial.println(F("AT+CMGF=1")); 
  delay(100);
  mySerial.println(F("AT+CSCS=\"GSM\""));
  delay(100);
  mySerial.println(F("AT+CNMI=2,2")); // 0,0,0
  delay(100);
}

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

 

пожелания и обоснованная  критика (потому как я не программист, а только учусь)приветствуются! 

smesharik
Offline
Зарегистрирован: 31.01.2016

народ в чем может быть косяк

G590 модуль подключаю к TTL конвертору at команды принимает отправляет

подключаю к любой ардуинке UNO, Nano к портам tx/rx SoftwareSerial mySerial(0, 1); // RX, TX

ни чего не происходит, хоть местами меняй провода

задаю SoftwareSerial mySerial(2, 3); // RX, TX работает на ура

что за трабла с этими D0, D1 они специально для этого и созданы, ладно бы на одной плате, так на всех одинакого?

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

нано?  вы апаратную часть нано понимаете? отключите от нее нафик тогда ее собственный конвертер, он мешает.

уно тоже разные бывают, бывает с резисторами между процем и конвертером который на борту, а бывает и нет..

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

smesharik
Offline
Зарегистрирован: 31.01.2016

теперь ясно, спасибо

Shurup.81
Offline
Зарегистрирован: 11.05.2017

Подскажите , можно ли подключить к этому проекту mp3 модуль ? Просто он тоже подключается по serial . Получится сделать два SowtwareSerial`a  ?

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

все можно, только нужно ли?? это древний модуль 590й, к тому же много брака, 50% брака, купите чтото посовременее, где уже есть мр проигрыватель.

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

модуль умеет показывать %  от остатка аккумулятора:

 

void CBC()
{ val = ""; delay(100); // очищаем буфер val
  Ubat = ""; delay(100);
  Serial.println("cbc"); delay(50);
  gsm.println(F("AT+cbc"));  delay(50);
  gsmread();
  Serial.println(val);  delay(50);
//at+cbc
//+CBC: 0,70
    Ubat = val.substring(val.indexOf(F("+CBC:"))+8,val.indexOf(F("+CBC:"))+10);   // для 590х
    Serial.println(Ubat);  delay(50);
    val = "";
}
 
 
void gsmread()
{
  if (gsm.available())
  { //если GSM модуль что-то послал нам, то
    delay(5); while (gsm.available())   {
      ch = gsm.read();
      val += char(ch);
      delay(1);
    }}}

 

Shurup.81
Offline
Зарегистрирован: 11.05.2017

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

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

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

Shurup.81
Offline
Зарегистрирован: 11.05.2017

Я нашел только  3 модуля 590й , sim800 , sim900 . С встроенным mp3 не нашел . Вы имели ввиду встроить мп3 модуль в сам датчик движения ?

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

учите матчасть того чтонашли...  ине спешите шаманить с бубном как многие здесь поступают.

olexob
Offline
Зарегистрирован: 12.02.2017

Почему после открытия двери сигнал выключается?

тоесть сломают замок, войдут и тут бонус- сигнализациия выключилась. Может оставить сирену вкл. секунд на 30

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

помоему я делал сирену установленное время и снимает с сигнализации, при закрытии двери становится на охрану.

smesharik
Offline
Зарегистрирован: 31.01.2016

столкнулся с проблемой

есть проект поливалки: часы ds1307, модуль m590 + обвязка

так то все работает, но на заключительной стадии, хотел приделать чтобы при посылке смс вида on73030 (это типо таймер включения 7:30:30) , каждые данные часы минуты секунды уходили в eeprom, каждый выделять substring,  так часы имеют byte а данный у нас string

подскажите как их подружить?!  

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

сконвертировать байт в стринг - есть куча примеров..

smesharik
Offline
Зарегистрирован: 31.01.2016

я видел только примеры байты --> стринг конвертировали, а стринг --> байт по сути не видел, только такой нашел

char CharArrayVar[8] = {1,0,1,1,0,0,1,1};
char CharVar = 0;
for(int i = 0; i<8; i++){
  CharVar |= lCharArrayVar[i] << (7-i);
}
PORTD = CharVar;

 

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

выложите программу или кусок что нужно сделать, может там по факту нужно шагать иным путем.

smesharik
Offline
Зарегистрирован: 31.01.2016

Сильно не пинать, только учусь строка 382, например при посылке смс вида clockon73030 надо чтобы 7 часов передавалось переменной setHorClockOn, 30 --> setMinClockOn, 30 --> seSecClockOn но эти переменные имеют Byte , а 7 30 30 string


#include <EEPROM.h>
#include <Wire.h>
#include <SoftwareSerial.h>
#include <iarduino_RTC.h>
#include <LiquidCrystal_I2C.h>
iarduino_RTC time(RTC_DS1307);  
//LiquidCrystal_I2C lcd(0x3f,20,4); //2004
LiquidCrystal_I2C lcd(0x27,16,2);
SoftwareSerial mySerial(7, 8);          // RX, TX78

String val = "";
String level_w = ""; 
String timer = "";

int nedela[4][7] = {{0, 1, 2, 3, 4, 5, 6 }, {1, 1, 1, 1, 1, 3, 5}, {1, 1, 1, 1, 1, 1, 5}, {1, 1, 1, 2, 3, 4, 5}};
int i;
#define  BLINK_INTERVAL  250UL // время для проверки уровня воды в баке
//LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
String master_phone = "+79222222222";
int K = 1;
int P = 0;
byte setSecClockOn; // 
byte setMinClockOn; // 
byte setHorClockOn;
byte setSecClockOff;
byte setMinClockOff; // 
byte setHorClockOff;
byte settimer;
byte setdate;
const int sensor1 = 2;             // уровень бака 1 верх2
const int sensor2 = 3;             // уровень бака 2 низ3
int BL = 6;                        // шим индикатора
const byte outPin = 4;             // выход на реле клапана
const byte outLedRelay = 5;        // выход на реле наполнение бака
const int button_analog = A2;
int valuebutton = 0;
byte valA; //переменная времени
long previousMillisA = 0;
byte valX; //переменная времени
long previousMillisX = 0;
byte val_led; //переменная времени
long previousMillis_led = 0;

int on_led = 1;
int timer_on = 25; //время опроса датчика сек
int timer_ojidan = 18; //время на ожидание между включениями
int time_led = 10; //время на гашение экрана
byte kapla[8] = {0b00100,0b00100,0b01110,0b01110,0b11111,0b11111,0b01110,0b00100};
byte lampa[8] = {0b01110,0b11111,0b11111,0b11111,0b01110,0b01110,0b00000,0b00100};
byte clocka[8] = {B00100,B01110,B00100,B11111,B10011,B10101,B10001,B11111};
byte bak[8] = {B10001,B10001,B10001,B11111,B10001,B11111,B11111,B11111};

byte key(){ //// для кнопок ЛСДшилда
 valuebutton = analogRead(button_analog);

if (valuebutton > 715 && valuebutton < 740) return 1; //запоминаем значение кнопки
else if (valuebutton > 620 && valuebutton < 650) return 2;
else if (valuebutton > 450 && valuebutton < 480) return 4;
else if (valuebutton > 760 && valuebutton < 800) return 3;
else if (valuebutton >= 0 && valuebutton < 100) return 5;
 else return 0;
 }
 
/////////// часы ..
void setClock(){ // установка часов
  byte pos = 1;
     lcd.clear();
    lcd.blink();
   while(key() != 1){ // крутим   цикл   
    byte KEY = key(); // читаем состояние кнопок
      delay(200);
    lcd.setCursor(1, 1);
    lcd.print("set to save");
    lcd.setCursor(0, 0);     // выводим инфу
     if (time.Hours < 10) lcd.print("0");
    lcd.print(time.Hours);
    lcd.print(":");
     if (time.minutes < 10) lcd.print("0"); 
    lcd.print(time.minutes);  
    lcd.print(" ");     
     if (time.day < 10) lcd.print("0");
    lcd.print(time.day);
    lcd.print("/");
     if (time.month < 10) lcd.print("0");
    lcd.print(time.month);
    lcd.print("/");      
    lcd.print(time.year);
  
    lcd.setCursor(pos, 0); // устанавливаем курсор согласно позиции
    if (KEY == 5 && pos < 13) pos += 3; // крутим позицию
    else if (KEY == 2 && pos > 1) pos -= 3;
    
    else if (pos == 1 && KEY == 3) time.Hours++ ; // крутим значения
    else if (pos == 1 && KEY == 4) time.Hours--;
     else if (pos == 4 && KEY == 3) time.minutes++;
    else if (pos == 4 && KEY == 4) time.minutes--;    
    else if (pos == 7 && KEY == 3) time.day++;
    else if (pos == 7 && KEY == 4) time.day--;    
    else if (pos == 10 && KEY == 3) time.month++;
    else if (pos == 10 && KEY == 4) time.month--;
    else if (pos == 13 && KEY == 3) time.year++;
    else if (pos == 13 && KEY == 4) time.year--; 
   
   if (time.Hours > 23) time.Hours = 0;
    else if (time.minutes > 59) time.minutes = 0;
    else if (time.day > 31) time.day = 0;
    else if (time.month > 12) time.month = 1;
    else if (time.year > 99) time.year = 0;
  }// конец цикла
  
 time.settime(-1, time.minutes, time.Hours, time.day, time.month, time.year, -1);
   lcd.noBlink(); 
   lcd.clear();
   lcd.print("     Saved");
   delay(1500);
}///

void setOnOff(){ 
  delay(200);   
  byte pos = 6;
   lcd.clear();
    lcd.blink();

   while(key() != 1){ // крутим   цикл   
    byte KEY = key(); // читаем состояние кнопок
      delay(200);
    lcd.setCursor(0, 0);     // выводим инфу
     lcd.print("On:  "); 
     if (setHorClockOn < 10) lcd.print("0");
    lcd.print(setHorClockOn);
    lcd.print(":");
     if (setMinClockOn < 10) lcd.print("0"); 
    lcd.print(setMinClockOn); 
    lcd.print(":");
    if (setSecClockOn < 10) lcd.print("0"); 
    lcd.print(setSecClockOn); 
    
    // просто вторая строка начало
    lcd.setCursor(0, 1);
    lcd.print("Off: "); 
    if (setHorClockOff < 10) lcd.print("0");
    lcd.print(setHorClockOff);
    lcd.print(":");
     if (setMinClockOff < 10) lcd.print("0");
    lcd.print(setMinClockOff); 
       lcd.print(":");
    if (setSecClockOff < 10) lcd.print("0"); 
    lcd.print(setSecClockOff);
     // просто вторая строка конец
     
     lcd.setCursor(pos, 0); // устанавливаем курсор согласно позиции
    
    if (KEY == 5 && pos < 12) pos += 3; // крутим позицию
    else if (KEY == 2 && pos > 6) pos -= 3;
     
    else if (pos == 6 && KEY == 3) setHorClockOn++; // крутим значения
    else if (pos == 6 && KEY == 4) setHorClockOn--;
    else if (pos == 9 && KEY == 3) setMinClockOn++;
    else if (pos == 9 && KEY == 4) setMinClockOn--; 
    else if (pos == 12 && KEY == 3) setSecClockOn++;
    else if (pos == 12 && KEY == 4) setSecClockOn--;
      if (setHorClockOn > 23) setHorClockOn = 0;
     
    else if (setMinClockOn > 59) setMinClockOn = 0;
    else if (setSecClockOn > 59) setSecClockOn = 0;
  
   }
   delay(700);
   on_sec();
}
   void on_sec(){ //цикл второй строки для выключения таймера
   byte pos = 6;
    while(key() != 1){ // крутим   цикл   
    byte KEY = key(); // читаем состояние кнопок
      delay(200);
 lcd.setCursor(0, 1);     // выводим инфу 
 lcd.print("Off: "); 
     if (setHorClockOff < 10) lcd.print("0");
    lcd.print(setHorClockOff);
    lcd.print(":");
     if (setMinClockOff < 10) lcd.print("0");
    lcd.print(setMinClockOff); 
       lcd.print(":");
    if (setSecClockOff < 10) lcd.print("0"); 
    lcd.print(setSecClockOff); 
    
    lcd.setCursor(pos, 1); // устанавливаем курсор согласно позиции
    
    if (KEY == 5 && pos < 12) pos += 3; // крутим позицию
    else if (KEY == 2 && pos > 6) pos -= 3;
     
    else if (pos == 6 && KEY == 3) setHorClockOff++;
    else if (pos == 6 && KEY == 4) setHorClockOff--;    
    else if (pos == 9 && KEY == 3) setMinClockOff++;
    else if (pos == 9 && KEY == 4) setMinClockOff--;    
    else if (pos == 12 && KEY == 3) setSecClockOff++;
    else if (pos == 12 && KEY == 4) setSecClockOff--;
    
  
    if (setHorClockOff > 23) setHorClockOff = 0;
    else if (setMinClockOff > 59) setMinClockOff = 0;
    else if (setSecClockOff > 59) setSecClockOff = 0;
    
  }// конец цикла
   lcd.noBlink(); 
   lcd.clear();

   EEPROM.write(0, setMinClockOn);
   EEPROM.write(1, setHorClockOn);
   EEPROM.write(3, setMinClockOff);
   EEPROM.write(4, setHorClockOff);
   EEPROM.write(5, setSecClockOn);
   EEPROM.write(6, setSecClockOff);
   

   lcd.print("     Saved");
   delay(1500);
}///

 void constant (){
  delay(200);   
  byte pos = 7;
   lcd.clear();
   lcd.blink();
   while(key() != 1){ // крутим   цикл   
    byte KEY = key(); // читаем состояние кнопок
      delay(200);
    lcd.setCursor(0, 0);
    lcd.print("timer= "); 
    lcd.print(settimer);
    
     lcd.setCursor(pos, 0); // устанавливаем курсор согласно позиции
     if (pos == 7 && KEY == 3) settimer++;
     else if (pos == 7 && KEY == 4) settimer--;   
     if (settimer > 1) settimer = 1;
   }
      lcd.noBlink(); 
   lcd.clear();
   EEPROM.write(7, settimer);
     lcd.print("     Saved");
   delay(1500);
  }
  
void menu(){
  delay(200); 
  lcd.clear();
  char menuTxt[3][14] = {"set ON/OFF >>", "set clock  >>", "Constant >>"};
  byte pos = 0;
  
  while(key() != 1){ 
delay(200); 
byte KEY = key();
  
    
    lcd.setCursor(0, 0);
    lcd.print(pos+1);
    lcd.print(".");
    lcd.print(menuTxt[pos]);
    
    if (KEY == 3 && pos != 0) pos--;
    else if (KEY == 4 && pos < 2) pos++;
    
    if (KEY == 5 && pos == 0) setOnOff();
    else if (KEY == 5 && pos == 1) setClock();
    else if (KEY == 5 && pos == 2) constant();
    }
  lcd.clear();
}  



void level_water(){
  if (digitalRead(sensor1) == HIGH && digitalRead(sensor2) == HIGH){ level_w = String("OFF"); digitalWrite(outLedRelay, HIGH);} 
  if (digitalRead(sensor1) == LOW && digitalRead(sensor2) == HIGH) {level_w = String("3/4");}
  if (digitalRead(sensor1) == LOW && digitalRead(sensor2) == LOW || digitalRead(outLedRelay) == LOW) {level_w = String(" ON"); digitalWrite(outLedRelay, LOW);} 
  if (digitalRead(sensor1) == HIGH && digitalRead(sensor2) == LOW) {level_w = String("ERR"); digitalWrite(outLedRelay, HIGH);}
   }

void blinkind(unsigned long interval ) {    //индикация
  static unsigned long prevTime = 0; //
  if (millis() - prevTime > interval) {
    prevTime = millis();  //
   
}}


void on_led_off()  //подсветка дисплея
{
  if (key() > 0){on_led = 1;}
  if (on_led == 1)
  {
    lcd.backlight();// Включаем подсветку дисплея
    if (millis() - previousMillis_led > 1000)
    {
      previousMillis_led = millis();
      val_led++;
      if (key() > 0){val_led = 0;}
    }

    if (val_led >= time_led)
    {
      val_led = 0;
      on_led = 0;
      lcd.noBacklight();// Включаем подсветку дисплея
    }
  }
}

void phone() //телефон
{

if(mySerial.available()) //если модуль что-то послал
  {  
    char ch = ' ';
    String val = "";
    
    while(mySerial.available()) 
     {  
      
       ch = mySerial.read();
       val += char(ch); //собираем принятые символы в строку
       delay(30);
     }

    Serial.print("Neo send> ");
    Serial.println(val);
    if (val.indexOf("+PBREADY") > -1)InitModem(); // если модем перезапустился запускаем инициализацию.
   
    if (val.indexOf(F("RING")) > -1) {                 // если обнаружен вызов.
      if (val.indexOf(master_phone) > -1) {                        // проверяем номер, если наш.
        mySerial.println(F("ATH0"));                  // сбрасываем вызов.
  Serial.println(F("Master Ring OK!"));
        } else {
  Serial.println(F("NO Master Ring!"));
        mySerial.println(F("ATH0"));                  // если не наш, сбрасываем его.
        }
     }
     
   if (val.indexOf(F("+CMT:")) > -1) { //смс
        val.toLowerCase();
 if (val.indexOf(F("info")) > -1)     { // инфо о состоянии системы
         delay(3000);
         sms(String("Bak: ") + level_w + String(F("\n")) + String("Timer: ") + timer + String(F("\n")) + String("ON: ") + setHorClockOn + String(":") + setMinClockOn + String(":") + setSecClockOn +
         String(F("\n")) + String("OFF: ") + setHorClockOff + String(":") + setMinClockOff + String(":") + setSecClockOff + String(F("\n")) + String("nedela: ") + setdate, String(master_phone));      
 }
 if (val.indexOf(F("timeron")) > -1)     { // включение таймера
    delay(1000); 
    Serial.println(F("timer -> on")); 
    settimer = 1;
    EEPROM.update(7, settimer);
     }
  if (val.indexOf(F("timeroff")) > -1)     { // выключение таймера
    delay(1000); 
    Serial.println(F("timer -> off")); 
    settimer = 0;
    EEPROM.update(7, settimer);
     }
  if (val.indexOf(F("date0")) > -1)     { // каждый день
    delay(1000); 
    Serial.println(F("date -> date")); 
    setdate = 0;
    EEPROM.write(8, setdate);
     }
      if (val.indexOf(F("date1")) > -1)     { // пон, сп, пятн
    delay(1000); 
    Serial.println(F("date -> date")); 
    setdate = 1;
    EEPROM.write(8, setdate);
     }
      if (val.indexOf(F("date2")) > -1)     { // пон, пят
    delay(1000); 
    Serial.println(F("date -> date")); 
    setdate = 2;
    EEPROM.write(8, setdate);
     }
      if (val.indexOf(F("date3")) > -1)     { // будни
    delay(1000); 
    Serial.println(F("date -> date")); 
    setdate = 3;
    EEPROM.write(8, setdate);
     }
   if (val.indexOf(F("clockon")) > -1)     { // редактирование время включения
    delay(1000); 
   
     }
    }
    }
    }

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);
}
  
 void InitModem() {       /// === инициализация модема === ///
  delay(2000);
  mySerial.println("AT+CLIP=1");
  delay(500);
  mySerial.println("AT+CMGF=1");
  delay(500);
  mySerial.println("AT+CSCS=\"GSM\"");
  delay(500);
  mySerial.println("AT+CNMI=2,2,0,0,0"); // 0,0,0
  delay(500);
  mySerial.println("AT+CMGD=1,4");
  delay(500);
}
 
 
void setup(){
  delay(2000);
  Wire.begin(); 
  time.begin();
  lcd.init();   // initialize the lcd 
  lcd.begin(16, 2);
  analogWrite(BL, 50);
  Serial.begin(9600);
  mySerial.begin(9600);
  InitModem();
    
  lcd.clear();
  lcd.createChar(1, kapla);
  lcd.createChar(2, lampa);
  lcd.createChar(3, clocka);
  lcd.createChar(4, bak);
  
  pinMode(outPin, OUTPUT);
  digitalWrite(outPin, HIGH);
  pinMode(outLedRelay, OUTPUT);
  digitalWrite(outLedRelay, HIGH);
    
  setMinClockOn = EEPROM.read(0);
  setHorClockOn = EEPROM.read(1);
  setSecClockOn = EEPROM.read(5);
  setMinClockOff = EEPROM.read(3);
  setHorClockOff = EEPROM.read(4);
  setSecClockOff = EEPROM.read(6);
  settimer = EEPROM.read(7);
  setdate = EEPROM.read(8);
}

void loop()
{
  on_led_off();
  phone();
  level_water();
 
  blinkind(BLINK_INTERVAL);
 
 lcd.setCursor(14, 1); lcd.print(setdate);
 
  if (settimer == 0) timer = String("OFF");
    else timer = String("ON ");
 
  // обработка кнопок
  if (key() == 1) menu(); // если нажата селект
  else if (key() == 3) digitalWrite(outPin, LOW);
  else if (key() == 4) digitalWrite(outPin, HIGH);

  else if (key() == 2) digitalWrite(outLedRelay, LOW);
  else if (key() == 5) digitalWrite(outLedRelay, HIGH);

  // сравниваем время и управляем выходом//
   if (settimer == 1) {   
   for (i = 0; i < 7; i++) { 
   if (nedela[setdate][i] == time.weekday){
    
  if (setMinClockOn == time.minutes && setHorClockOn == time.Hours
      && setSecClockOn == time.seconds) digitalWrite(outPin, LOW);    
  }}}    
  if (setMinClockOff == time.minutes && setHorClockOff == time.Hours
      && setSecClockOff == time.seconds) digitalWrite(outPin, HIGH);
 
  lcd.setCursor(0, 0); lcd.print("\3 ");
  lcd.setCursor(2, 0); lcd.print(timer);  
  
  lcd.setCursor(0, 1); lcd.print("\4");
  lcd.setCursor(2, 1); lcd.print(level_w);  
 
  lcd.setCursor(8, 0); lcd.print(time.gettime("H:i:s"));
 
 lcd.setCursor(8, 1); lcd.print("\1");
     if (digitalRead(outPin)) lcd.print(" X");
    else lcd.print("ON");
      
   delay(50); // нужно для нармальной работы кнопок
}
smesharik
Offline
Зарегистрирован: 31.01.2016

у меня вопрос к pasha413 смог ли опробывать с модемом свой пример?! В плане приема и отправки смс с телефона на модуль?

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

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

smesharik
Offline
Зарегистрирован: 31.01.2016

я почему спрашиваю

через 

if (mySerial.available()) {          // есть данные от GSM модуля.
107     delay(200);                        // выждем, чтобы строка успела попасть в порт целиком.
108     while (mySerial.available()) {     // сохраняем входную строку в переменную val.
109       ch = mySerial.read();
110       val += char(ch);
111       delay(50);
112     }

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

 if (val.indexOf(F("maxt:")) > -1)    { // максимальный предел температуры
554     String maxt(val.substring(5, 11));

не понимала что идет за словом maxt: , он не видел почему то нужной строки с текстом смс

пришлось перейти на 

 char currSymb = gprsSerial.read();
  if ('\r' == currSymb) {
    if (isStringMessage) {
      currStr.toLowerCase();
       if (currStr.indexOf(F("poliv")) > -1)    {
        flag = 1;
        currStr = currStr.substring(5, 8);
        timer_on = currStr.toInt();
      }

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

 

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

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

smesharik
Offline
Зарегистрирован: 31.01.2016

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

kvolk
Offline
Зарегистрирован: 12.06.2017

Всем привет :)

Вот это можно выкинуть, всё равно после того как отвалится модем SoftwareSerial тоже отвалится напрочь, и поможет только перезагрузка ардуины.

if (val.indexOf(F("+PBREADY")) > -1) InitModem(); // если модем перезапустился запускаем инициализацию.

 

kvolk
Offline
Зарегистрирован: 12.06.2017

pasha413 пишет:

интересно что при команде tempon/off выполняется и команда temp. пока незнаю ка кэтого избежать

Ничего удивительного, ведь в tempon и tempoff присутствует подстрока temp. Переименуйте команду "temp" в, например, "showtemp".

pasha413 пишет:

rindon/off 

Может быть ring?

pasha413 пишет:

пожелания и обоснованная  критика (потому как я не программист, а только учусь)приветствуются! 

Уходите от массивов, избегайте дублирования, смотрите в сторону структур. Через некоторое время памяти станет очень нехватать.

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

А можно на примере указать как уйти к структурам, если не сложно.

kvolk
Offline
Зарегистрирован: 12.06.2017

pasha413 пишет:
А можно на примере указать как уйти к структурам, если не сложно.

На "майску" я Вам скидывал уже ссылки. Про структуры тут почитать radioprog.ru/post/117. Смотрите раздел "put()".

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

Спасибо

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

smesharik, извините что так долго небыло, отпуск))) 

нашел косяк в коде, из-за которого не распознавались смс.

надо изменить строчки в коде:

  void MasterSms() {

  if (val.indexOf(F("balance:")) > -1) { // добавление номера баланса
      int bal(val.indexOf(F("balance:")));
      balnum(val.substring(bal + 8, bal + 11));
///// sms типа: " balance:100 " - номер
    }
    if (val.indexOf(F("master:")) > -1)  { // добавление мастер-номера
      int tel(val.indexOf(F("master:")));
      master(val.substring(tel + 19, tel + 20).toInt(), val.substring(tel + 7, tel + 18));
///// sms типа: " master:79111234567 1 " - номер + ячейка, куда записать номер
    }
}

сейчас тестирую модем GSM/GPRS A6

-sergius-
Offline
Зарегистрирован: 07.03.2015
pasha413, кажется в Вашем коде есть ошибки. Датчик движения срабатывает срузу, а должен судя по коду сработать на третий раз.
 
void Temperatura()  а в этой функции притормаживается выполнение программы почти на секунду, кратковременное срабатывание датчика двери может быть незамеченным. Я думаю что нужно избавляться от delay. Я новичок в прогаммировании и так же как и Вы только учусь.
pasha413
Offline
Зарегистрирован: 27.11.2016

sergius, спасибо, как раз разбираюсь с кодом, есть косяки со звонками.

smesharik
Offline
Зарегистрирован: 31.01.2016

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

AT+CLIP=1
OK
AT+CMGF=1
OK
AT+CSCS="GSM"
OK
AT+CMGD=1,4

как будто стоит какое то ограничение на вывод инфы, хотя она вся обрабатывается

а стоит

 gprsSerial.println("AT+CLIP=1");
  delay(300);
  gprsSerial.print("AT+CMGF=1\r");
  delay(300);
  gprsSerial.println("AT+CSCS=\"GSM\"");
  delay(300);
  gprsSerial.println("AT+CMGD=1,4");
  delay(300);
  gprsSerial.print("AT+CNMI=1,2,2,1,0\r");

 

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

smesharik, у меня так было, не хватало строки:
Serial.println(val);
См 165 пост, 136 строка.

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

Столкнулся с проблемой: поменял М590, на пришедший А6, перестала нормально работать программа по все режимам завязанным с модемом:
При вызове проходит Ring после того как положили трубку, что даёт 2 проход по определению номера,
При приеме смс не видит самой смс, вообщем разбираюсь

smesharik
Offline
Зарегистрирован: 31.01.2016

pasha413 пишет:
smesharik, у меня так было, не хватало строки: Serial.println(val); См 165 пост, 136 строка.

половина же отображается, если ее не было тогда вообще не отображалось ничего

pasha413 пишет:
Столкнулся с проблемой: поменял М590, на пришедший А6, перестала нормально работать программа по все режимам завязанным с модемом: При вызове проходит Ring после того как положили трубку, что даёт 2 проход по определению номера, При приеме смс не видит самой смс, вообщем разбираюсь

Скетч использует 19 414 байт (63%) памяти устройства. Всего доступно 30 720 байт.
Глобальные переменные используют 1 089 байт (53%) динамической памяти, оставляя 959 байт для локальных переменных. Максимум: 2 048 байт.

какие у вас значения?

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

С этим все нормально, памяти: 53% и 29%

Замучился я с модемами, М590 не полностью читает смс типа: master:79111234567 1 - читает как  master:791112345 не смог пока победить.

GSM A6 поиск вызова не по RING  а по +CLIP: , иначе RING проходит и после сброса вызова. а это вызывает  второй раз процедуру распознавания номера, но номера нет.

не читает смс, если забить в ардуину код:

#include <SoftwareSerial.h>

SoftwareSerial mySerial(2, 3); // RX, TX

void setup(){  
  Serial.begin(9600);
  mySerial.begin(9600);   
}

void loop() {
  if (mySerial.available())
    Serial.write(mySerial.read());
  if (Serial.available())
    mySerial.write(Serial.read());
}

то смс приходят типа 

+CIEV: "MESSAGE",1
 
+CMT: "+79531234456",,"2017/07/11,18:19:13+03"
master:79111234567 1
 
по коду сигнализации приходит только строка 
+CMT: "+79531234456",,"2017/07/11,18:19:13+03"
не могу понять в чем проблема