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

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

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

можно немного уменьшить место для переменных оптимизировать под нужды например 

009 int flag1=0;                                   // флаг состояния датчика движения

 

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

можно поменять на 

009 byte flag1=0;                                   // флаг состояния датчика движения

 

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

 

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

Да не обращай внимания на подобные реплики, я же говорю, человек попутал раздел форума, зашел в "проекты" со словами - "купить". Продолжай развивать свою сигнализацию. 

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

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

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

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

не важно за какие деньги. Свои знания тоже стоят денег,  и хорошие знания - больше чем стоимость китайской или другой сигнализации, так что думаю вы не правы считая 300 рублей. Кстати там аккумулятор еще нужен, зарядник для аккума и т.д. датчики на 12В нужны, а не те, что на али копеечные они не охранные. Это все нааамного дороже мифических 300 рублей.

Ну и в код для надежности, чтобы  модуль не зависал каждые 2-3 суток ии чаще, нужно ввести подобное:

//********* КОНТРОЛЬ НАЛИЧИЯ РЕГИСТРАЦИИ В GSM СЕТИ *************
  {
    if (millis() - timer2 > 180000)  // если уже прошло 3 мин, то начинаем проверку:
    { timer2 = millis();
      {
        gsm.println("AT+CREG?"); delay(50);
        gsmRead ();                           // читаем ответ
        Serial.println(val); delay(50);       //печатаем в монитор порта пришедшую строку
        if  (val.indexOf("+CREG: 0,0") > -1)  // если ответ что нет регистрации
        { modemOFF();                         // то выключаем модем и все перегружаем
          digitalWrite(pinBOOT, LOW);
          delay(1000);
          digitalWrite(pinBOOT, HIGH);
          modemON ();
        }  val = "";
      }

      {
        gsm.println("AT"); delay(50);
        gsmRead ();                           // читаем ответ
        Serial.println(val); delay(50);       //печатаем в монитор порта пришедшую строку
        if  (val.indexOf("OK") > -1)          //  если ответ, что ОК, то брейк
        {
        }
        else
        { Serial.println("reset gsm"); delay(50);       //печатаем в монитор порта пришедшую строку
          modemOFF();                   // то выключаем модем и все перегружаем
          digitalWrite(pinBOOT, LOW);
          delay(1000);
          digitalWrite(pinBOOT, HIGH);
          modemON ();
        }
      }
    }
    val = "";
  }
//**************конец контроля наличия регистрации в сети *****************

естественно дописать процедуры modemOFF(); и modemON();   а также чтение ответа от модуля  -  gsmRead ();

void modemOFF () 
{
  Serial.println("modem OFF");
  delay(100);
  gsm.println("AT+CPOWD=1");   // дублируем
  delay(100);
  gsm.println("AT+CPOWD=1");   // дублируем
  delay(100);   
  gsm.println("AT+CPOWD=1");
  delay(10000);
}

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

 ну и в таком духе желательно писать весь остальной код или еще лучше.

 

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

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

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

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

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

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

 

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

А код везде останавливается, а еще там гсм модуль который неизвестно как себя поведет, а еще там оператор оборудование которого также может нормальный модуль в ступор вводить и тогда нужно выключить питание гсм модуля а потом включить чтобы сделать новую регистрацию в сети.. По хорошему - на плату ставят ключ по питанию гсм модуля, код что я привел - это по большому счету полумера.

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

Short Circuit пишет:

 

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

А код везде останавливается, а еще там гсм модуль который неизвестно как себя поведет, а еще там оператор оборудование которого также может нормальный модуль в ступор вводить и тогда нужно выключить питание гсм модуля а потом включить чтобы сделать новую регистрацию в сети.. По хорошему - на плату ставят ключ по питанию гсм модуля, код что я привел - это по большому счету полумера.

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

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

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

soznik
Offline
Зарегистрирован: 20.09.2015

590ые глючат ? это правда? можно их покупать или нет?

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

как я понимаю они разные бывают, с током потребления до 2х ампер, у меня более 100мА не потребляет и пока не глючил.

soznik
Offline
Зарегистрирован: 20.09.2015

Мой экземпляр максимум 70 мА.

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

пришел датчик температуры dht22, хочу прикрутить при превышении 50*С (пожар), ну и просто контроль температуры

soznik
Offline
Зарегистрирован: 20.09.2015

dht22 весьма относительный датчик я на температуру везде ставлю даллас ds18b20.

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

pasha413 пишет:
как я понимаю они разные бывают, с током потребления до 2х ампер, у меня более 100мА не потребляет и пока не глючил.

заблуждение. даташиты пробовали читать и вникать??

там все модули гсм потребляют около 2А !!! ВСЕ. и не пишите больше глупостей, читайте даташиты.

Потребление зависит от дальности до базово станции, потребление считается в импульсе, тестером не померяете. Поэтому ВСЕ! варианты питания нужно расчитывать а максимальное питание в импульсе до 2А.

Точка.

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

pasha413 пишет:
dht22, хочу прикрутить при превышении 50*С (пожар)
А для пожара не лучше иметь датчик задымления (MQ3, MQ303A или, на худой конец, MQ2)? Он сработает гораздо раньше, чем температура поднимется.

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

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

pasha413 пишет:
dht22, хочу прикрутить при превышении 50*С (пожар)
А для пожара не лучше иметь датчик задымления (MQ3, MQ303A или, на худой конец, MQ2)? Он сработает гораздо раньше, чем температура поднимется.


согласен, но его пока нет.

soznik
Offline
Зарегистрирован: 20.09.2015

Пробовал программки с постов 39 и45 . Становится и снимается с охраны. Дозвон при срабатывании датчика двери идет.

А с СМС -ми проблема не хочет слать вернее передача идет ( звук в динамиках компьютера) но на телефоны ни чего не приходит и с симки списания денег нет.  Да и посмотрел деталлизацию на сим-ку отправлений нет.

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

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

soznik
Offline
Зарегистрирован: 20.09.2015

С 30 поста работает . Буду разбиратся .

 

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

а при включении тоже нет смс?

soznik
Offline
Зарегистрирован: 20.09.2015

С 30 поста все идут , а 39 и 45 ни одной нет.

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

а номер правильно забит?  79.....?

soznik
Offline
Зарегистрирован: 20.09.2015

да.  дозвон идет.

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

странно. ничего не меняли в программе? я все проверял не один раз - работало!

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

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

soznik пишет:

Пробовал программки с постов 39 и45 . Становится и снимается с охраны. Дозвон при срабатывании датчика двери идет.

А с СМС -ми проблема не хочет слать вернее передача идет ( звук в динамиках компьютера) но на телефоны ни чего не приходит и с симки списания денег нет.  Да и посмотрел деталлизацию на сим-ку отправлений нет.

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

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

Жду продолжения на 328

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

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

soznik
Offline
Зарегистрирован: 20.09.2015

Short Circuit пишет:

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

C 30  поста отправка СМС проходит отлично.

Немного изменил код с поста №45 

1. закоментировал отправку СМС при постановке и снятии охраны т.к. планирую светодиод вывести за дверь.

2. Отправка СМС идет только на один номер (постановка и снятие с двух) например:

#define SMSNUMBER "+7914697XXXX"               // номер на который будем отправлять SMS

и увеличил время задержки перед отправкой СМС ( с 2 сек. после звонка СМС не приходило).

      delay(5000);
  Serial.println((DoorOn) + (LastEvent) + "\n\r" + ("Postavil: ") + (CALLING_TELL));
        sms(String((DoorOn) + (LastEvent)), String(SMSNUMBER));   // Посылаем СМС: открыта дверь

Пока работает всё нормально вечером буду смотреть дальше.

Отправку СМС в setup -е удалил она просто не будет работать т.к. не еще не выполнен void sms

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

у меня работает, при включении смс снято с охраны - хотя это бесполезная смс.

soznik
Offline
Зарегистрирован: 20.09.2015

 Да вообще-то и у меня пытался послать. Но сейчас из-за ненадобностью  это уже удалил.

Сейчас появились другие вопросы. Решил приделать дисплейчик вывести на него напряжение аккамулятора и уровень сигнала.

Так вот вопрос 

mySerial.println("AT+CSQ");          //вывести в терминал уровень сигнала 

   mySerial.println("AT+CSQ");
     delay(100);
     if (mySerial.available()) {          //есть данные от GSM модуля
    delay(200);                        //выждем, чтобы строка успела попасть в порт целиком раньше чем будет считана
    while (mySerial.available()) {      //сохраняем входную строку в переменную val
      ch = mySerial.read();
      val += char(ch);
      delay(10);
    }
    Serial.println(val);
     }    

Как вывдернуть эту переменную.

А именно желательно разделить 28 и 0 т.к. это разные данные или хотя-бы вытянуть 28,0 в отдельную переменную. За одно по этим данным можно контролировать GSM модуль и если пропала связь перезагрузить модуль.

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

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

pasha413 пишет:
dht22, хочу прикрутить при превышении 50*С (пожар)
А для пожара не лучше иметь датчик задымления (MQ3, MQ303A или, на худой конец, MQ2)? Он сработает гораздо раньше, чем температура поднимется.

хм... это называется ДАТЧИК ДЫМА, и не выдумывайте непонятно что с датчиками газа.. там принцип совсем разный.

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

soznik пишет:

 Да вообще-то и у меня пытался послать. Но сейчас из-за ненадобностью  это уже удалил.

Сейчас появились другие вопросы. Решил приделать дисплейчик вывести на него напряжение аккамулятора и уровень сигнала.

Так вот вопрос 

mySerial.println("AT+CSQ");          //вывести в терминал уровень сигнала 

   mySerial.println("AT+CSQ");
     delay(100);
     if (mySerial.available()) {          //есть данные от GSM модуля
    delay(200);                        //выждем, чтобы строка успела попасть в порт целиком раньше чем будет считана
    while (mySerial.available()) {      //сохраняем входную строку в переменную val
      ch = mySerial.read();
      val += char(ch);
      delay(10);
    }
    Serial.println(val);
     }    

 

для начала вам нужно переписать кусок скетча для скорости обмена 9600 в порту:


mySerial.println("AT+CSQ");
  delay(100);
  if (mySerial.available()) {          //есть данные от GSM модуля
 delay(5);                        //выждем, чтобы строка успела попасть в порт целиком раньше чем будет считана
 while (mySerial.available()) {      //сохраняем входную строку в переменную val
   ch = mySerial.read();
   val += char(ch);
   delay(1);
 }
 Serial.println(val);
  }    

 

или у вас она 512 вообще в порту?.. Именно такие задержки должны быть, и никакие другие, и ставьте 9600, и не срашивайте почему.

soznik
Offline
Зарегистрирован: 20.09.2015

Скорость порта стоит 9600 . Сделал опрос уровня сигнала пока через 30 сек для проверки после можно увеличить . но пока ни черта не рабротает как надо 

if (millis() - timer > 30000)  // если уже прошло 30 СЕК, то начинаем проверку:
  {timer = millis();
  mySerial.println("AT+CSQ");
  delay(100);
  if (mySerial.available()) {          //есть данные от GSM модуля
 delay(5);                        //выждем, чтобы строка успела попасть в порт целиком раньше чем будет считана
 while (mySerial.available()) {      //сохраняем входную строку в переменную val
   //mySerial.find("+CLIP: \"");              // обрезаем номер до числового
   ch = mySerial.read();
   val += char(ch);
   delay(1);
 }
 Serial.println(val);
  }
  }    

На первый запрос приходит нормальный ответ на второй в сериале пишет певый и вторй ответ модуля в третьем уже 3 ответа итд. 

И остался вопрос как вытащить числовую часть ответа.

 

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

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

 только когд все части работают по отдельности - собирать в кучу.

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

soznik
Offline
Зарегистрирован: 20.09.2015

Short Circuit пишет:

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

 только когд все части работают по отдельности - собирать в кучу.

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

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

А  не вашых упрёков. И вообще я смотрю вы засветились на всех ветках форума и не одного дельного совета.

Нужен пример : пожалуйста.

там кроме дтмф есть и другое.. ладно. наверное вы не в курсе.

Это одно ваше высказывание. Вот ещё  . Нужно больше ? Про два ампера мы и в этой ветке слышали. На диоде падение относительно стабильно и сильно не зависит от тока. А диоды нужны для развязки питания от сети и от аккумулятора.

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

диоды разные бывают.. эт раз.. и  падение кагбы от тока зависит, вы осцилограф пробовали?

ладно, подсоеините диод одним концом к плюс аккума и тестром померяйте напряжение на обеих концах диода.

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

soznik
Offline
Зарегистрирован: 20.09.2015

Short Circuit пишет:

  учите матчасть - это уже упреки

Гугл вам в помощь Первая ссылка на запрос в поисковике (Падение напряжения на диоде)

http://domasniyelektromaster.ru/tag/napryazhenie-na-diode/

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

Можно поставить диоды шотки и падение будет минимальное и практически не зависить от тока состалять 0,15-0,2 В. 

 

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

Я вернулся к программированию!

наткнулся на проблему отправки смс с несколькими переменными:

char DoorOn[] = "Dver' otkrita! ";                       // для отправки смс "Дверь открыта".
String temp = "";                                              // переменная для хранения температуры.
String LastEvent = "";                                      // текущее состояние системы.

temp = String("Temp ") + Temp + String("*C; ");  // Temp - измеренная температура
                                                                       // temp - для удобсва просмотра

sms(String(DoorOn + LastEvent), String(RingPhone));              // так отправляются смс
sms(String(DoorOn + temp), String(RingPhone));                     // так отправляются смс
sms(String(DoorOn + temp + LastEvent), String(RingPhone));  // так не отправляются смс


void InitModem() {       /// === инициализация модема === ///
  delay(2000);
  Serial.begin(9600); 
  mySerial.begin(9600);
  mySerial.println("AT");
  delay(100);
  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"); // 0,0,0
  delay(100);
}

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 sended! Phone: " + phone + "; Message: " + text);
    delay(5000);
}

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

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

soznik пишет:

Short Circuit пишет:

  учите матчасть - это уже упреки

Гугл вам в помощь Первая ссылка на запрос в поисковике (Падение напряжения на диоде)

http://domasniyelektromaster.ru/tag/napryazhenie-na-diode/

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

Можно поставить диоды шотки и падение будет минимальное и практически не зависить от тока состалять 0,15-0,2 В. 

 

замечательо, вы уже на пол-пути к цели, вот вот и чтото начнете понимать.

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

так что упражняйтесь, учите матчасть..  учите.. может потом еще пообщаемся.

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

pasha413 пишет:

 

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

почему длинная?  более 160 знаков?

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

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

Dver' otkrita!
System Off; 
Temp 24*C;
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, скетч-то покажете? Не огрызок, а нормальный в котором "приходит пустое смс. но в монитор порта пишет"? Или будем в "битву экстрасенсов играть?

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

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

// RLED   -------           
// +LED   --------          
// GLED   ------           
// BLED   -----           

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

String LastEvent = "";                      // текущее состояние системы.
int8_t PIRflag = 0;                           // флаг состояния датчика движения. при подаче питания выкл.
int8_t Doorflag = 0;
int8_t guard = 0;                           // Охрана: 1 - включена, 0 - выключена. при подаче питания выкл.
int8_t PIRval = 0;                          // переменная для чтения состояния пина. при подаче питания выкл.
int8_t DOORval = 0;                         // переменная для чтения состояния пина. при подаче питания выкл.
String temp = "";                           // переменная для хранения температуры.
String val = "";                            // переменная для хранения приходящих строк из модема.
uint8_t ch = 0;
char PIROn[] = "Dvijeniye! Zona dveri! ";                    // для отправки смс "Движение".
char DoorOn[] = "Dver' otkrita! \n";                           // для отправки смс "Дверь открыта".
String RingPhone = "";                                       // номер звонившего.
const char* AlarmPhone[] = {"79111234567", "79111234567"};   // номера для постановки/снятии с охраны и отправки смс.
int8_t CountAlarmPhone = sizeof(AlarmPhone) / sizeof(AlarmPhone[0]);

void setup() {             
    Serial.begin(9600);
    pinMode(Door, INPUT_PULLUP);        // вход, подтягивающий резистор на +, "-" дверь закрыта. 
    pinMode(PIR, INPUT);                // вход, "+" нет движения. 
    pinMode(GLed, OUTPUT);              // выход, "+" не горит. 
    pinMode(BLed, OUTPUT);              // выход, "+" не горит. 
    pinMode(Buz, OUTPUT);               // выход, "+" не звучит. 
      digitalWrite(Buz, HIGH);
      digitalWrite(GLed, HIGH);
      digitalWrite(PIR, LOW);           // дадим датчику время на калибровку.
  InitModem();
  eepromconfig();
  TempC();
      digitalWrite(BLed, HIGH);
  Serial.println(LastEvent);
  sms(String(LastEvent), String(AlarmPhone[0]));    // смс первому номеру. // ненужное закомментировать
//    for (int i = 0; i < CountAlarmPhone; i++) {
//  sms(String(LastEvent), String(AlarmPhone[i]));  // смс обоим номерам.
//      delay(1000);
//    }
}

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

int CheckPhone() {    /// === проверка телефона === ///
  for (int i = 0; i < CountAlarmPhone; i++) {
    if (val.indexOf(AlarmPhone[i]) > -1) {
      RingPhone = AlarmPhone[i];                   // если телефон наш, запоминаем его.
  Serial.println("Ring: +" + RingPhone);          
      return 1;
    }
  }
  return 0;
}

void TempC() {      /// === измеряем температуру === ///
  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];
  Temp = Temp >> 4;
  temp = String("\n" "Temp ") + Temp + String("*C; ");
}

void ConsolePrint() {   /// === для наладчи через консоль === ///
  val.toLowerCase();                              
   if ((val.indexOf("clearsms") > -1)) {
  clearsms();  
   }
   if ((val.indexOf("systemoff") > -1)) {
    guard == 0;
  eepromconfig();
   }
}

void LED() {            /// === состояние светодиодов === ///    
  if (guard == 1) {                                // если в режиме охраны.
           digitalWrite(BLed, LOW);                // мигаем светодиодом через 0,2/2сек.         
           delay(200); 
           digitalWrite(BLed, HIGH);
           delay(2000); 
 } 
  if (guard == 0) {                                // если охрана снята.
    DOORval = digitalRead(Door);
    if (DOORval == LOW || PIRval == HIGH) {        // проверяем датчики.
       digitalWrite(GLed, HIGH);                   // включаем LED при сработке двери или движения.
    } else digitalWrite(GLed, LOW);                // иначе гасим его.
  }
}

void MasterRing() {   /// === если звонили, меняем состояние системы === ///
    if (guard == 1) guard = 0;               
    else if (guard == 0) guard = 1;
  delay(250);
  eepromconfig();
  TempC();
  Serial.println(LastEvent);
  sms(String(LastEvent), String(RingPhone));
  delay(1000);
}

void PIRDetect() {    /// === срабатываение датчика движения === ///
       // === Первое срабатывание датчика движения === ///
    PIRval = digitalRead(PIR);                            // считываем значение с PIR.
    if (PIRval == HIGH && PIRflag == 0 && guard == 1) {   // если сработал  первый раз и на охране.
       digitalWrite(Buz, LOW);                            // включаем сирену 5 сек.
  Serial.println(PIROn);
       delay(5000);                                          
       digitalWrite(Buz, HIGH);                           // выключаем сирену.
       delay(2000);                                       // ждем 2 сек, для ложных срабатываний.
     PIRflag++;
  } 
        // === Повторное срабатывание датчика движения === ///
    if (PIRval == HIGH && PIRflag == 1 && guard == 1) {   // повторное срабатывание и на охране.
       digitalWrite(Buz, LOW);                            // сирена 10 сек.
  eepromconfig();
  PIRflag++;
  if (PIRflag >= 2 && guard == 1) {     
  Serial.println (PIROn + LastEvent);
  sms(String(PIROn + LastEvent), String(RingPhone));
        delay(10000);
  }
    digitalWrite(Buz, HIGH);        
  }   
  if (PIRflag >= 2) {                                     // возвращаемся к первому срабатыванию датчика движения
      PIRflag = 0; 
  }
}

void DOORDetect() {   /// === срабатывание датчика двери === ///
    DOORval = digitalRead(Door);                          // считываем значение с датчика двери.
    if (DOORval == HIGH && Doorflag == 0 && guard == 1) {                  // если дверь открыта и на охране.
       digitalWrite(Buz, LOW);                            // сирена около 20сек. 
        Doorflag ++;
        guard = 0;                                        // снимаем с охраны.
  eepromconfig();
       delay(500);
  Serial.println(DoorOn + LastEvent);
  sms(String(DoorOn + LastEvent), String(AlarmPhone[0]));      // Посылаем СМС дверь открыта и состояние системы  
       delay(5000);
//       mySerial.println("ATD+"+(RingPhone) + ";");      // отзваниваемся на номер поставившего на охрану.
//      delay(100);
//      if (gsm.find("OK")) Serial.println("OK!");
//      else Serial.println("error");
       delay(20000);                                      // время сирены 20сек                                   
       digitalWrite(Buz, HIGH);        
  } if (DOORval == LOW && Doorflag == 1 && guard == 0) {  // если дверь закрыли
      Doorflag = 0;                                   
      guard = 1;                                          // ставим на охрану
  eepromconfig();
  Serial.println(LastEvent);
  sms(String(LastEvent), String(AlarmPhone[0]));  // Посылаем СМС  
  }
}

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

void InitModem() {       /// === инициализация модема === ///
  delay(2000);
  Serial.begin(9600); 
  mySerial.begin(9600);
  mySerial.println("AT");
  delay(100);
  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"); // 0,0,0
  delay(100);
}

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

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 sended! Phone: " + phone + "; Message: " + text);
    delay(5000);
}

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

190 строка смс не отправляется пишет ошибку.

монитор порта:

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

В строках 238-245 проверьте правильно ли формируются объекты String для этого сформируйте посылки заранее и проверьте всё ли с ними в порядке.

bool okay = true;
String s1 =  "AT+CMGS=\"" + phone + "\"";
if (s1) Serial.println(s1); else okay = false;
String s2 = "SMS sended! Phone: " + phone + "; Message: " + text;
if (s2) Serial.println(s2); else okay = false;
if (!okay ) Serial.println("Zhopa :(((");

else Serial.println(s1);
mySerial.println(s1);
delay(500);
mySerial.print(text);
delay(500);
mySerial.print((char)26);
delay(500);
Serial.println(s2);
delay(5000);

Как-то так. Покажите мне, что печатает.

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

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

если правильно понял, заменяю:

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 sended! Phone: " + phone + "; Message: " + text);
    delay(6000);
*/
bool okay = true;
String s1 =  "AT+CMGS=\"" + phone + "\"";
if (s1) Serial.println(s1); else okay = false;
String s2 = "SMS sended! Phone: " + phone + "; Message: " + text;
if (s2) Serial.println(s2); else okay = false;
if (!okay ) Serial.println("Zhopa :(((");

else Serial.println(s1);
mySerial.println(s1);
delay(500);
mySerial.print(text);
delay(500);
mySerial.print((char)26);
delay(500);
Serial.println(s2);
delay(5000);

}

получается так:

System Off; 
Temp 24*C; 
AT+CMGS="791*****"
Zhopa :(((                               смс отправилось! больше не отправлялось


OK

NEOWAY
M590
REVISION 01.30d

OK

OK

OK

OK

Ring: +79**********
System On; 
Temp 24*C; 
Zhopa :(((


OK

ERROR

Dver' otkrita! 
System Off; 
Temp 24*C; 
Zhopa :(((


ERROR

System On; 
Temp 24*C; 
Zhopa :(((


ERROR

 

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

Понятно.

Появление сообщения "Zhopa :(((" означает, что Вам не хватает памяти для формирования новых объектов String. Просто элементарно не хватает памяти. Это точный диагноз, других причин быть не может. String - вообще убийца памяти.

Что с этим делать?

Вариант 1. Попробовать обойтись без String вовсе или свести их использование к минимуму.

Но если Вы обходиться без них не умеете, то

Вариант 2. хотя бы пройдитесь по программаме аккуратно и не храните лишнего в памяти. Не дублируйте тексты, вовремя освобождайте куски (фигурными скобками). Ну, вот например, Вы храните alarmPhone как массив символов. Затем Вы его же упихиваете в String, зачем?

Вот в этой теме есть конкретные примеры где и почему String убивает память, и приёмы управления памятью. Изучите. Также там есть библиотека при помощи которой Вы можете посмотреть состояние своей памяти в любой момент.

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

спасибо, почитаю.

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

pasha413 пишет:

спасибо, почитаю.

 

http://arduino.ru/forum/obshchii/neoway-m590#comment-267372   вот здесь пример как у меня получилось тоже немалого размера смс отправлять.  Память нужно максимально освободить, у вас компилятор сколько пишет занято памяти? Проблемы начинались с 60-65%.   После оптимизации записей вместо динамической памяти максимально перенес во флеш, у меня  стало значение менее 25% ! и все отправлялось как положено.

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

у меня 59-60% занято