проблема со скетчем для 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, не помню чем он это обосновал.
Также он добавил лимит на количество смс.