Sim800l реле DTMF отправка смс!
- Войдите на сайт для отправки комментариев
Пнд, 09/04/2018 - 12:14
Привет! Несудите строго но код собран отовсюду ))
Нужна помощ оптимизировать код за вознаграждение!
И доработать его в плане 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; } //=====================================================================================
а вы полную задачу проекта не хотите описать?
мне кажеться проще с нуля все написать....
Все проще некуда!
Надо чтоб по приходе смс включались реле и выключались! Призвонке DTMF отрабатывать выбор какую реле перегружать! С определенных номеров номеров 4 шт!
Ну и приход смс при первом запуске ардуино!
Ну и кгда отрабатывает DTMF магал светодиод зеленый!
Если не отвечает GSM то горит красный! Это в крации!
Это в крации!
Млять, откуда вас столько в последний год, буквально? Это так сейчас русский преподают? Есть слово "вкратце", а вот "в крации" - это где-то в Средиземье, что ли?
5000 рублей + цена SIM800L модуля + БП к нему -> две недели работы после получения модуля + неделя на тестирование.
не понятна фраза "Призвонке DTMF отрабатывать выбор какую реле перегружать".
ЗЫ. Могу за 1000 рублей продать готовый, абсолютно работающий проект, но на A6 модеме, со следующим функционалом: включение и выключение реле по командам СМС, получение температуры на плате (ds18b20 стоит), перезагрузка модуля и самой ардуино по команде СМС. Ответы модема отображаются на LCD1602 - удобно при тестировании. Добавление телефонных номеров контроля с админского номера.
5000 рублей + цена SIM800L модуля + БП к нему -> две недели работы после получения модуля + неделя на тестирование.
не понятна фраза "Призвонке DTMF отрабатывать выбор какую реле перегружать".
ЗЫ. Могу за 1000 рублей продать готовый, абсолютно работающий проект, но на A6 модеме, со следующим функционалом: включение и выключение реле по командам СМС, получение температуры на плате (ds18b20 стоит), перезагрузка модуля и самой ардуино по команде СМС. Ответы модема отображаются на LCD1602 - удобно при тестировании. Добавление телефонных номеров контроля с админского номера.
Пиши на почту обсудимс!
Уменя уже собрана плата ,надо скетч !
Как все подключено могу обьяснить в почту там и фотки скину как и что подключено
Уменя уже собрана плата ,надо скетч !
Как все подключено могу обьяснить в почту там и фотки скину как и что подключено
отправил письмо...
Понимаете ли.....писать и тестировать скетч без "железа" - напрасная трата времени, с СМСками все просто, т.е. я могу текущий скетч переделать под ваши требования, но DTMF я "не щупал" и вероятность того что заработает близка к нулю. Покупать SIM800 модуль просто так ну никакого желания.
Есть sim800l, если не срастется с другими исполнителями, то могу сделать за 10тр. man9913@mail.ru