Arduino SIM800 отправка SMS

Сегодня мы добрались наконец к одной из интереснейших тем, косающихся GSM-модуля SIM800. В этом блоге мы напишем и протестируем две программы. Одну простую проверочную с отправкой текста в SMS, а вторую по-сложнее с отправкой измерянной температуры воздуха.

Я уже рассказывал о нашем модуле для соединения Arduino Nano и SIM800 в прошлых видео. Вы можете обойтись и без него.

Накидывая эту программу, я использовал наши наработки из предыдущих видео. Контроллер будет подавать команду на отправку SMS каждый раз при включении питания или перезагрузке.

#include <SoftwareSerial.h>

SoftwareSerial SIM800serial (2, 3);

#define OK 1
#define NOTOK 2
#define TIMEOUT 3

String txt;

void setup() {
  pinMode(5, OUTPUT);
  digitalWrite(5, HIGH); //SIM800 ON only for this module
  Serial.begin(9600);
  SIM800serial.begin(9600);
  delay(5000);
  SIM800command("AT", "OK", "ERROR", 500, 5);
  
  //SMS
  SIM800command("AT+CMGF=1", "OK", "ERROR", 2000, 1); //SMS to text mode - not PDU mode
  SIM800command("AT+CMGS=\"+380934158245\"", ">", "ERROR", 5000, 1);
  Serial.println("Waiting for text");
  String str = "Hello from Arduino and SIM800!"; //SMS text
  SIM800serial.print(str);//the content of the message
  Serial.println("Waiting for closing char ctrl-z");
  char j=0x1A;
  SIM800command((String)j, ">", "ERROR", 2000, 1);
  //SMS
}

void loop() {}
byte SIM800command(String command, String response1, String response2, uint16_t timeOut, uint16_t repetitions) {
  byte returnValue = NOTOK;
  byte countt = 0;
  
  while (countt < repetitions && returnValue != OK) {
    SIM800serial.println(command);
    
    if (SIM800waitFor(response1, response2, timeOut) == OK) {
      returnValue = OK;
    } else {returnValue = NOTOK;}
    countt++;
  }
  
  return returnValue;
}

byte SIM800waitFor(String response1, String response2, uint16_t timeOut) {
  uint16_t entry = 0;
  uint16_t count = 0;
  String reply = SIM800read();
  byte retVal = 99;

  do {
    reply = SIM800read();
    delay(1);
    entry ++;
  } while ((reply.indexOf(response1) + reply.indexOf(response2) == -2) && entry < timeOut );

  if (entry >= timeOut) {
    retVal = TIMEOUT;
  } else {
    if (reply.indexOf(response1) + reply.indexOf(response2) > -2) retVal = OK;
    else retVal = NOTOK;
  }
  txt = reply;
  return retVal;
}

String SIM800read() {
  String reply = "";

  if (SIM800serial.available())  {
    reply = SIM800serial.readString();
  }

  if (reply!=""){
    Serial.print("Reply: ");
    Serial.println(reply);
  }
  
  return reply;
}

Пин 5 здесь выставляет высокий уровень для подачи питания на SIM800. Это особенность нашего модуля. Давайте рассмотрим набор команд для отправки SMS, который рекомендует производитель GSM-модуля.

Здесь первая команда AT+CMGF=1 переводим систему SMS в текстовый режим. Вторая команда определяет кодировку текстового режима.

Вот показаны возможные варианты. По сути это урезанные наборы букв, символов для написания SMS. По умолчанию здесь будет IRA. Это латиница, которой мне всегда хватало. Поэтому я данный запрос пропускаю.

Последняя команда для построения исходящей SMS здесь называется AT+CMGS. Она содержит номер телефона получателя, а так же сам текст SMS. Эта команда отправляется последовательно: сначала номер телефона в скобках, потом SIM800 возвращает стрелочку или знак больше. Тогда мы должны передать текст сообщения и закрыть каретку сочетанием Ctrl+Z. Тогда модуль совершит попытку отправить SMS и возвратит диагностический ответ.

В скетче я сначала пишу команду текстового режима. Одна попытка с ожиданием ответа 2 секунды.

Потом идет команда с номером телефона. Одна попытка с ожиданием ответной строчки на протяжении 5 секунд.

Дальше идет печать текста прямо в программный UART порт контроллера функцией print.

В конце закрываем каретку.  Символ Ctrl+Z в 16-ричном формате соответствует числу 1A. Тут я отправляю это число командной функцией. Вот и все.

После загрузки этой программы, будет отправлено SMS сообщение Hello from Arduino and SIM800.

Теперь давайте напишем программу для демонстрации более практичного использования SIM800 для отправки SMS.

Для этого я возьму цифровой датчик температуры DS18B20 и подключу к тестовому пину контроллера Arduino Nano.

Красный провод к +5В, черный к GND, а жолтый к пину 6.

Так же припаиваю подтягивающий резистор между пином 6 и +5В.

Вот этот датчик температуры на схеме. Контроллер будет измерять температуру каждые 5 секунд, и отправлять её значение через SMS.

Открываю пример из библиотеки Dallas Temperature под названием Simple.

Копирую и вставляю необходимые для чтения датчика строки.

#include <SoftwareSerial.h>

SoftwareSerial SIM800serial (2, 3);

#define OK 1
#define NOTOK 2
#define TIMEOUT 3

String txt;

#include <OneWire.h>
#include <DallasTemperature.h>

#define ONE_WIRE_BUS 6
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

void setup() {
  pinMode(5, OUTPUT);
  digitalWrite(5, HIGH); //SIM800 ON only for this module
  Serial.begin(9600);
  SIM800serial.begin(9600);
  delay(5000);
  SIM800command("AT", "OK", "ERROR", 500, 5);
  sensors.begin();
  delay(500);
}

void loop() {
  //SMS
  SIM800command("AT+CMGF=1", "OK", "ERROR", 2000, 1); //SMS to text mode - not PDU mode
  SIM800command("AT+CMGS=\"+380934158245\"", ">", "ERROR", 5000, 1);
  Serial.println("Waiting for text");
  String str = "Temperature = "; //SMS text
  sensors.requestTemperatures(); 
  str += sensors.getTempCByIndex(0);
  str += " C";
  SIM800serial.print(str);//the content of the message
  Serial.println("Waiting for closing char ctrl-z");
  char j=0x1A;
  SIM800command((String)j, ">", "ERROR", 2000, 1);
  //SMS 
  delay(5000); 
}

Переменной str добавляю значение температуры, наименование параметра и значек градусов цельсия.

SMS не отправлена потому, что я не обозначил шестой пин.

Вот, теперь получилась отправка температуры 26 °C.

 https://youtu.be/IWrBXb3bt_A

 

Теперь сделаем постоянную периодическую отправку SMS, перенеся код в loop.

Добавим delay в 5 секунд.

В результате получаем 85 °C.

Я забыл из примера скопировать следующую функцию опроса датчика. Теперь должно работать правильно.

Всё хорошо – 27 °C. Ещё я тут временно задержку увеличил до 20 секунд.

Сейчас уменьшу до 5 секунд и загружу по новой.

Теперь я доволен. Полученное устройство постоянно пишет  SMS сообщения с температурой своему хозяину. Периодичность можно увеличить, чтобы SMS  вам не надоедали. Так мы научились отправлять текстовые сообщения при помощи GSM модуля SIM800.

Додати коментар


Захисний код
Оновити

EcoMonitoring

ЛІЧІЛЬНИК ВІДВІДУВАННЬ

Сьогодні 354
Вчора386
Цього тижня 740
Минулого тижня 2264
Цей місяць 8301
Минулий місяць 9310
За весь час 172335
Ваш IP: 3.22.68.71
Сегодня: 2025-04-28
Пользователей на сайте: 0
Гостей на сайте: 24