проблема со скетчем для M590

artemka-yaz
Offline
Зарегистрирован: 31.08.2016

Собираю некий сигнализатор для квартиры. На данном этапе планируется с помощью двух пинов на 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());

}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

artemka-yaz пишет:

Не получается корректная работа с двумя входами.

Можно подробнее, что именно не получается?

Т.е. как оно работает сейчас, и чем отличается от того, что Вам нужно?

artemka-yaz
Offline
Зарегистрирован: 31.08.2016

шлет смс постоянно, и уже совсем запутался и не могу сооброзить как сделать что бы при отсутсвие питания на пин3 отправлялось смс и звонил. на данный момент пин 3 вообще не срабатывает.

 

ВН
Offline
Зарегистрирован: 25.02.2016

artemka-yaz пишет:
 шлет смс постоянно.. 

так наверно следует запомнить. что смс уже отпрвлено и больше не требуется пока посылать

artemka-yaz пишет:
как сделать что бы при отсутсвие питания на пин3 отправлялось смс и звонил 

совершенно очевидно, что если нет питания - звонить не будет, т.е. требуется резервное питание от какой-то батареи, когда основное пропадает. 

artemka-yaz
Offline
Зарегистрирован: 31.08.2016

на пин 3 и призодит не основное питание а с преобразователя 220-5в. основное питание акб с постоянно подключенной подзарядкой.

а как запомнить отправку смс?

 

artemka-yaz
Offline
Зарегистрирован: 31.08.2016

цикличная отправка смс идет после строки 113, я думаю что ни правильно расставил скобки

 

Navigator
Navigator аватар
Offline
Зарегистрирован: 26.01.2016

 Почитайте здесь http://arduino.ru/forum/programmirovanie/pomogite-novichku-dopisat-kod

Там leshak все подробно объяснял. 

Избавился от дребезга контактов, сравнивая текущее и предыдущее состояния кнопки.

Также он предлагал не использовать while,  не помню чем он это обосновал.

Также он добавил лимит на количество смс.