В этом видео мы научимся выбирать 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-оператору.
#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 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. Так я уже готовлю видео на эту тему.
Всем удачи и до новых встреч.