Sim800l реле DTMF отправка смс!

avolon
Offline
Зарегистрирован: 31.01.2017
 
Привет! Несудите строго но код собран отовсюду )) 
Нужна помощ оптимизировать код за вознаграждение!
И доработать его в плане DTMF
Если интересно пишите avolon.linux@gmail.com!
На данный момент скетч работает но почемуто шлет смс как бутто он перегружался (((



#include <SoftwareSerial.h>

#define GSM_RX 3  // пин RX на модуле подключаем к указаному пину на Ардуино TX
#define GSM_TX 2  // пин TX на модуле подключаем к указаному пину на Ардуино RX

SoftwareSerial gprsSerial(GSM_TX, GSM_RX); // установка контактовGSM_TX->RX и GSM_RX->TX для программного порта

#define RELE_ONE 6 // Пин для по  дключения реле 1
#define RELE_TWO 5  // Пин для подключения реле 2
#define RELE_three 9 // Пин для подключения реле 3


const int redPin = 7;
const int grenPin = 8;



////////////////////////////
unsigned long delayPing = 0;
boolean boolPing = true;
//////////////////////////////

String on_one = "on1";  // СМС которое включает данное реле ( можнопоменять на свое ) его и нужно слать
String off_one = "off1";  // СМС которое выключает данное реле ( можнопоменять на свое ) его и нужно слать

String on_two = "on2";  // СМС которое включает данное реле ( можнопоменять на свое ) его и нужно слать
String off_two = "off2";  // СМС которое выключает данное реле ( можнопоменять на свое ) его и нужно слать

String on_all = "on3";  // СМС которое включает данное реле ( можнопоменять на свое ) его и нужно слать
String off_all = "off3";  // СМС которое выключает данное реле ( можнопоменять на свое ) его и нужно слать
String reswitch_power = "rp3";  // СМС которое выключает, ждет 50сек.,ключает питание
String reswitch_power_router = "rp1";  // СМС которое выключает, ждет 50сек.,включает питание роутера
String reswitch_power_tral = "rp2";  // СМС которое выключает, ждет 50сек.,включает питание трал
String reswitch_power_tral_flash = "rp4";  // СМС которое выключает, ждет 50сек.,включает питание тралString reswitch_power_tral = "rp2"

// Устанавливаем номера администраторов ( номера с которых будутработать СМС с других номеров работать не будет )
const int allNumber = 4;  // Указываем кол-во номеров  ( которые ниже) админских, их кол-во сколько угодно от 1 и более
char* adminNumber[] = {"7xxxxxxxxxx", "7xxxxxxxxx", "7xxxxxxxxxxx", "7xxxxxxxxxxx"}; // Номер прописываем
String phone_admin = "+7xxxxxxxxxx";
String phone_admin1 = "+7xxxxxxxxx";
String currStr = ""; // Переменная для хранения строки сообщения

boolean isStringMessage = false; // флаг на разрешение оброботки SMS
boolean isStringCALL = false; // флаг на разрешение оброботки SMS
int i, n;
//////////////////////////////////////////////////////////
//unsigned long timeInterval = 10L * 60L * 1000L;
unsigned long timeInterval = 30L * 1000L;
unsigned long lastGetTime = 0;
//////////////////////////////////////////////
void sms(String text, String phone);
byte descript[5];
//=======================================================================================================================
void setup()
{
  pinMode(grenPin, OUTPUT);
  digitalWrite(grenPin, HIGH);
  pinMode(redPin, OUTPUT);
  Serial.begin(9600);  // Для отладки выводит данные в монитор порта
  Serial.println(phone_admin);
  delay(500);
  Serial.println(phone_admin1);
  //gprsSerial.setTimeout(100);                    // задаем задержку для  Serial.parseInt()

  gprsSerial.begin(4800);


  atCommand(F("AT"), "OK", 500, 1);
  atCommand(F("AT+IPR=4800"), "OK", 500, 1); //включаем соединение GPRS
  atCommand(F("AT+CLIP=1"), "OK", 500, 1);// Включаем АОН
  atCommand(F("AT+IFC=1, 1"), "OK", 500, 1);// устанавливаем программныйконтроль потоком передачи данных
  atCommand(F("AT+CMGF=1"), "OK", 100, 1); //режим кодировки текстовый
  atCommand(F("AT+CPBS=\"SM\""), "OK", 100, 1); //открываем доступ кданным телефонной книги SIM-карты
  atCommand(F("AT+CSCS=\"GSM\""), "OK", 100, 1); //текстовая кодировка GSM
  atCommand(F("AT+CNMI=1,2,2,1,0"), "OK", 100, 1); // включает оповещение оновых сообщениях, новые сообщения приходят в следующем формате: +CMT:"<номер телефона>", "", "<дата, время>", ( +CMT:"+380xxxxxxxxx","","17/02/04,04:44:09+08" ) сразу за ним идет самосообщение с новой строки
  atCommand(F("AT+DDET=1"), "OK", 100, 1);
  atCommand(F("AT+CMGD=1,4"), "OK", 100, 1); //удаляем все смс
  delay(20000);
  pinMode(RELE_ONE, OUTPUT);
  pinMode(RELE_TWO, OUTPUT);
  pinMode(RELE_three, OUTPUT);

  digitalWrite(RELE_ONE, LOW);
  digitalWrite(RELE_TWO, LOW);
  digitalWrite(RELE_three, LOW);
  delay(500);

  sms("OK-V-RABOTE", phone_admin);
  // delay(5000);
  //  sms("OK-V-RABOTE", phone_admin1);
  //  delay(1000);
  //  gprsSerial.println("AT+CMGD=1,4");
  delay(700);

}


//}
//====================================================================================================================

void loop()

{


  {

    if (millis() < lastGetTime) lastGetTime = 0;
    if (millis() - lastGetTime > timeInterval || lastGetTime == 0) {
      lastGetTime = millis();


      atCommand(F("AT"), "OK", 500, 1);
      //      gprsSerial.println("AT");

    }


    if (!gprsSerial.available()) {
      return;  // если не данных отмодуля SIM800l, то дальше не идем. Выходим из текущей итерации и сновазаходим в loop()
    }

    char currSymb = gprsSerial.read(); // записываем в переменуюсимволы, которые получили от модуля.

    Serial.print(currSymb); //все выводит



    if ('\r' == currSymb) { // если получили символ перевода коректи вначало строки, это означает что передача сообщения от модулязавершена.

      if (isStringMessage) { // если текущая строка – сообщение, то…
        Serial.print(isStringMessage);




        if (!currStr.compareTo(reswitch_power_tral_flash)) { // если текстсообщения совпадает то включаем реле
          digitalWrite(RELE_three, HIGH);
          delay(20000);
          digitalWrite(RELE_three, LOW);
          
          sms("Flash_reload", adminNumber[i]);
        }





        //--- первое реле
        //--------------------------------------------------------------
        if (!currStr.compareTo(on_one)) { // если текстсообщения совпадает с on_one то включаем реле
          digitalWrite(RELE_ONE, LOW);
          sms("Rele_1_ON", adminNumber[i]); // Номерпрописываем полностью с "+"
        }
        if (!currStr.compareTo(off_one)) { // еслитекст сообщения совпадает с off_one то выключаем реле
          digitalWrite(RELE_ONE, HIGH);
          sms("Rele_1_OFF", adminNumber[i]); // Номерпрописываем полностью с "+"
        }

        //-----------------------------------------------------------------------------
        //--- второе реле
        //--------------------------------------------------------------

        if (!currStr.compareTo(on_two)) { // если текстсообщения совпадает с on_two то включаем реле
          digitalWrite(RELE_TWO, LOW);
          sms("Rele_2_ON", adminNumber[i]); // Номерпрописываем полностью с "+"
        }
        if (!currStr.compareTo(off_two)) { // еслитекст сообщения совпадает с off_two то выключаем реле
          digitalWrite(RELE_TWO, HIGH);
          sms("Rele_2_OFF", adminNumber[i]); // Номерпрописываем полностью с "+"
        }

        //-----------------------------------------------------------------------------
        //--- включение всех реле
        //--------------------------------------------------------------
        if (!currStr.compareTo(on_all)) { // если текстсообщения совпадает с on_all то включаем реле
          digitalWrite(RELE_ONE, LOW);
          digitalWrite(RELE_TWO, LOW);
          sms("Rele_1_AND_2_ON", adminNumber[i]); //Номер прописываем полностью с "+"
        }
        //отключение всех реле
        if (!currStr.compareTo(off_all)) { // еслитекст сообщения совпадает с off_all то выключаем реле
          digitalWrite(RELE_ONE, HIGH);
          digitalWrite(RELE_TWO, HIGH);
          sms("Rele_1_AND_2_OFF", adminNumber[i]); //Номер прописываем полностью с "+"
        }

        //-----------------------------------------------------------------------------
        // выключаем все реле, ждем 50сек., включаем все реле
        if (!currStr.compareTo(reswitch_power)) { //если текст сообщения совпадает с reswitch_power
          digitalWrite(RELE_ONE, HIGH);
          digitalWrite(RELE_TWO, HIGH);
          delay(50000);
          digitalWrite(RELE_ONE, LOW);
          digitalWrite(RELE_TWO, LOW);
                digitalWrite(grenPin, LOW);
                delay(1000);
                digitalWrite(grenPin, HIGH);
                delay(1000);
                digitalWrite(redPin, LOW);
                delay(1000);
                digitalWrite(redPin, HIGH);
                delay(1000);
                digitalWrite(grenPin, LOW);
                delay(1000);
                digitalWrite(grenPin, HIGH);
                delay(1000);
                digitalWrite(redPin, LOW);
                          sms("Tral_rout_reload", adminNumber[i]); // Номер прописываемполностью с "+"
        }

        //-----------------------------------------------------------------------------
        // Перегружаем ROUTER 50 сек
        if (!currStr.compareTo(reswitch_power_router)) { //если текст сообщения совпадает с reswitch_power_router
          digitalWrite(RELE_ONE, HIGH);
          delay(50000);
          digitalWrite(RELE_ONE, LOW);
          sms("Router_reload", adminNumber[i]); // Номер прописываемполностью с "+"
        }

        //-----------------------------------------------------------------------------
        // Перегружаем ТРАЛ 50 сек
        if (!currStr.compareTo(reswitch_power_tral)) { //если текст сообщения совпадает с reswitch_power_tral
          digitalWrite(RELE_TWO, HIGH);
          delay(50000);
          digitalWrite(RELE_TWO, LOW);
          sms("Tral_reload", adminNumber[i]); // Номер прописываемполностью с "+"
        }



        isStringMessage = false;
        // gprsSerial.print("AT+CMGDA=\"DEL ALL\"\r"); //Удоляем все сообщение на SIM карте
        //gprsSerial.print("AT+CMGD=1, 1\r"); //Удоляем все сообщение на SIM карте
        //Удаление смс-===============================
        atCommand(F("AT+CMGD=1,4"), "OK", 100, 1); //удаляем все смс
        //============================================
        delay(500);
      }





      //=========ЗВОНОК-ПЕРЕГРУЗКА ТРАЛА И РЕЛЕ==========================================
      if (isStringCALL) {
        atCommand(F("AT+DDET=1"), "OK", 100, 1);
        delay(10);
        gprsSerial.println("ATA");
        while (1) {                             // в цикле
          if (gprsSerial.find("+DTMF:")) {             // ищим DTMF
            int cmd = gprsSerial.parseInt();             // читаем команду

            switch (cmd) {                       // и в зависимости
              case 3:                             // выполняем действие, отправляем в Serial,
                //выключаем все реле, ждем 50сек., включаем все реле
                Serial.println("33333333333333333");
                gprsSerial.println("ATH"); delay(500);
                digitalWrite(RELE_three, HIGH);
                delay(50000);
                digitalWrite(RELE_three, LOW);


                digitalWrite(grenPin, LOW);
                delay(1000);
                digitalWrite(grenPin, HIGH);
                delay(1000);
                digitalWrite(grenPin, LOW);
                delay(1000);
                digitalWrite(grenPin, HIGH);
                delay(1000);
                digitalWrite(grenPin, LOW);
                delay(1000);
                digitalWrite(grenPin, HIGH);
                delay(1000);
                digitalWrite(grenPin, LOW);
                delay(1000);
                digitalWrite(grenPin, HIGH);
                sms("Flash_reload_DTMF", adminNumber[n]);
                break;
              //======================================================
              case 1:                             // выполняем действие, отправляем в Serial,
                Serial.println("111111111111111111111");
                gprsSerial.println("ATH"); delay(500);
                digitalWrite(RELE_ONE, HIGH);
                delay(50000);
                digitalWrite(RELE_ONE, LOW);

                digitalWrite(grenPin, LOW);
                delay(1000);
                digitalWrite(grenPin, HIGH);
                delay(1000);
                digitalWrite(grenPin, LOW);
                delay(1000);
                digitalWrite(grenPin, HIGH);
                delay(1000);
                digitalWrite(grenPin, LOW);
                delay(1000);
                digitalWrite(grenPin, HIGH);
                delay(1000);
                digitalWrite(grenPin, LOW);
                delay(1000);
                digitalWrite(grenPin, HIGH);
                sms("Router_reload_DTMF", adminNumber[n]);
                break;
              //=============================================================
              case 2:
                Serial.println("222222222222222222222222");
                gprsSerial.println("ATH"); delay(500);
                digitalWrite(RELE_TWO, HIGH);
                delay(50000);
                digitalWrite(RELE_TWO, LOW);
               
                digitalWrite(grenPin, LOW);
                delay(1000);
                digitalWrite(grenPin, HIGH);
                delay(1000);
                digitalWrite(grenPin, LOW);
                delay(1000);
                digitalWrite(grenPin, HIGH);
                delay(1000);
                digitalWrite(grenPin, LOW);
                delay(1000);
                digitalWrite(grenPin, HIGH);
                delay(1000);
                digitalWrite(grenPin, LOW);
                delay(1000);
                digitalWrite(grenPin, HIGH);
                break;
                sms("Tral_reload_DTMF", adminNumber[n]);

              case 4:
                Serial.println("4444444444444444444444444444");
                gprsSerial.println("ATH"); delay(500);
                digitalWrite(RELE_three, HIGH);
                digitalWrite(RELE_ONE, HIGH);
                digitalWrite(RELE_TWO, HIGH);
                delay(50000);
                digitalWrite(RELE_three, LOW);
                digitalWrite(RELE_ONE, LOW);
                digitalWrite(RELE_TWO, LOW);
                delay(1000);
                digitalWrite(grenPin, LOW);
                delay(1000);
                digitalWrite(grenPin, HIGH);
                delay(1000);
                digitalWrite(grenPin, LOW);
                delay(1000);
                digitalWrite(grenPin, HIGH);
                delay(1000);
                digitalWrite(grenPin, LOW);
                delay(1000);
                digitalWrite(grenPin, HIGH);
                delay(1000);
                digitalWrite(grenPin, LOW);
                delay(1000);
                digitalWrite(grenPin, HIGH);
                break;
                //======================================================
                sms("Tral_router_flash_DTMF", adminNumber[n]);

              default:
                Serial.println("error");
                break;
            }

          }
          else {                                // иначе
            gprsSerial.println("AT+CPAS");             // спрашиваем состояние модема
            delay(100);
            if (gprsSerial.find("+CPAS: 0")) break;    // и если он в "готовности", выходим из цикла
          }                                     // если звонок в процессе, возвращает +CPAS: 3

        }

        Serial.println("OK!");



        isStringCALL = false;
      }

      else {
        if (currStr.startsWith("+CMT")) {   // +CMT:"380xxxxxxxxx","","17/02/04,04:44:09+08"  в данном месте строкасодержит такие данные
          // если текущая строка начинается с "+CMT", тоследующая сообщение
          String f = currStr.substring(8, 19); //номер без + для смс
          Serial.println(f);
          for (i = 0; i <= allNumber; i++) { // числоallNumber - это количество заданных тел.номеров.

            if (!f.compareTo(adminNumber[i])) {  //сверяем номер с номером прешедним SMS если в полученнойстроке найдет нужную подстраку ( номер наш ) то вернет индекс началаискомой строки а если ненайдет строку то вернет  -1
              Serial.println("RABOTAET");
              isStringMessage = true;
              break;
            }

          }

        }



        else         if (currStr.startsWith("+CMT")) {   // +CMT:"380xxxxxxxxx","","17/02/04,04:44:09+08"  в данном месте строкасодержит такие данные
          // если текущая строка начинается с "+CMT", тоследующая сообщение
          String f = currStr.substring(8, 19); //номер без + для смс
          Serial.println(f);
          for (i = 0; i <= allNumber; i++) { // числоallNumber - это количество заданных тел.номеров.

            if (!f.compareTo(adminNumber[i])) {  //сверяем номер с номером прешедним SMS если в полученнойстроке найдет нужную подстраку ( номер наш ) то вернет индекс началаискомой строки а если ненайдет строку то вернет  -1
              Serial.println("RABOTAET");
              isStringMessage = true;
              break;
            }

          }

        }
        else if (currStr.startsWith("+CLIP")) {  // +CMT:"380xxxxxxxxx","","17/02/04,04:44:09+08"  в данном месте строкасодержит такие данные
          // если текущая строка начинается с "+CMT", тоследующая сообщение
          String f = currStr.substring(9, 20); //номер без + для звонков
          Serial.println(f);
          for (n = 0; n <= allNumber; n++) { // числоallNumber - это количество заданных тел.номеров.

            if (!f.compareTo(adminNumber[n])) {  //сверяем номер с номером прешедним SMS если в полученнойстроке найдет нужную подстраку ( номер наш ) то вернет индекс началаискомой строки а если ненайдет строку то вернет  -1
              Serial.println("RABOTAET");
              isStringCALL = true;
              break;
            }

          }

        }


        currStr = "";  // Очищаем строку для следущего сообщения
      }
    }
    else if ('\n' != currSymb) { //  игнорируем второй символ впоследовательности переноса строки: \r\n , и
      currStr += String(currSymb); //дополняем текущую командуновым сиволом ( посимвольно собераем строку с сообщением )
    }
  }
}

//===========================================================================================================================================

// Процедура для отправки СМС
void sms(String text, String phone) {
  gprsSerial.println("AT+CMGS=\"" + phone + "\"");
  delay(1000);
  gprsSerial.print(text);
  delay(300);
  gprsSerial.print((char)26);
  delay(300);
}
bool atCommand(String comm, String res, unsigned int wait, byte count)
{
  byte i;
  for (i = 0; i < count; i++) {
    gprsSerial.println(comm);
    delay(wait); //ждем
    String s = gprsSerial.readString(); //читаем ответ
    Serial.println(s); // показываем ответ
    if (s.indexOf(res) != -1) { //ищем требуемый отклик
      digitalWrite(redPin, LOW);
      Serial.println("WORK");
      return true;

      break;
    }
  }
  digitalWrite(redPin, HIGH);
  Serial.println("NOT WORK");
  atCommand(F("AT"), "OK", 500, 1);
  atCommand(F("AT+IPR=4800"), "OK", 500, 1); //включаем соединение GPRS
  atCommand(F("AT+CLIP=1"), "OK", 500, 1);// Включаем АОН
  atCommand(F("AT+IFC=1, 1"), "OK", 500, 1);// устанавливаем программныйконтроль потоком передачи данных
  atCommand(F("AT+CMGF=1"), "OK", 100, 1); //режим кодировки текстовый
  atCommand(F("AT+CPBS=\"SM\""), "OK", 100, 1); //открываем доступ кданным телефонной книги SIM-карты
  atCommand(F("AT+CSCS=\"GSM\""), "OK", 100, 1); //текстовая кодировка GSM
  atCommand(F("AT+CNMI=1,2,2,1,0"), "OK", 100, 1); // включает оповещение оновых сообщениях, новые сообщения приходят в следующем формате: +CMT:"<номер телефона>", "", "<дата, время>", ( +CMT:"+380xxxxxxxxx","","17/02/04,04:44:09+08" ) сразу за ним идет самосообщение с новой строки
  atCommand(F("AT+CMGD=1,4"), "OK", 100, 1); //удаляем все смс
  return false;

}

//=====================================================================================

 

 
andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

а вы полную задачу проекта не хотите описать?

мне кажеться проще с нуля все написать....

avolon
Offline
Зарегистрирован: 31.01.2017

Все проще некуда!

Надо чтоб по приходе смс включались реле и выключались! Призвонке DTMF отрабатывать  выбор какую реле перегружать! С определенных  номеров номеров 4 шт!

Ну и приход смс при первом запуске ардуино!

Ну и кгда отрабатывает DTMF магал светодиод зеленый!

Если не отвечает GSM то горит красный! Это в крации!

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

avolon пишет:

Это в крации!

Млять, откуда вас столько в последний год, буквально? Это так сейчас русский преподают? Есть слово "вкратце", а вот "в крации" - это где-то в Средиземье, что ли?

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

5000 рублей + цена SIM800L модуля + БП к нему -> две недели работы после получения модуля + неделя на  тестирование.

не понятна фраза "Призвонке DTMF отрабатывать  выбор какую реле перегружать".

ЗЫ. Могу за 1000 рублей продать готовый, абсолютно работающий проект, но на A6 модеме, со следующим функционалом: включение и выключение реле по командам СМС, получение температуры на плате (ds18b20 стоит), перезагрузка модуля и самой ардуино по команде СМС. Ответы модема отображаются на LCD1602  - удобно при тестировании. Добавление телефонных номеров контроля с админского номера.

 

avolon
Offline
Зарегистрирован: 31.01.2017

andycat пишет:

5000 рублей + цена SIM800L модуля + БП к нему -> две недели работы после получения модуля + неделя на  тестирование.

не понятна фраза "Призвонке DTMF отрабатывать  выбор какую реле перегружать".

ЗЫ. Могу за 1000 рублей продать готовый, абсолютно работающий проект, но на A6 модеме, со следующим функционалом: включение и выключение реле по командам СМС, получение температуры на плате (ds18b20 стоит), перезагрузка модуля и самой ардуино по команде СМС. Ответы модема отображаются на LCD1602  - удобно при тестировании. Добавление телефонных номеров контроля с админского номера.

 

Пиши на почту обсудимс!

 

avolon
Offline
Зарегистрирован: 31.01.2017

Уменя уже собрана плата ,надо скетч !

Как все подключено могу обьяснить в почту там и фотки скину как и что подключено

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

avolon пишет:

Уменя уже собрана плата ,надо скетч !

Как все подключено могу обьяснить в почту там и фотки скину как и что подключено

отправил письмо...

Понимаете ли.....писать и тестировать скетч без "железа" - напрасная трата времени, с СМСками все просто, т.е. я могу текущий скетч переделать под ваши требования, но DTMF я "не щупал" и вероятность того что заработает близка к нулю. Покупать SIM800 модуль просто так ну никакого желания.

man9913
Offline
Зарегистрирован: 19.03.2016

Есть sim800l, если не срастется с другими исполнителями, то могу сделать за 10тр. man9913@mail.ru

m_t
Offline
Зарегистрирован: 29.03.2012
Вышлите полное ТЗ на почту
m_t01@mail.ru
в сообщении указывайте страницу объявления