Процедуры работы с 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.

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

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

    Нынешний алюминий — достаточно дешевый металл, широко применяемый в промышленности и ежегодно выплавляемый в количестве многих миллионов тонн. Но мы знаем, что до изобретения Ч. Холлом и П. Эру электролиза окиси алюминия этот металл был страшно дорог (в частности, Д. И. Менделееву в знак признания его заслуг преподнесли драгоценный дар — кубок из чистого алюминия), так как даже все знания химиков первой половины XIX века не помогли найти способ добычи алюминия в сколь-либо значимых количествах. На этом фоне особенно интересными смотрятся два события, имевших место быть в древнем мире. Во-первых, римский историк Плутарх свидетельствует, что императору Тиберию неназванным ремесленником была изготовлена корона из металла, подобному серебру — белого цвета и серебристого — но значительно легче. Во-вторых, в гробнице китайского полководца IV века Чжао Чжу были обнаружены фрагменты орнамента, которые, как оказалось по результатам спектрального анализа, содержат 10 % меди, 5 % магния и… та-дам! 85 % алюминия. Неужели наши предки знали секрет безэлектролизной добычи алюминия? Например, такие как способ Х. К. Эрстеда от 1825 года «разлагаемость хлористого алумия посредством потассия» или рецепт 1863 года русского химика Н. А. Бекетова «Глиний восстанавливается магнием из своего фтористого соединения».