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

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

Сьогодні 222
Вчора165
Цього тижня 387
Минулого тижня 203
Цей місяць 590
Минулий місяць 5128
За весь час 200624
Ваш IP: 216.73.216.0
Сегодня: 2025-11-03
Пользователей на сайте: 0
Гостей на сайте: 212