Процедуры работы с GSM-модулем на примере STM32 (STM32F102) и SIM900

Ежегодно тысячи DIY-энтузиастов разрабатывают свои конструкции GSM-сигнализаций, систем контроля доступа и удаленного управления на базе микроконтроллеров и GSM-модулей. Эта статья посвящена среднему слою программного обеспечения для обмена информацией между GSM-модулем и микроконтроллером и призвана облегчить переход от первого включения GSM-модема (когда на запрос «AT» был получен долгожданный ответ «OK») к полноценной рабочей программе или, другими словами, позволяет сохранить творческий запал за счет быстрого решения чисто технических задач.

Программное обеспечение, представленное ниже, отлаживалось в компиляторе IAR на контроллере STM32F102 и GSM-модуле SIM900, но, конечно, учитывая минимальную привязку к «железу», может быть легко перенесено на практически любой микроконтроллер.

Реализован следующий функционал:

  • void GSM_On(void) — включение GSM-модуля;
  • void GSM_Off(void) — выключение GSM-модуля;
  • void SelectSIM1(void) и void SelectSIM2(void) — выбор SIM-карты;
  • void GSM_Init(void) — инициализация GSM-модуля;
  • bool WaitModuleAndSIMReady(uint16_t DelayInSec) — ожидание готовности GSM-модуля и SIM-карты. При невозможности инициализации GSM-модуля процедура заканчивается по задаваемому тайм-ауту;
  • bool ReadIMEI(void) — читает IMEI GSM-модуля;
  • bool ReadProviderName(void) — читает имя провайдера;
  • bool ReadSIMBalance(char *Request) — читает баланс SIM-карты;
  • bool SendSMS(char *Number, char *Text) — отправляет SMS-сообщение;
  • bool Call(char *Number) — осуществляет голосовой вызов;
  • bool IncomingCallDetect(void) — проверяет наличие входящего вызова;

плюс две служебные процедуры, необходимые для реализации основного функционала:

  • int StrToInt(const char *str) — превращает строку в целое число;
  • char* itoa(int i, char b[]) — превращает целое число в строку.

Ниже показана схема включения GSM-модуля SIM900R, на которой отлаживалось рассматриваемое ПО.

 

Для пущей душеполезности в схему включен не только стандартный узел сброса на VT2, но и ключ для полного и безысходного отключения питания модуля на VT1 (бывает полезен в случае батарейного питания и необходимости ронять потребление GSM подсистемы до 0 мкА либо в случае глюков модуля, когда его не удается перезапустить дерганьем вывода PWRKEY), и переключатель SIM-карт на DA1.

Итак, собственно софт.

Включение GSM-модуля:

Выключение GSM-модуля:

Выбор SIM-карты:

Инициализация GSM-модуля:

Ожидание готовности GSM-модуля и SIM-карты:

Чтение IMEI GSM-модуля:

Чтение имени провайдера:

Чтение баланса SIM-карты. Процедуре нужно передать строку запроса баланса, зависящую от конкретного провайдера, что-нибудь вроде «*100#».

Отправка SMS-сообщения:

Дозвон:

Проверка наличия входящего вызова:

И служебные процедуры:

Добавить комментарий