Привіт друзі! Минулого відео ми розібрали ручне управління GSM-модулем набираючи команди в моніторі порту. А цього разу розберемо тему: SIM800 Arduino – автоматичні команди.
Попередній відео-блог отримав помітну підтримку з вашого боку. Я вдячний за кожен ваш лайк та комент. Також я взяв на замітку всі ваші побажання щодо наступних тем. Продовжуйте і надалі писати свої пропозиції та питання для розбору у наступних випусках.
У цьому відео я хочу розібрати два практичні підходи до автоматичного управління модемом SIM800 за допомогою контролера Arduino Nano. У своїх проектах я використовую їх обоє. І в подальших блогах я буду ґрунтуватися саме на них, розповідаючи про застосування GSM-модуля.
Найпростіша технологія автоматичного відправлення команд від Arduino до SIM800 – це просто в коді програми вставляти стандартні функції для роботи з UART-портом. Я модифікую код із попереднього відео та отримую наступний простий скетч.
#include <SoftwareSerial.h> SoftwareSerial SIM800serial (2, 3); void setup() { Serial.begin(9600); SIM800serial.begin(9600); } void loop() { SIM800serial.println("AT"); delay(1000); while (SIM800serial.available()) { Serial.print(SIM800serial.readString()); } }
Все нове зібрано в циклі loop(). Функція println – власне і є та найпростіша технологія відправлення автоматичної АТ-команди. Далі йдуть додаткові необов'язкові операнди, які я тут вписав лише для наочної демонстрації роботи першого робочого рядка коду. Функція println тут отримує AT-команду у рядковому текстовому вигляді та передає її через програмний UART-порт контролера на такий самий порт модему SIM800.
Функція затримки часу ділить кожну відправку цієї команди на одну секунду.
Наступний цикл while зчитує відповідь модему і друкує його монітор порту теж у рядковому вигляді.
Завантажуємо програму в Arduino та запускаємо монітор порту.
Бачимо отримання відповіді на команду АТ кожну секунду. Можете спробувати написати і інші команди, а також кілька команд поспіль. Такий метод автоматичного відправлення команд корисний, коли маємо справу з командами, відповідь модему на які нам не дуже цікава. Наприклад, після включення живлення можна в такий спосіб відправити кілька команд АТ, щоб SIM800 автоматично визначила швидкість обміну послідовним портом. Так само в деяких випадках, як відправлення тексту SMS-повідомлення, прості функції println і write, що стосуються роботи з портом UART, прийдуть нам на допомогу в наступних відео-блогах. Тому залишаємо перший приклад на замітку та переходимо до його ускладнення для більш ювелірної роботи з GSM-модулями.
Розберемо три канонічні функції, які опубліковані в багатьох статей, що описують проекти на модемах типу SIM800L. Ми їх один раз вивчимо, прикріпимо до скетчу, і постійно використовуватимемо у подальших блогах та проектах.
#define OK 1
#define NOTOK 2
#define TIMEOUT 3
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;
}
return retVal;
}
String SIM800read() {
String reply = "";
if (SIM800serial.available()) {
reply = SIM800serial.readString();
}
if (reply!=""){
Serial.print("Reply: ");
Serial.println(reply);
}
return reply;
}
Змінна returnValue містить значення типу byte, що повертається функцією. Спочатку тексту скетчу бачимо оголошення констант. Тут задаються імена трьох типів відповіді функцій: OK, NOTOK і TIMEOUT. Тут OK буде, якщо перша функція отримала позитивну або негативну відповідь. NOTOK для цієї функції означає вихід по таймаут після всіх заданих спроб. Константа TIMEOUT використовується лише у другій функції.
У циклі while міститься відправка тексту команди в порт SIM800, а також запуск функції waitFor. Цей цикл зупиниться після заданої кількості спроб або після надходження однієї з двох очікуваних відповідей GSM-модуля. Функція поверне одиницю або OK, якщо відповідь отримано, та двійку NOTOK, якщо минуло час таймууту для всіх заданих спроб.
Друга функція waitFor приймає три аргументи: два очікувані рядки відповіді та час таймууту. У циклі do…while йде звернення до третьої функції SIM800read кожну мілісекунду доки не закінчиться відведений час timeout або не надійде один з рядків у відповіді.
Далі йде формування повертається функцією відповіді. Цією відповіддю може бути 1, 2 або 3 або в іменованих константах OK, NOTOK або TIMEOUT.
А третя функція SIM800read без аргументів і повертає рядок відповіді на другу функцію, щоб вона пошукала очікувані відповіді. У третій функції йде перевірка надходження даних на вхід порту та читання їх у змінну reply. Далі, якщо ця змінна дійсно отримала текст, то активується роздрук його в монітор порту для діагностики. Щоб ми мали уявлення, про що говориться контролер і SIM800.
Тепер накидаємо найпростішу програму для перевірки роботи наших функцій. У секції setup() додано очікування 10сек після включення контролера на самодіагностику GSM-модуля та готовність до прийому запитів. На циклі loop() кожну секунду запускається функція SIM800command. Очікувані відповіді OK та ERROR. Таймаут 500мс та кількість спроб – одна.
#include <SoftwareSerial.h> SoftwareSerial SIM800serial (2, 3); #define OK 1 #define NOTOK 2 #define TIMEOUT 3 void setup() { Serial.begin(9600); SIM800serial.begin(9600); delay(10000); } void loop() { SIM800command("AT", "OK", "ERROR", 500, 1); delay(1000); }
Завантажую скетч у контролер та запускаю монітор порту.
Спочатку контролер чекає 10сек, потім циклічно починає надсилати автоматичні запити та друкує відповіді на них нам для діагностики.
Тепер поглянемо на вирізку з інструкції з АТ-команд для SIM800L та ознайомимося з типами AT-запитів, з якими вона заточена працювати. Тут 4 типи. Вони відрізняються синтаксисом. Перший – це тестова команда. Вона повертає список параметрів, які можна змінити, звертаючись до цієї команди третім типом. В автоматичному режимі цей тип не цікавий. Другий тип команд повертає поточне значення параметра, що зберігається у пам'яті SIM800. Третій тип дозволяє змінювати налаштування користувача в SIM800. Четвертий тип – це команда, що виконується, без змінних аргументів.
Для подальших експериментів я вибрав, можливо, малокорисну, але досить цікаву АТ-команду AT+CCLK. Ось її розшифровка із документації. Вона потрібна для роботи з внутрішнім годинником реального часу модуля SIM800. У самій мікросхеми SIM800 має бути виведення на годинну батарейку, але на даному модулі до нього немає доступу і годинник може відраховувати час тільки поки є живлення на виведенні VCC. Тут показано у вигляді задається і виводиться час. Спочатку йде дата, потім час і наприкінці часовий пояс зі знаком плюс чи мінус.
#include <SoftwareSerial.h> SoftwareSerial SIM800serial (2, 3); #define OK 1 #define NOTOK 2 #define TIMEOUT 3 void setup() { Serial.begin(9600); SIM800serial.begin(9600); delay(10000); SIM800command("AT", "OK", "ERROR", 500, 5); } void loop() { SIM800command("AT+CCLK?", "OK", "ERROR", 500, 1); //date & time of SIM800 delay(1000); }
Ось приклад програми для зчитування поточної дати-часу у модулі SIM800. Тут після включення Arduino чекає 10сек, потім намагається 5 разів відправити AT до отримання відповіді від модему, і далі в основному циклі програми щомиті відправляємо запит на читання годинника SIM800. Команда AT-CCLK. Позитивна відповідь OK. Негативна відповідь ERROR. Таймаут 500мс та кількість спроб 1.
Завантажую прогу в Arduino Nano і запускаю монітор порту.
Контролер спочатку чекає 10сек, потім відправляє команду перевірки AT, потім отримує відповідь від годинника. Вони показують на 2004 рік, перше число першого місяця, якийсь час і часовий пояс +2. Вони завжди так показуватимуть після подачі харчування.
А тепер спробуємо призначити внутрішнім годинникам GSM-модуля свої дату та час.
Скетч буде наступним: спочатку очікування 10сек, перевірна команда АТ, очікування 1сек, зчитуємо вихідну дату-час. Потім очікування 1сек і запис своїх дати-часу. 2021 рік, 12-й місяць, 12-те число, час та київський часовий пояс. І, нарешті, в циклі loop() кожну секунду просто зчитуємо хід часу.
#include <SoftwareSerial.h> SoftwareSerial SIM800serial (2, 3); #define OK 1 #define NOTOK 2 #define TIMEOUT 3 void setup() { Serial.begin(9600); SIM800serial.begin(9600); delay(10000); SIM800command("AT", "OK", "ERROR", 500, 5); delay(1000); SIM800command("AT+CCLK?", "OK", "ERROR", 500, 1); //date time of SIM800 delay(1000); SIM800command("AT+CCLK=\"21/12/12,16:25:33+02\"", "OK", "ERROR", 500, 1); //yy/mm/dd,hh:mm:ss+zz } void loop() { SIM800command("AT+CCLK?", "OK", "ERROR", 500, 1); //date time of SIM800 delay(1000); }
Завантажую до Arduino, запускаю монітор порту.
Бачимо очікування 10сек, команду АТ. Потім читання вихідного часу, потім успішна спроба записати свої дату-час. І далі у циклі бачимо відлік правильного часу.
Оскільки тут бачимо другий, третій і четвертий типи AT-запитів, можна сказати, що ми навчилися обробляти у автоматичному режимі всі три корисні цього режиму типи команд. І тепер нас ніщо не зможе зупинити у написанні скетчів під свої проекти. Також ми вивчили набір із трьох поширених функцій для автоматичної реалізації команд під час роботи з SIM800. Можливо, вони комусь видадуться недосконалими. Пишіть свої пропозиції щодо покращення. Але можу сказати, що вони цілком робітники, і я постійно їх використовую у своїх проектах.
У наступних відео розвиватимемо свої вміння – вивчатимемо AT-команди. Тема залежатиме від ваших коментарів, а швидкість виходу від кількості лайків. На цьому я прощаюсь – до нових зустрічей!
MOC3041 оптрон
Оптопара з симісторним виходом.Використовується для керування потужним симістором за допомогою логіч..
18.75грн.
Модуль 8 дискретних входів I2C на DIN-рейку без корпусу
Плата продається без коробкиМодуль вісьмох дискретних входів I2C для побудови домашньої або промисло..
614.85грн.
Термопара К-типу 200мм в кераміці до 1300 °C
Термопара ТХА з керамічним теплоізоляторомДіапазон робочих температур -50 ... +1300 °CДовжина 200 мм..
260.68грн.
Адаптер USB 2.0 в TTL UART
Комунікаційний конвертер USB 2.0 в TTL UARTЗаснований на мікросхемі CP2102Містить самовідновлюв..
120.03грн.
Універсальна плата під мікросхеми SOP20, SSOP20
Універсальна монтажна плата, дозволяє проводити монтаж різноманітних мікросхем з поверхневим монтаже..
16.66грн.