GSM сигнализация, помогите с кодом
- Войдите на сайт для отправки комментариев
Ср, 01/05/2019 - 19:44
Доброго времени суток! Возникла необходимость "звонка по событию" . Задача стоит такая, что при срабатывании реле (разрывается цепь 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
Прежде чем тревожить занятых людей - почитайте как правильно вставлять программу в сообщение. Иначе Вам никто не сможет помочь, даже если захочет (что сомнительно при таком подходе).
Ну правильно ... сработал принцип "Запоминания первопричины события". Только после сброса первопричины система готова работать дальше. Ну отправь СМС в ответ. Мол ... понял.
Тысячу извинений. Если убрать бесконечный цикл "while(1)" то модем будет безконца звонить пока активно событие. Незнаю как сделать, что бы при повторной активизации события (размыкание растяжки, реле) модем отзвонился
01
#include <SoftwareSerial.h>
02
03
SoftwareSerial gsm(3, 2);
// RX, TX
04
05
06
07
void
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
17
void
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
}
Тысячу извинений. Если убрать бесконечный цикл "while(1)" то модем будет безконца звонить
который из них? - если вы не заметили, в вашей программе три бесконечных цикла - в 19, 28 и 37 строке. И смею вас заверить, что выполнятся будет только один - первый. И как можно догадаться - бесконечно.
Для "ожидания готовности модема" или "подключения к сети" бесконечные циклы не подходят. СОВСЕМ