Подключение GSM модуля SIM800C к STM32

Введение

Для телеметрии в труднодоступных местах Wi-Fi зачастую оказывается непригодным из-за ограниченного радиуса действия. В этой статье детально разберем интеграцию бюджетного GSM-модуля SIM800C с платой STM32F103C8T6, реализовав надежный канал передачи данных через сотовую сеть.

Необходимые детали

Компонент Количество Купить
1 Отладочная плата STM32F411 1 шт Авито | AliExpress | RobotChip
2 Блок питания AC-DC, 5В, 3А 1 шт Авито | AliExpress | RobotChip
3 Модуль SIM800C 1 шт Авито | AliExpress | RobotChip
4 Провод DuPont 16 шт Авито | AliExpress | RobotChip
4 Макетная плата 800 контактов 1 шт Авито | AliExpress | RobotChip
6 Модуль DHT11 1 шт Авито | AliExpress | RobotChip
7 Конвертер CH340G 1 шт Авито | AliExpress | RobotChip

Описание

В этой статье мы будем работать в среде Arduino IDE. Поддержку плат STM32 легко добавить через встроенный Boards Manager (подробную инструкцию я давал в прошлой публикации).

Зачем это нужно? Представьте задачу: организовать автономный мониторинг температуры и влажности на фермерском поле, лесной делянке или пасеке, где полностью отсутствует Wi-Fi. В таких условиях самым надёжным каналом передачи данных остаётся сотовая связь. Именно поэтому сердцем нашей системы станет микроконтроллер STM32, который будет собирать показания датчиков и отправлять их через GSM/GPRS-модуль. Благодаря повсеместному покрытию сетей устройство сможет стабильно выходить на связь даже в удалённой местности.

Подключение

Подключение компонентов не представляет сложности, так как модуль SIM800C обменивается данными по интерфейсу UART: контакт TX модуля подключаем к выводу PB6 микроконтроллера STM32F411CE, а контакт RX — к выводу PB7, затем контакт VDD логики соединяем с выводом 3.3 В (так как все выходы STM32F411 составляют 3.3 В), для включения модуля на пин PWX необходимо установить перемычку на GND, питание самого модуля осуществляется от источника питания 5В, для этого контакт соединяем с выходом VCC модуля, а GND — со входом GND, далее подключаем датчик DHT11 к контроллеру: выводы VCC и GND датчика соединяем с линиями 3.3 В и GND микроконтроллера, сигнальный вывод DATA — с портом PB5.

В данной статье я использую плату Black Pill на базе микроконтроллера STM32F411CEU6. После установки поддержки платы в Arduino IDE необходимо настроить параметры проекта во вкладке «Инструменты» следующим образом.

Также перед прошивкой необходимо нажать кнопку BOOT и, не отпуская её, нажать кнопку RST. Затем отпустите сначала RST, а после — BOOT. Микроконтроллер перейдёт в режим программирования.

Установка библиотек

Для работы, будем использовать библиотеку «DHT-sensor-library от Adafruit» скачать можно используя интегрированную среду разработки Arduino IDE», для этого откройте «Скетч → Подключение библиотеки → Менеджер библиотек…», так же выложу библиотеки в конце статьи.

Для работы библиотеки необходимо установить зависимые библиотеки, нажимаем «Установить все»

Программа

Ниже приведён исходный код для работы с модулем SIM800C. Перед загрузкой скетча задайте свой номер телефона в международном формате — на него будут приходить ответные сообщения

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

В телефоне при отправке SMS будет приходить сообщение об температуры и влажности.

Описание программы.

Сначала подключаются необходимые библиотеки для работы с датчиком DHT11 и программным UART, затем указываются порты и создаётся объект для работы с библиотеками.

В функции Setup инициализируем последовательные порты: на скорости 115200 бод — для отладки, и 9600 бод — для работы с модулем SIM800. Затем активируем датчик DHT11

Далее проверяем доступность модуля SIM800C. Для этого в течение 10 секунд отправляем команду AT. Если связь установлена — выводим соответствующее сообщение об успехе, если нет — сообщение об ошибке.

Следующими командами конфигурируем модуль: сначала отправляем команду для перевода в текстовый режим отправки SMS ( AT+CMGF=1), а затем настраиваем уведомления так, чтобы при получении нового сообщения модем сразу пересылал его текст в программный порт контроллера ( AT+CNMI=1,2,0,0,0)

В функции loop() мы постоянно проверяем, поступили ли данные: if (mySerial.available()). Затем функция waitForResponse(2000) считывает всё, что накопилось в буфере за 2 секунды, и собирает это в одну строку msg. Строка очищается от лишних пробелов ( trim()) и переводится в верхний регистр ( toUpperCase()). Это гарантирует, что команда пользователя сработает независимо от регистра букв («data», «Data» или «DATA»).

Затем проверяем, поступила ли команда DATA. Если да — считываем показания с датчика и отправляем их на указанный номер ( String phone = "+7хххххххххх";). Здесь необходимо подставить реальный номер для получения сообщений.

Следующая функция отправляет команду в модем и дублирует её в монитор порта с пометкой >> для удобства отладки.

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

Последней функцией отправляем сообщение.

Полезные ссылки

Описание Скачать
1 Библиотека Adafruit Unified Adafruit Unified Sensor v.1.1.15.zip
2 Библиотека для DHT11 DHT sensor library v.1.4.7.zip

О нас Сергей

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *