Алгоритм настройки модуля SIM800L

Чисто эстетство, чтобы в скобочках и уровнях вложения меньше путаться:

case nn: {
  // перевернули условие, чтобы выходить сразу, если время не пришло.
  if (millis() - modem_setup_tmr < TIMEOUT_TIME) { break; }
....
  break;
}
if (millis() - modem_setup_tmr < TIMEOUT_TIME) {break; }

Получается сразу выходим из case ?

По задумке - да.

В даташите sim800l на многие команды время отклика указано как не определено, в реальности 3…5 секунд достаточно, но есть и те у которых конкретное время ответа, поэтому универсальная конструкция сверка с одним и тем же временем отклика не взлетает (

Не очищать буфер приёма при заполнении, просто сдвигать позицию записи на ноль. Написать свою функцию поиска подстроки в буфере вместо стандартных С. Есть же примеры.

очень много повторяющегося кода.
Напишите функцию, которая получает на входе строчку с командой и ожидает от модем ответа ОК - у вас код уменьшится раз пять

Спойлер

Я прошу прощения, но до меня только сейчас дошло, что ответ OK приходит только на запрашиваемые команды :grinning: :grinning: :grinning:
А я то сначала проверяла та ли команда, а потом ОК или нет.
А мне всё твердят, отправила команду, дождалась ответа, и только потом отправила следующую команду…
Ну бывает, ну случается…

таймер еще на каждую команду, а то можно и не дождаться ответа.

А вы DTMF используете?
код нажатой кнопки и время удержания нажатия, в мс
Какое время удержания нажатия максимальное получается?

И вопрос по хранению команд

void setup() {}
void loop() {}

Скетч использует 444 байт (1%) памяти устройства. Всего доступно 32256 байт.
Глобальные переменные используют 9 байт (0%) динамической памяти, оставляя 2039 байт для локальных переменных. Максимум: 2048 байт.

Добавляю массив

char *conf_commands[]  = {
  "ATE1",//0---Включить эхо.
  "ATV1",//1---Полные заголовки и текстовые овтеты.
  "AT+CLIP=1",//2--- // Включить АОН.
  "AT+CMGF=1",//3---Включить TextMode для SMS.
  "AT+CPBS=\"SM\"",//4---Память SIM-карты.
  "AT+DDET=1,0,1",//4---Память SIM-карты.
};

void setup() {}
void loop() {}

Скетч использует 444 байт (1%) памяти устройства. Всего доступно 32256 байт.
Глобальные переменные используют 9 байт (0%) динамической памяти, оставляя 2039 байт для локальных переменных. Максимум: 2048 байт.

Почему показывает одинаковые значения?

видимо ввиду того что не используете компилятор его выкинул

1 лайк

Нет, скетч есть старом форуме, тут недавно в Ищу исполнителя ссылка была, в dtmf модем сам распознает и просто вываливает команду.

Дело вкуса, начинал с массивов команд, пытался как то унифицировать, потом пришло понимание, что команд много, реакция на них разная, время ожидание тоже, логика универсальная получается слишком сложной.
Перешёл просто выбором режимов switch/enum и команды в коде прописываю.

AT+DDET=1,500,1

При быстром нажатии на кнопки получаю

+DTMF: 9,700
+DTMF: 9,760
+DTMF: 9,640
+DTMF: 9,440
+DTMF: 9,620

Всегда разные значения даже если держу кнопку долго.

Не нашла.

Снимаю вопрос.
С другого телефона всё ок,.

1 лайк

наверное надо почитать что означают эти цифры - нет?

https://arduino.ru/forum/apparatnye-voprosy/vse-o-sim800l-i-vse-chto-s-nim-svyazano?page=2#comment-494752

          if (s800lib::findResp((char *)"+DTMF: ", br)) { // кнопка нажата
            _dtmf_press = 1;
          }
          if (_dtmf_press) {
            if ((isdigit(br)) || (br == '#') || (br == '*')) {
              _dtmf_press = 0; _dtmf_key = br;
              currentReport = keyPressDTMF; return true;
            }
          }


Я про длину импульса, с одного телефона держу кнопку - и 1000 и 2000 …
а с моего максимум 900мс.

как интересно вы в GSM сети меряли импульс который DTMF приходящий на SIM800L :slight_smile:

и главное зачем?


Хотела сделать активацию функции долгим нажатием на кнопку.