sim800l отправка SMS
- Войдите на сайт для отправки комментариев
Пнд, 09/04/2018 - 10:01
Привет! Несудите строго но код собран отовсюду )) Вопрос в чем ,переодически выполняется код sms("OK-V-RABOTE", phone_admin); Хотя он должен тока раз выполнится при перезагрузке Ардуино!! При этом реле не щелкают оборудование работает и светодиод не тухнет! Напряжение не падало ! Что еще может быть ? Код приложил!
#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; } //=====================================================================================
Вопрос в чем ,переодически выполняется код sms("OK-V-RABOTE", phone_admin); Хотя он должен тока раз выполнится при перезагрузке Ардуино!! При этом реле не щелкают оборудование работает и светодиод не тухнет! Напряжение не падало ! Что еще может быть ?
Вариант #1: бесовская сила вселилась в ардуину. Бутлоадер не 666 байт весит, случаем?
он должен тока раз выполнится при перезагрузке Ардуино!!
Значит, в процессе работы выполняется перезагрузка в том или ином виде. Других вариантов нет.
Что еще может быть?
Думаю, главная причина в том, что
код собран отовсюду
Если Вам нужен нормальный код для проекта "сложнее блинка", напишите его сами или закажите тому, кто умеете это делать.
Сейчас код выглядит просто ... философски, я бы сказал. Например, строка 467, идущая после строки 465 - это просто некий монументальный экзистенциальный символ :)
ЕвгенийП
Сможете мне помочь оптимизировать код за вознаграждение? Если интересно пишите avolon.linux@gmail.com
Я не могу, но Вы запостите в "Ищу исполнителя", там достаточно народу, который разбирается.
Ок спасибо!