GSM сигнализация, помогите с кодом

BMW_Style
Offline
Зарегистрирован: 01.05.2019

Доброго времени суток! Возникла необходимость "звонка по событию" . Задача стоит такая, что при срабатывании реле (разрывается цепь GND и pin4) GSM модем звонит на мобильный. Нашел подходящий проект, немного переделал, все работает только повторный звонок не производиться, т.е при повторном срабатывании реле программа уже не отрабатывает и следует перезагрузить ардуино. Помогите с кодом кто чем может) Плата Uno; GSM, modem A6

#include <SoftwareSerial.h>
 
SoftwareSerial gsm(3, 2); // RX, TX
 
//////void modemOFF(){
 ///// digitalWrite(5, HIGH);
 /////// delay(10);
///////  gsm.println("AT+CPWROFF");
//////}
 
//void modemON(){
  //digitalWrite(5, LOW);
 // delay(10);
  //while(!gsm.find("+PBREADY")); 
//}
 
void setup(){  
  Serial.begin(9600);
  gsm.begin(9600);             /// незабываем указать скорость работы UART модема
  
  //pinMode(5, OUTPUT);           /// нога BOOT на модеме
  pinMode(4, INPUT_PULLUP);     /// нога на растяжку
  
//  digitalWrite(5, LOW);         /// включаем модем, для проверки.
                                /// !!! при подачи питания, нужно надавить на ресет ардуины,
                                /// !!! модем при включении может просадить питание и ардуина не стартанет 
//  while(!gsm.find("+PBREADY")); /// при включении ждем готовность модема 
 // modemOFF();                   /// и выключаем модем
}
 
void loop() {
  if (digitalRead(4)){          /// если оборвали растяжку
    //modemON();                  /// включаем модема
    while(1){                   // ждем подключение модема к сети
        gsm.println("AT+COPS?");
        if (gsm.find("0")) break;
        delay(500);  
    }
    /////////////////////// звоним по указаному номеру
    gsm.println("ATD+77715598656;"); 
    delay(100);
    if (gsm.find("OK")) Serial.println("ATD+OK!");
    while(1){             // проверяем готовность модема, ждем сброс вызова
        gsm.println("AT+CPAS");
        if (gsm.find("0")) break;
        delay(100);  
    }
 
 
    
    /////////////////// и\или отправляем SMS
/*      gsm.println("AT+CMGF=1");        delay(100);      gsm.println("AT+CSCS=\"GSM\"");         delay(100);    gsm.println("AT+CMGS=\"79991112233\""); // даем команду на отправку смс    delay(100);    gsm.print("111");             // отправляем текст     gsm.print((char)26);          // символ завершающий передачу    Serial.println("SMS ok");      delay(100);   while(1){             // проверяем готовность модема        gsm.println("AT+CPAS");        if (gsm.find("0")) break;        delay(100);      } */   
 
    delay(10000);
    Serial.println("FULL_OFF!");
    
  //  modemOFF();                           /// выключаем модем,  
    while(1);                             /// останавливаем прогу   
  }
  
  if (gsm.available())
    Serial.write(gsm.read());
  if (Serial.available())
    gsm.write(Serial.read());
}
 
///+PBREADY
 
mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

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

Муж_Долговой
Муж_Долговой аватар
Offline
Зарегистрирован: 07.10.2018

Ну правильно ... сработал принцип "Запоминания первопричины события". Только после сброса первопричины система готова работать дальше. Ну отправь СМС в ответ. Мол ... понял.

BMW_Style
Offline
Зарегистрирован: 01.05.2019

Тысячу извинений. Если убрать бесконечный цикл  "while(1)" то модем будет безконца звонить пока активно событие. Незнаю как сделать, что бы при  повторной активизации события (размыкание растяжки, реле) модем отзвонился

01#include <SoftwareSerial.h>
02 
03SoftwareSerial gsm(3, 2); // RX, TX
04 
05 
06 
07void setup(){ 
08  Serial.begin(9600);
09  gsm.begin(9600);             ///  скорость работы UART модема
10   
11  //pinMode(5, OUTPUT);           /// нога BOOT на модеме
12  pinMode(4, INPUT_PULLUP);     /// нога на растяжку
13   
14                               
15}
16 
17void loop() {
18  if (digitalRead(4)){          /// если оборвали растяжку
19    while(1){                   // ждем подключение модема к сети
20        gsm.println("AT+COPS?");
21        if (gsm.find("0")) break;
22        delay(500); 
23    }
24    /////////////////////// звоним по указаному номеру
25    gsm.println("ATD+77715599999;");
26    delay(100);
27    if (gsm.find("OK")) Serial.println("ATD+OK!");
28    while(1){             // проверяем готовность модема, ждем сброс вызова
29        gsm.println("AT+CPAS");
30        if (gsm.find("0")) break;
31        delay(100); 
32    }
33 
34    delay(10000);
35    Serial.println("FULL_OFF!");
36     
37    while(1);                             /// останавливаем прогу  
38  }
39   
40  if (gsm.available())
41    Serial.write(gsm.read());
42  if (Serial.available())
43    gsm.write(Serial.read());
44}

 

b707
Offline
Зарегистрирован: 26.05.2017

BMW_Style пишет:

Тысячу извинений. Если убрать бесконечный цикл  "while(1)" то модем будет безконца звонить

который из них? - если вы не заметили, в вашей программе три бесконечных цикла - в 19, 28 и 37 строке. И смею вас заверить, что выполнятся будет только один - первый. И как можно догадаться - бесконечно.

Для "ожидания готовности модема" или "подключения к сети" бесконечные циклы не подходят. СОВСЕМ