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)" то модем будет безконца звонить пока активно событие. Незнаю как сделать, что бы при  повторной активизации события (размыкание растяжки, реле) модем отзвонился

#include <SoftwareSerial.h>

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



void setup(){  
  Serial.begin(9600);
  gsm.begin(9600);             ///  скорость работы UART модема
  
  //pinMode(5, OUTPUT);           /// нога BOOT на модеме
  pinMode(4, INPUT_PULLUP);     /// нога на растяжку
  
                              
}

void loop() {
  if (digitalRead(4)){          /// если оборвали растяжку
    while(1){                   // ждем подключение модема к сети
        gsm.println("AT+COPS?");
        if (gsm.find("0")) break;
        delay(500);  
    }
    /////////////////////// звоним по указаному номеру
    gsm.println("ATD+77715599999;"); 
    delay(100);
    if (gsm.find("OK")) Serial.println("ATD+OK!");
    while(1){             // проверяем готовность модема, ждем сброс вызова
        gsm.println("AT+CPAS");
        if (gsm.find("0")) break;
        delay(100);  
    }

    delay(10000);
    Serial.println("FULL_OFF!");
    
    while(1);                             /// останавливаем прогу   
  }
  
  if (gsm.available())
    Serial.write(gsm.read());
  if (Serial.available())
    gsm.write(Serial.read());
}

 

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

BMW_Style пишет:

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

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

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