Прошу помощи по отправке СМС SIM800L
- Войдите на сайт для отправки комментариев
Вс, 05/03/2017 - 08:42
Подскажите пожалуйста в чем может быть пробемма. Если заливаю этот скетч
#include <SoftwareSerial.h>
SoftwareSerial gprsSerial(50, 51);
void setup(void)
{
Serial.begin(9600);
delay(30);
gprsSerial.begin(9600);
delay(300);
}
void loop()
{
if (gprsSerial.available())
Serial.write(gprsSerial.read());
if (Serial.available())
gprsSerial.write(Serial.read());
}
И задаю АТ команды на отпраку СМС, все отправляется:
AT
OK
AT+CMGS="+795********"
> Privet
+CMGS: 5
OK
В этой программе прием СМС происходит, диоды загараются, код СМС проходит но СМСки не отправляются.
Очень прошу помощи. Заранее спасибо. Испробовал много вариантов с форума, но так п не смог разлбраться.
#include <SoftwareSerial.h>
SoftwareSerial gprsSerial(50, 51);
int greenPin = 11;
int yellowPin = 13;
int btnPin = 7;
boolean prevBtn = LOW;
String mess;
void setup(void)
{
Serial.begin(9600);
delay(10);
gprsSerial.begin(9600);
delay(300);
gprsSerial.print("AT+IPR=9600\r");
delay(500);
pinMode(greenPin, OUTPUT);
pinMode(yellowPin, OUTPUT);
// Настраиваем приём сообщений с других устройств
// Между командами даём время на их обработку
gprsSerial.print("AT+CMGF=1\r");
delay(300);
gprsSerial.print("AT+IFC=1, 1\r");
delay(300);
gprsSerial.print("AT+CPBS=\"SM\"\r");
delay(300);
gprsSerial.println("AT+CSCS=\"GSM\"");
delay(300);
gprsSerial.print("AT+CNMI=2,2\r"); // gprsSerial.print("AT+CNMI=2,2,2,1,0\r");
delay(500);
}
String currStr = "";
// Переменная принимает значение True, если текущая строка является сообщением
boolean isStringMessage = false;
void loop()
{
boolean currBtn = digitalRead(btnPin);
if (prevBtn != currBtn && currBtn == HIGH) { //кнопка для отправки смс
sendTextMessage("knopka");
Serial.println ("knopka");
}
prevBtn = currBtn;
if (!gprsSerial.available())
return;
char currSymb = gprsSerial.read();
if ('\r' == currSymb) {
if (isStringMessage) {
//если текущая строка - SMS-сообщение,
//отреагируем на него соответствующим образом
if (!currStr.compareTo("A")) {
digitalWrite(greenPin, HIGH);
mess = ("Green vkl");
sendTextMessage(mess);
} else if (!currStr.compareTo("S")) {
digitalWrite(greenPin, LOW);
mess = ("Green otkl");
sendTextMessage(mess);
} else if (!currStr.compareTo("Z")) {
digitalWrite(yellowPin, HIGH);
mess = ("Yellow vkl");
sendTextMessage(mess);
} else if (!currStr.compareTo("X")) {
digitalWrite(yellowPin, LOW);
mess = ("Yellow otkl");
sendTextMessage(mess);
}
isStringMessage = false;
} else {
if (currStr.startsWith("+CMT")) {
//если текущая строка начинается с "+CMT",
//то следующая строка является сообщением
isStringMessage = true;
}
}
currStr = "";
} else if ('\n' != currSymb) {
currStr += String(currSymb);
}
}
void sendTextMessage(String mes) {
Serial.println ("SMS START");
delay(300);
if (gprsSerial.println("AT+CMGF=1")); // Устанавливает текстовый режим для SMS-сообщений
{ Serial.println ("AT+CMGF=1 OK"); }
delay(300); // даём время на усваивание команды
if (gprsSerial.println (("AT+CSCS=\"GSM\"")));
{ Serial.println ("AT+CSCS= GSM OK"); }
delay(300);
gprsSerial.print("AT + CMGS =");
gprsSerial.print((char)34);
gprsSerial.print ("+79519827414");
gprsSerial.print((char)34);
gprsSerial.println((char)13);
delay(1500);
// Пишем текст сообщения
gprsSerial.print(mes);
delay(700);
gprsSerial.print ((char)26); // Отправляем Ctrl+Z, обозначая, что сообщение готово
delay(3000);
Serial.println ("SMS STOP");
}
Может кому поможет, потратил много времени, чтоб отправить смс. Вытащил этот код с библиотеки. теперь смс отправляет. За скетч не ругайте я новичек, теперь можно шлифовать.
void sendTextMessage(String mes) { String number = "+795********"; gprsSerial.print ("AT+CMGF=1\r"); // Устанавливает текстовый режим для SMS-сообщений delay(300); gprsSerial.print (F("AT+CMGS=\"")); // command to send sms gprsSerial.print (number); gprsSerial.print(F("\"\r")); gprsSerial.print(mes); gprsSerial.print ("\r"); delay(700); gprsSerial.print ((char)26); // Отправляем Ctrl+Z, обозначая, что сообщение готово delay(3000); }Доброго времени суток всем!
Осваиваю SIM800l, пытаюсь его прикрутить к ESP8266 12e (NodeMcu) через библиотеки типа sim900, хочу научиться, но пока ничего не получается.
Сам Sim800l рабочий, питание отдельное нормальное 4,2в на 2 А. Через софтсериал модем работает, АT команды принимает и на них отвечает правильно. ESP кА тоже рабочая, GND общий. Скорости менял.
Модем никак не хочет работать с библиотеками( причем разными) sim900,sim800 и т.д.
В некоторых библиотеках работают примеры только с АT командами и все.
В GSM.cpp менял пины и так и так (т.е. D1(5) и D2(4) для esp8266)
#define _GSM_TXPIN_ 4
#define _GSM_RXPIN_ 5
#define _GSM_TXPIN_ D2
#define _GSM_RXPIN_ D1
Все равно смс, звонки и т.д. не работает. На разных библиотеках пишет либо ошибка компиляции для платы ESP8266, либо компилируется, но не работает, так понимаю сторожевой таймер срабатывает. ( в сериал шпарит перезагрузка) Может где в этих библиотеках что-то нужно поменять под ESP8266?
Я так понимаю все билиотеки под разные ардуино написаны, а для ESP8266 есть библиотеки для SIM800L может кто с этим сталкивался, либо как мне их подружить.
Подскажите, где собака зарыта?
Попробой этот код,
// библиотека для работы с GPRS устройством #include <GPRS_Shield_Arduino.h> // библиотека для эмуляции Serial порта // она нужна для работы библиотеки GPRS_Shield_Arduino #include <SoftwareSerial.h> #define PHONE_NUMBER "+7************" // номер сообщения в памяти сим-карты int messageIndex = 0; #define MESSAGE_LENGTH 160 // текст сообщения char message[MESSAGE_LENGTH]; // номер, с которого пришло сообщение char phone[16]; // дата отправки сообщения char datetime[24]; String myCommand; int led12 = D4; // создаём объект mySerial и передаём номера управляющих пинов RX и TX SoftwareSerial mySerial(D1, D2); // создаём объект класса GPRS и передаём в него объект mySerial GPRS gprs(mySerial); void setup() { // открываем последовательный порт для мониторинга действий в программе Serial.begin(9600); // открываем Serial-соединение с GPRS Shield mySerial.begin(9600); pinMode(led12, OUTPUT); digitalWrite(led12, LOW); // ждём, пока не откроется монитор последовательного порта // для того, чтобы отследить все события в программе while (!Serial) { } Serial.print("Serial init OK\r\n"); // включаем GPRS шилд gprs.powerOn(); // проверяем есть ли связь с GPRS устройством while (!gprs.init()) { // если связи нет, ждём 1 секунду // и выводим сообщение об ошибке // процесс повторяется в цикле // пока не появится ответ от GPRS устройства delay(1000); Serial.print("Init error\r\n"); } // выводим сообщение об удачной инициализации GPRS Shield Serial.println("GPRS init success"); // отправляем сообщение по указанному номеру с заданным текстом gprs.sendSMS("+7**********", "Hello SMS from Amperka!"); } void loop() { // если пришло новое сообщение if (gprs.ifSMSNow()) { // читаем его gprs.readSMS(message, phone, datetime); myCommand = message; if (myCommand == "A"){ digitalWrite(led12, HIGH); Serial.print (message); myCommand = String ("VKL:\r") + String("end"); //(char*)(mes.c_str()) GetSMS (myCommand); } if (myCommand == "S"){ digitalWrite(led12, LOW); Serial.print (message); myCommand = String ("OTKL:\r") + String("end"); //(char*)(mes.c_str()) GetSMS (myCommand); } // выводим номер, с которого пришло смс Serial.print("From number: "); Serial.println(phone); // выводим дату, когда пришло смс Serial.print("Datetime: "); Serial.println(datetime); // выводим текст сообщения Serial.print("Recieved Message: "); Serial.println(message); } } void GetSMS (String text) { gprs.sendSMS(PHONE_NUMBER, (char*)text.c_str()); //(char*)text.c_str()); }Позже еще выложу вариант, я тоже долго мучался
Вот этот скетч у меня работает. Работатет только на скорости 9600. Иногда после заливки скетча нужно перезагрузить модем и ESP.
#include <SoftwareSerial.h> SoftwareSerial gprsSerial(D1, D2); int greenPin = D7; int yellowPin = D8; int btnPin = D0; boolean prevBtn = LOW; String mess; void setup(void) { Serial.begin(9600); delay(10); gprsSerial.begin(9600); delay(300); gprsSerial.print("AT+IPR=9600\r"); // delay(500); pinMode(greenPin, OUTPUT); pinMode(yellowPin, OUTPUT); // Настраиваем приём сообщений с других устройств // Между командами даём время на их обработку gprsSerial.print("AT+CMGF=1\r"); delay(300); gprsSerial.print("AT+IFC=1, 1\r"); delay(300); gprsSerial.print("AT+CPBS=\"SM\"\r"); delay(300); gprsSerial.println("AT+CSCS=\"GSM\""); delay(300); gprsSerial.print("AT+CNMI=2,2\r"); delay(500); } String currStr = ""; // Переменная принимает значение True, если текущая строка является сообщением boolean isStringMessage = false; void loop() { boolean currBtn = digitalRead(btnPin); if (prevBtn != currBtn && currBtn == HIGH) { //кнопка для отправки смс Serial.println ("knopka"); sendTextMessage("knopka"); } prevBtn = currBtn; if (!gprsSerial.available()) return; char currSymb = gprsSerial.read(); if ('\r' == currSymb) { if (isStringMessage) { //если текущая строка - SMS-сообщение, //отреагируем на него соответствующим образом if (!currStr.compareTo("A")) { digitalWrite(greenPin, HIGH); mess = ("Green vkl"); sendTextMessage(mess); } else if (!currStr.compareTo("S")) { digitalWrite(greenPin, LOW); mess = ("Green otkl"); sendTextMessage(mess); } else if (!currStr.compareTo("Z")) { digitalWrite(yellowPin, HIGH); mess = ("Yellow vkl"); sendTextMessage(mess); } else if (!currStr.compareTo("X")) { digitalWrite(yellowPin, LOW); mess = ("Yellow otkl"); sendTextMessage(mess); } isStringMessage = false; } else { if (currStr.startsWith("+CMT")) { //если текущая строка начинается с "+CMT", //то следующая строка является сообщением isStringMessage = true; } } currStr = ""; } else if ('\n' != currSymb) { currStr += String(currSymb); } } void sendTextMessage(String mes) { String number = "+79***********"; // замени на свой Serial.println ("SMS START"); gprsSerial.print (F("AT+CMGF=1\r")); // Устанавливает текстовый режим для SMS-сообщений delay(300); gprsSerial.print (F("AT+CMGS=\"")); // command to send sms gprsSerial.print (number); gprsSerial.print(F("\"\r")); gprsSerial.print(mes); gprsSerial.print ("\r"); delay(700); gprsSerial.print ((char)26); // Отправляем Ctrl+Z, обозначая, что сообщение готово delay(3000); Serial.println ("SMS STOP"); }Такой я уже пробовал, так работает
#include <SoftwareSerial.h> SoftwareSerial gprsSerial(D1, D2); // TX SIM800 к D1, RX SIM800 к D2 #define RELE D4 // нагрузка bool rele = LOW; char* adminNumber[]={"+79====="}; int8_t i; void setup() { Serial.begin(115200); gprsSerial.begin(115200); pinMode(RELE, OUTPUT); digitalWrite(RELE, LOW); // настройка приема сообщений gprsSerial.print("AT+CMGF=1\r"); // устанавливаем текстовый режим смс-сообщения delay(500); // gprsSerial.print("AT+IFC=1, 1\r"); // устанавливаем программный контроль потоком передачи данных delay(500); gprsSerial.print("AT+CPBS=\"SM\"\r"); // открываем доступ к данным телефонной книги SIM-карты delay(500); gprsSerial.print("AT+CNMI=1,2,2,1,0\r"); // включает оповещение о новых сообщениях, новые сообщения приходят в следующем формате: +CMT: "<номер телефона>", "", "<дата, время>", //на следующей строчке с первого символа идёт содержимое сообщения delay(700); } String currStr = ""; // если эта строка сообщение, boolean isStringMessage = false; // то ставим флаг на разрешение оброботки SMS void loop() { if (!gprsSerial.available())// если нет данных от модуля SIM800l, то дальше не идем. return; char currSymb = gprsSerial.read(); // записываем в переменую символы, которые получили от модуля. if ('\r' == currSymb) // если получили символ перевода коректи в начало строки, это означает что передача сообщения от модуля завершена. { if (isStringMessage) { // если текущая строка – сообщение, то… if (!currStr.compareTo("1")) { // если текст сообщения совпадает с "1", rele = HIGH; // то включаем реле. digitalWrite(RELE, rele); } if (!currStr.compareTo("0")) { // если текст сообщения совпадает с "0", rele = LOW; // то выключаем реле. digitalWrite(RELE, rele); } isStringMessage = false; } else { if (currStr.startsWith("+CMT")) { // если текущая строка начинается с "+CMT", то следующая сообщение for (i = 0; i <= 2; i++) { // число 2 - это количество заданных тел.номеров. if (currStr.indexOf(adminNumber[i])) //сверяем номер с номером прешедним SMS { Serial.println(adminNumber[i]); isStringMessage = true; break; } } } } currStr = ""; } else if ('\n' != currSymb) { // игнорируем второй символ в последовательности переноса строки: \r\n , и currStr += String(currSymb); //дополняем текущую команду новым сиволом } }с библиотеками sim800 и ESP8266 пока никак не хотят работать
в сериал пишет:
GSM Shield testing.
DB:ELSE
DB:ELSE
DB:ELSE
DB:CORRECT BR
status=READY
Soft WDT reset
ctx: cont
sp: 3ffef850 end: 3ffefac0 offset: 01b0
и т.д. по кругу. Почему сторожевой таймер срабатывает?
В этом скетче нет функции отправки СМС, пробовал вставлять. У меня прием происходил, а отправка нет.
#include <SoftwareSerial.h> SoftwareSerial gprsSerial(D1, D2); // TX SIM800 к D1, RX SIM800 к D2 #define RELE D4 // нагрузка bool rele = LOW; char* adminNumber[]={"+79====="}; int8_t i; void setup() { Serial.begin(115200); gprsSerial.begin(115200); pinMode(RELE, OUTPUT); digitalWrite(RELE, LOW); // настройка приема сообщений gprsSerial.print("AT+CMGF=1\r"); // устанавливаем текстовый режим смс-сообщения delay(500); // gprsSerial.print("AT+IFC=1, 1\r"); // устанавливаем программный контроль потоком передачи данных delay(500); gprsSerial.print("AT+CPBS=\"SM\"\r"); // открываем доступ к данным телефонной книги SIM-карты delay(500); gprsSerial.print("AT+CNMI=1,2,2,1,0\r"); // включает оповещение о новых сообщениях, новые сообщения приходят в следующем формате: +CMT: "<номер телефона>", "", "<дата, время>", //на следующей строчке с первого символа идёт содержимое сообщения delay(700); } String currStr = ""; // если эта строка сообщение, boolean isStringMessage = false; // то ставим флаг на разрешение оброботки SMS void loop() { if (!gprsSerial.available())// если нет данных от модуля SIM800l, то дальше не идем. return; char currSymb = gprsSerial.read(); // записываем в переменую символы, которые получили от модуля. if ('\r' == currSymb) // если получили символ перевода коректи в начало строки, это означает что передача сообщения от модуля завершена. { if (isStringMessage) { // если текущая строка – сообщение, то… if (!currStr.compareTo("1")) { // если текст сообщения совпадает с "1", rele = HIGH; // то включаем реле. digitalWrite(RELE, rele); } if (!currStr.compareTo("0")) { // если текст сообщения совпадает с "0", rele = LOW; // то выключаем реле. digitalWrite(RELE, rele); } isStringMessage = false; } else { if (currStr.startsWith("+CMT")) { // если текущая строка начинается с "+CMT", то следующая сообщение for (i = 0; i <= 2; i++) { // число 2 - это количество заданных тел.номеров. if (currStr.indexOf(adminNumber[i])) //сверяем номер с номером прешедним SMS { Serial.println(adminNumber[i]); isStringMessage = true; break; } } } } currStr = ""; } else if ('\n' != currSymb) { // игнорируем второй символ в последовательности переноса строки: \r\n , и currStr += String(currSymb); //дополняем текущую команду новым сиволом } }