Процедуры работы с 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-сообщения:

Дозвон:

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

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

Закладка Постоянная ссылка.

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

  1. zizo пишет:

    Hello,
    Thanks for this tutorial, so im trying to compile my project with some of your functions but i get lot of error, can you please send me the project or push them on github .
    Best regards

  2. zizo пишет:

    OK, it’s possible to send me just this function GSM_Answer_Clear(); called from SendSMS and call functions and how did you declare this varible please «ATD_Call» and «Text» and «CtrlZ» because i get an error with this
    Thanks you in advance for your answer sir 🙂

  3. zizo пишет:

    Im working on STM32F429I with an arduino shield wich embeded sim900 .

  4. zizo пишет:

    Hello sir,
    thank for your answer, i still have another issue about «GSM_Answer » variable how did you declare it, i this it a char pointer like * GSM_Answer, for information im using this shield the same as in the link bellow:
    https://randomnerdtutorials.com/sim900-gsm-gprs-shield-arduino/
    I have some questions about the sim900 uart communication:
    1- It’s possible to connect USART GPIO Pin(Tx,RX) directly to SIM900 (Tx RX).
    2- The power supply required to pewer SIM900.

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

  • Несколько случайная, но довольно любопытная информация:

    В 1982 году во ВНИИ противопожарной обороны проводились опыты с экспериментальным полимерным составом, применяемым в качестве универсального огнезащитного покрытия. Будучи нанесен на дерево, металл или бетон слоем толщиной 3 мм, под воздействием высокой температуры полимер резко увеличивается в объеме, превращаясь в 15-и сантиметровую огнезащитную «шубу», способную самостоятельно эффективно сдерживать огонь в течении часа, до начала работы пожарных частей.