Привіт, друзі! Час продовжити тему SIM800.
У цьому відео ми навчимося вибирати GSM-оператора вручну та автоматично. Автоматичний режим вибору мобільного оператора увімкнено в SIM800 за замовчуванням. А ручний вибір дуже важливий для мешканців прикордонних населених пунктів. Для таких локацій, де є висока ймовірність нарватися на небажаний роумінг. Якщо ви виберете на GSM-пристрої свого місцевого оператора вручну, то дорогий роумінг вам не страшний.
В інструкції на AT-команди модуля SIM800 передбачено команду AT-COPS. Вона відповідає за вибір оператора. Тут перший запит AT-COPS =? повертає список знайдених поблизу мереж GSM-операторів. Список містить довгі імена операторів, скорочені, а також цифрові.

Другий запит AT+COPS? повертає поточний режим SIM800. Формат виведення наступний: номер режиму, формат найменування оператора та саме найменування.
Третя у списку йде команда, що управляє. У ній потрібно передати такі параметри, як режим, формат імені оператора та саме ім'я.
Тут вказано параметр "stat", але він по-моєму відноситься тільки до першого тестового запиту і визначає, виявлений оператор невідомий, доступний, поточний або заборонений.
Нам тут цікаві лише режими: 0-автоматичний, 1-ручний та можливо 4-й-ручний з автоматичним підхопленням.
А формати вказівки імені оператора у ручному режимі ми вивчимо на практиці.
Схема підключення Arduino Nano до GSM модуля SIM800L буде незмінною, як у попередніх відео.

Для дослідів я як завжди використовуватиму наш шилд для Arduino Nano + SIM800. Ви можете купити його у нас чи зібрати свою схему.
Шилд допомагає узгодити сигнали 5В і 3,3В, а також забезпечує рекомендовану напругу живлення SIM800, порядку 4В.
Підпишіться зараз і поставте лайк цьому відео тому, що я покажу вам різні варіанти застосування команди COPS на практиці.
Програма взята із попереднього відео. Я просто заміняю минулі команди на нову у секції loop. Для початку я хочу протестувати запит, який покаже поточне налаштування GSM-оператору.
//https://geekmatic.in.ua | https://pinout.uno#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); } void loop() { //current selection mode and operator SIM800command("AT+COPS?", "OK", "ERROR", 5000, 1); delay(2000); //to show the list of available operators SIM800command("AT+COPS=?", "OK", "ERROR", 20000, 1); //manual long alphanumeric SIM800command("AT+COPS=1,0,\"KYIVSTAR\"", "OK", "ERROR", 10000, 1); SIM800command("AT+COPS?", "OK", "ERROR", 5000, 1); //auto (default) SIM800command("AT+COPS=0", "OK", "ERROR", 10000, 1); //manual long alphanumeric SIM800command("AT+COPS=1,0,\"Astelit\"", "OK", "ERROR", 10000, 1); SIM800command("AT+COPS?", "OK", "ERROR", 5000, 1); //manual short alphanumeric SIM800command("AT+COPS=1,1,\"UA-KS\"", "OK", "ERROR", 10000, 1); SIM800command("AT+COPS?", "OK", "ERROR", 5000, 1); //manual with automatic fallback //If manual fails than automatic is entered SIM800command("AT+COPS=4,0,\"arduino\"", "OK", "ERROR", 10000, 1); SIM800command("AT+COPS?", "OK", "ERROR", 5000, 1); //manual long alphanumeric with error SIM800command("AT+COPS=1,0,\"arduino\"", "OK", "ERROR", 10000, 1); SIM800command("AT+COPS?", "OK", "ERROR", 5000, 1); delay(10000);}
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); txt = reply; } return reply;}
Після завантаження програми в контролер спочатку бачимо відповідь COPS:0. Це ще невизначений стан в автоматичному режимі.
На повторний запит SIM800 відповідає двома нулями та назвою поточного оператора.
Перший нуль – це автоматичний режим. Другий нуль – це формат найменування довгий літерний. Тобто модуль SIM800 повідомляє нам, що він при автоматичному визначенні оператора вибрав одного конкретного.
Далі ускладнюємо програму та додаємо запит на виведення списку доступних операторів.
Завантажую скетч в Arduino та отримую наступні відповіді SIM800. Бачимо список із трьох операторів.
Перша цифра – параметр stat. Одиниця означає, що цей оператор доступний.
Перше найменування – це довгий формат, потім іде короткий.
Остання цифра – це цифрове найменування оператора.
Ці два запити в скетчі будуть показувати повну діагностичну картину в нашому дослідженні.
Йдемо далі і додаємо команду для ручного призначення GSM-оператора. Тут перша цифра визначає ручний режим, а друга – довгий формат назви.
Також я сюди додав запит на відображення поточної настройки, щоб довго не чекати на підтвердження.
Після завантаження нової програми в Arduino бачимо правильний відгук на основну команду, що управляє. Одиниця – це ручний режим, а нуль – це довгий формат.
Тепер я покажу, як повернути автоматичне підключення до мережі GSM. І тому вставляю команду COPS=0.
Також поруч залишаю запит на поточний стан підключення.
Перший нуль означає автоматичний вибір оператора модулем SIM800.
Тепер давайте спробуємо вручну підключитися до іншого оператора, який не відноситься до моєї SIM-картки.
Ось пройшла команда на підключення до стороннього оператора.
А ось SIM800 вже підключилася до нього без проблем.
Тепер я заміню в основній команді два параметри.
Друга одиниця задасть короткий формат імені.
А коротке ім'я введу від першого GSM-оператора. І перевіримо нашу команду у короткому форматі імені.
Короткий формат на SIM800 також добре працює.
А тепер зміню налаштування та перевіримо четвертий режим визначення оператора. Це ручний режим, який під час невдалого підключення переходить в автоматичний. Та назва я спеціально взяв неправильне. Операторів Arduino у моїй країні немає.
При обробці наперед неправильного найменування SIM800 лається і не хоче переходити в четвертий режим. Просто відкидає керуючий запит. Ну не знаходиш ти такого оператора, то перейди в четвертий режим і знайди відповідного оператора автоматично! Так ні! Взагалі не переходить у четвертий режим. Беремо це на замітку.
Це був четвертий режим, а як поведеться SIM800L при помилковій назві у першому ручному режимі.
У цьому режимі також бачимо помилку та ігнорування команди.
Я більш детально розібрав такі нюанси для роботи над можливими помилками, але в основному нам для ручного підключення вистачить першого режиму і довгого формату.
А для повернення в автоматичний режим вводитимемо команду COPS=0.
Короткий і цифровий формат можна використовувати для збереження пам'яті контролера. Також рекомендую перевіряти виконання команди тестовим запитом. Тому що тут легко помилитися одним символом у найменуванні, щоби команда не пройшла.
AT+COPS - це дуже важлива команда для локацій, де можна зловити небажаний роумінг. Раджу передбачати це налаштування для користувачів у ваших GSM-пристроях.
Наш модуль можна купити за посиланнями у описі.
У коментарях напишіть, яку тему розібрати надалі. Там було прохання розібрати режим сну у SIM800. Так я вже готую відео на цю тему.
Всім удачі до нових зустрічей.
3 безкоштовні MQTT-сервери для тестування ESP32
3 безкоштовні MQTT-сервери для тестування ESP32 Під час розробки IoT-проєктів на ESP32 майже за..
ESP32: Генерація ШІМ на основі таймера (без LEDC)
ESP32: Генерація ШІМ на основі таймера (без LEDC) В ESP32 є кілька способів організувати широтно-..
Виготовлення друкованих плат за допомогою лазерного принтера
Ви можете суттєво полегшити собі процес виготовлення друкованих плат, малюючи доріжки за допомогою..
Кронштейн для кріплення крокового двигуна
Якісний сталевий кронштейн підходить для кріплення крокового двигуна Nema 17, а також для його модиф..
153.09грн.
Звук та музична інформатика
Попросту говоря, мы представляем звук, как вибрация, проходящая через среду (как правило, в воздухе)..





