Привіт колеги! Сьогодні ми дісталися нарешті однієї з найцікавіших тем, що стосуються 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.
Із задоволенням прочитаю ваші коментарі. Підтримайте мене підпискою на канал та лайком. Всім дякую і скоро побачимося!
Клавіатура для панелі управління аналогова
Аналогова клавіатура може використовуватися як джойстик керування або як панель управління менюшкою ..
100.02грн.
Радіо модуль NRF24L01
Радіомодуль nRF24L01 (2,4 ГГц, SPI) nRF24L01 — компактний радіопередавач-приймач для бездротового..
54.65грн.
Міні кнопка 12 x 12 x 4,3 мм
Мініатюрна кнопка для встановлення на плату через отвориРозміри 12 x 12 x 4,3 мм..
4.14грн.
Вентилятор для Orange PI товщиною 10мм
Вентилятор для охолодження процесора міні-комп'ютера Orange PI або Raspberry PIПрацює дуже тихоЖивле..
60.63грн.
ESP32 та Telegram-бот: віддалене керування через інтернет
ESP32 та Telegram-бот: віддалене керування через інтернет Мікроконтролер ESP32 має вбудований W..





