проблема со скетчем для M590
- Войдите на сайт для отправки комментариев
Ср, 31/08/2016 - 10:19
Собираю некий сигнализатор для квартиры. На данном этапе планируется с помощью двух пинов на UNO осуществлять передачу смс и звонки. Один пин нормально разомкнутый контур(если контур замыкается осправляется смс, после разрыва отправляется другое смс и модем выключается), на второй подается +5в через преобразователь от сети(если +5 пропадает осправляется смс, после возобновления отправляется другое смс).
Не получается корректная работа с двумя входами.
#include <SoftwareSerial.h>
SoftwareSerial gsm(8, 7); // на контроллере RX, TX
void SENDSMSALARMON(){
// Устанавливает текстовый режим для SMS-сообщений
gsm.print("AT+CMGF=1\r");
delay(100); // даём время на усваивание команды
// Устанавливаем адресата: телефонный номер в международном формате
gsm.println("AT + CMGS = \"+79898074069\""); //Телефон нужно откорректировать
delay(100);
// Пишем текст сообщения
gsm.print("ALARM_ON");
delay(100);
// Отправляем Ctrl+Z, обозначая, что сообщение готово
gsm.println((char)26);
Serial.println("SMS1 ok");
delay(100);
}
void SENDSMSSWITCHON(){
// Устанавливает текстовый режим для SMS-сообщений
gsm.print("AT+CMGF=1\r");
delay(100); // даём время на усваивание команды
// Устанавливаем адресата: телефонный номер в международном формате
gsm.println("AT + CMGS = \"+79898074069\""); //Телефон нужно откорректировать
delay(100);
// Пишем текст сообщения
gsm.print("SWITCH_ON");
delay(100);
// Отправляем Ctrl+Z, обозначая, что сообщение готово
gsm.println((char)26);
Serial.println("SMS2 ok");
delay(100);
}
void SENDSMSSWITCHOFF(){
// Устанавливает текстовый режим для SMS-сообщений
gsm.print("AT+CMGF=1\r");
delay(100); // даём время на усваивание команды
// Устанавливаем адресата: телефонный номер в международном формате
gsm.println("AT + CMGS = \"+79898074069\""); //Телефон нужно откорректировать
delay(100);
// Пишем текст сообщения
gsm.print("SWITCH_OFF");
delay(100);
// Отправляем Ctrl+Z, обозначая, что сообщение готово
gsm.println((char)26);
Serial.println("SMS2 ok");
delay(100);
}
void SENDSMSALARMOFF(){
// Устанавливает текстовый режим для SMS-сообщений
gsm.print("AT+CMGF=1\r");
delay(100); // даём время на усваивание команды
// Устанавливаем адресата: телефонный номер в международном формате
gsm.println("AT + CMGS = \"+79898074069\""); //Телефон нужно откорректировать
delay(100);
// Пишем текст сообщения
gsm.print("ALARM_ON");
delay(100);
// Отправляем Ctrl+Z, обозначая, что сообщение готово
gsm.println((char)26);
Serial.println("SMS2 ok");
delay(100);
}
void TESTINGMODEM(){
while(1){ // проверяем готовность модема
gsm.println("AT+CPAS");
if (gsm.find("0")) break;
delay(500);
}
}
void RINGALARM(){
gsm.println("ATD+79898074069;");
delay(100);
if (gsm.find("OK")) Serial.println("ATD+OK!");
while(1){ // проверяем готовность модема, ждем сброс вызова
gsm.println("AT+CPAS");
if (gsm.find("0")) break;
delay(100);
}
}
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(2, INPUT_PULLUP); /// вход аварии блок 1
pinMode(3, INPUT_PULLUP); /// вход аварии блок 2
digitalWrite(5, LOW); /// включаем модем, для проверки.
/// !!! при подачи питания, нужно надавить на ресет ардуины,
/// !!! модем при включении может просадить питание и ардуина не стартанет
/// или впаять на питании радиомодуля конденсатор на 1000 и более мкФ!
while(!gsm.find("+PBREADY")); /// при включении ждем готовность модема
modemOFF(); /// и выключаем модем
}
void loop(){
if (digitalRead(2)){ /// если сработало реле аварии блок 1
modemON(); /// включаем модем
TESTINGMODEM(); // ждем подключение модема к сети
RINGALARM(); /////////////////////// звоним по указаному номеру
SENDSMSALARMON(); ///////////////// и\или отправляем SMS
}
while(digitalRead(2)){ // ждем устранения аварии блок 1
SENDSMSALARMOFF(); // отправляем смс после востановления контура
TESTINGMODEM(); // проверяем готовность модема
}
if (digitalRead(3)){ /// если пропало питание на входе
modemON(); /// включаем модем
TESTINGMODEM(); // ждем подключение модема к сети
RINGALARM(); /////////////////////// звоним по указаному номеру
SENDSMSSWITCHOFF(); ///////////////// и\или отправляем SMS
}
while(digitalRead(3)){ // ждем появления питания
SENDSMSSWITCHON(); // отправляем смс после востановления контура
TESTINGMODEM(); // проверяем готовность модема
}
delay(10000);
Serial.println("FULL_OFF!");
delay(100);
modemOFF(); /// выключаем модем,
//while(1); /// останавливаем прогу
if (gsm.available())
Serial.write(gsm.read()); if (Serial.available())
gsm.write(Serial.read());
}
Не получается корректная работа с двумя входами.
Можно подробнее, что именно не получается?
Т.е. как оно работает сейчас, и чем отличается от того, что Вам нужно?
шлет смс постоянно, и уже совсем запутался и не могу сооброзить как сделать что бы при отсутсвие питания на пин3 отправлялось смс и звонил. на данный момент пин 3 вообще не срабатывает.
так наверно следует запомнить. что смс уже отпрвлено и больше не требуется пока посылать
совершенно очевидно, что если нет питания - звонить не будет, т.е. требуется резервное питание от какой-то батареи, когда основное пропадает.
на пин 3 и призодит не основное питание а с преобразователя 220-5в. основное питание акб с постоянно подключенной подзарядкой.
а как запомнить отправку смс?
цикличная отправка смс идет после строки 113, я думаю что ни правильно расставил скобки
Почитайте здесь http://arduino.ru/forum/programmirovanie/pomogite-novichku-dopisat-kod
Там leshak все подробно объяснял.
Избавился от дребезга контактов, сравнивая текущее и предыдущее состояния кнопки.
Также он предлагал не использовать while, не помню чем он это обосновал.
Также он добавил лимит на количество смс.