Arduino SIM800L выбор оператора AT+COPS

В этом видео мы научимся выбирать 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-оператору.

 
#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. Так я уже готовлю видео на эту тему.

Всем удачи и до новых встреч.

https://youtu.be/Utqz3DWQOTg

 

 

Додати коментар


Захисний код
Оновити

EcoMonitoring

ЛІЧІЛЬНИК ВІДВІДУВАННЬ

Сьогодні 351
Вчора386
Цього тижня 737
Минулого тижня 2264
Цей місяць 8298
Минулий місяць 9310
За весь час 172332
Ваш IP: 3.137.203.53
Сегодня: 2025-04-28
Пользователей на сайте: 0
Гостей на сайте: 24