Привіт колеги! Сьогодні ми дісталися нарешті однієї з найцікавіших тем, що стосуються 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.
Із задоволенням прочитаю ваші коментарі. Підтримайте мене підпискою на канал та лайком. Всім дякую і скоро побачимося!
Модуль двох кнопок 50х25мм
Дві кнопки 12х12мм на платі з отворами під кріплення.Вмика в коло можна за допомогою пайки або через..
54.77грн.
Світлодіодна стрічка адресна WS2812B 1м 30led
Трьохкольорова світлодіодна стрічка на основі адресних світлодіодів WS2812B 30 світлодіодів ..
125.63грн.
Оптопара EL817 SMD
Оптопара з транзистором на виходіЗастосовується для гальванічної розв'язки дискретного сигналу, а та..
4.28грн.
Діммер регулятор потужності симісторний 220В 8А
Регулятор потужності на основі симістора BTA16-600Принцип регулювання побудований на тому, що через ..
111.67грн.
Термопара K-типу 0...600°C з перетворювачем MAX6675
Термопара хромель-алюмель розрахована на вимірювання температури в діапазоні 0 ... 600 °CДовжин..
165.83грн.





