Прошу помощи по отправке СМС SIM800L

vgk_com
Offline
Зарегистрирован: 02.03.2017

Подскажите пожалуйста в чем может быть пробемма. Если заливаю этот скетч

#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");
}

 

 
 
vgk_com
Offline
Зарегистрирован: 02.03.2017

Может кому поможет, потратил много времени, чтоб отправить смс. Вытащил этот код с библиотеки. теперь смс отправляет. За скетч не ругайте я новичек, теперь можно шлифовать.

 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);
  }

 

Pahan
Offline
Зарегистрирован: 03.02.2017

Доброго времени суток всем!

Осваиваю 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 может кто с этим сталкивался, либо как мне их подружить.

Подскажите, где собака зарыта?

 

 

 

vgk_com
Offline
Зарегистрирован: 02.03.2017

Попробой этот код, 



// библиотека для работы с 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());

}

Позже еще выложу вариант, я тоже долго мучался

vgk_com
Offline
Зарегистрирован: 02.03.2017

Вот этот скетч у меня работает. Работатет только на скорости 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");
}

 

Pahan
Offline
Зарегистрирован: 03.02.2017

Такой я уже пробовал, так работает

#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); //дополняем текущую команду новым сиволом
 }
}

 

Pahan
Offline
Зарегистрирован: 03.02.2017

с библиотеками 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

и т.д. по кругу. Почему сторожевой таймер срабатывает? 

vgk_com
Offline
Зарегистрирован: 02.03.2017

В этом скетче нет функции отправки СМС, пробовал вставлять. У меня прием происходил, а отправка нет.

#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); //дополняем текущую команду новым сиволом
 }
}