Сегодня мы добрались наконец к одной из интереснейших тем, косающихся 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.
Теперь сделаем постоянную периодическую отправку SMS, перенеся код в loop.
Добавим delay в 5 секунд.
В результате получаем 85 °C.
Я забыл из примера скопировать следующую функцию опроса датчика. Теперь должно работать правильно.
Всё хорошо – 27 °C. Ещё я тут временно задержку увеличил до 20 секунд.
Сейчас уменьшу до 5 секунд и загружу по новой.
Теперь я доволен. Полученное устройство постоянно пишет SMS сообщения с температурой своему хозяину. Периодичность можно увеличить, чтобы SMS вам не надоедали. Так мы научились отправлять текстовые сообщения при помощи GSM модуля SIM800.