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
Я не могу, но Вы запостите в "Ищу исполнителя", там достаточно народу, который разбирается.
Ок спасибо!