Віримо в перемогу ЗСУ!
Працюємо з 09:00 до 18:00 Пн-Пт

Привіт друзі! Минулого відео ми розібрали ручне управління 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;
}
Основною функцією тут є SIM800command. Звертатись із програми ми будемо безпосередньо тільки до неї, а вона вже викликатиме решту двох у міру виконання своїх операндів.

Перший аргумент у ній отримує рядкову команду, яку потрібно надіслати до GSM-модему.

Другий аргумент – це очікувана строкова відповідь або частина відповіді за позитивної реакції SIM800. Наприклад, рядок OK. Сюди вписуватимемо частину рядка відповіді, яку очікуємо побачити при правильному спрацюванні запиту.

Третій аргумент функції – це очікуваний рядок за негативної відповіді SIM800. Наприклад, рядок ERROR.

Четверта змінна для визначення часу очікування заданого позитивного рядка або негативного. Час у мілісекундах. Просто це називається таймаут. І, якщо ви неправильно поставте очікувані рядки відповіді, то функція при кожному її виклику буде крутитися до таймауту. Навіть коли SIM800 вже давно відповіла на запит.

Останній п'ятий аргумент містить кількість спроб надіслати запит із позитивною або негативною відповіддю. І на кожну спробу приділяється заданий час таймауту.

Змінна 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-команди. Тема залежатиме від ваших коментарів, а швидкість виходу від кількості лайків. На цьому я прощаюсь – до нових зустрічей!

<< Проекти << Усі товари >> Статті, уроки >>

Написати відгук

Примітка: HTML размітка не підтримується! Використовуйте звичайтий текст.
    Погано           Добре
Монтажний шилд для NodeMcu ESP8266

Монтажний шилд для NodeMcu ESP8266

Монтажний модуль розширення для WiFi контролера NodeMcu ESP8266Дозволяє виконувати монтаж ..

86.94грн.

Перетворювач рівнів 5В 3,3В 8-канальний

Перетворювач рівнів 5В 3,3В 8-канальний

Модуль 8-канального перетворювача логічних рівнів на спеціалізованій мікросхемі TXS0108E.Застосовуєт..

35.81грн.

Датчик вібрації SW-420

Датчик вібрації SW-420

Датчик вібрації має дискретний вихідЧутливість датчика налаштовується змінним резисторомПрацює з нап..

26.81грн.

Мініатюрний  WeMos D1 mini ESP8266

Мініатюрний WeMos D1 mini ESP8266

Дуже маленька і дешева плата WeMos D1 mini контролера з WiFi зв'язком на борту. Має не багато в..

134.76грн.

Управління тиристорами та симисторами

Управління тиристорами та симисторами

Найпростіше включення тиристора та симистора У різних електронних пристроях в колах змінного струму..