Gsm сигнализация sim900 своими руками

Добавил пользователь Евгений Кузнецов
Обновлено: 19.09.2024

Не так давно друг предложил мне работу, связанную с созданием прошивки для микроконтроллера, который должен был связываться с сервером при помощи GSM-модуля SIM900D. Ранее я с программированием микроконтроллеров дела не имел, да и на C программировал последний раз в студенческие времена, но любопытство перевесило и я принялся за работу. Документация по данной железке присутствует в интернете, однако хороших примеров работы с TCP/IP в коде найти не удалось. Ничего не оставалось, кроме как обложиться документацией, запастись сигаретами и чаем и приступить к лавированию между граблями. А граблей оказалось немало. Собственно, поэтому я и написал эту статью — чтобы другим было легче.

Далее будет много AT-команд, не слишком много кода и очень много букв.

Что было нужно

Требовалось написать код, который мог бы инициализировать GSM-модуль, устанавливать подключение с сервером, получать и отправлять произвольные данные, проверять состояние подключения и работать без сбоев. А также быть достаточно компактным, чтобы уместиться в ограниченной памяти микроконтроллера и оставить место для основной функциональности и еще чуть-чуть про запас.

Что получилось в итоге

Получился код на C, который может все, что было нужно. Из-за требований компактности, разбирать ответы и генерировать строки пришлось при помощи своего кода, который даже стыдно показать честному народу. Поэтому рекомендую всем использовать для этих целей регулярные выражения. Свой код я тоже собираюсь перевести на легковесный движок регулярных выражений, но уже после создания полнофункциональной прошивки.

Код требует функций/макросов для работы с последовательным портом, а также наличия функций memset и memcpy. Так что его с относительной легкостью можно перенести на другую платформу, не зацепив по пути кучу библиотек.

И как оно выглядит?

Программирование и тестирование проводилось под Windows 7. Код, полученный в результате, стал основным материалом для этой статьи. Я не стану приводить код полностью и комментировать его, а вместо этого покажу алгоритм настройки и работы с GSM-модулем.

Как работать с последовательным портом

Это достаточно просто. Под целевой микроконтроллер есть макросы для отправки/получения данных через USART, но так как отлаживать такой код проще со стационарного компьютера, мне была предоставлена связка из переходника USBUSART и GSM-модуля. Оставалось только научиться работать с последовательным портом под Windows. Это оказалось просто. Вкратце, последовательный порт представляется в ОС обычным файлом, передача информации осуществляется функциями ReadFile и WriteFile. Нужно только установить кое-какие параметры при помощи функций SetCommTimeouts и SetCommState.

Вот как выглядит функция инициализации порта:

Как происходит общение с GSM-модулем

После того, как последовательный порт настроен, в него можно отправлять AT-команды. Первой командой должна быть последовательность "AT\r" , позволяющая модулю автоматически настроить скорость передачи по последовательному порту. Ответ, который можно получить после этого из порта, будет выглядеть как "AT\r\r\nOK\r\n" .


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

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

Установка и разрыв подключений

  • "index,ALREADY CONNECT" это значит, что подключение с заданным индексом уже установлено и стоит его поискать.
  • "index,CONNECT OK" тут все очевидно.
  • "index,CONNECT FAIL" означает, что возникли проблемы с установкой соединения.

Передача данных

Данные передаются командой "AT+CIPSEND=index,length" , где index указывает подключение, по которому нужно передать данные, а length задает длину пакета данных. Кстати, узнать MTU для каждого подключения можно при помощи команды "AT+CIPSEND=?" .

Если все хорошо, то модуль в ответ на команду выдаст приглашение ">" , после которого нужно переслать в последовательный порт данные. Как только модуль получит количество байт, равное length , он скажет что-то типа "index,SEND OK" . Вообще, можно не использовать параметр length , однако в таком случае окончание пакета данных должно быть указано явно при помощи символа 0x1A , в терминале сочетание Ctrl+Z. Для передачи произвольных данных такой вариант, очевидно, не подходит.

Как видите, передача данных — процесс не слишком сложный. Поэтому переходим к самому интересному — приему данных.

Прием данных

Так вот, принимать данные можно командой "AT+CIPRXGET=2,index,length" . Двойка означает режим приема, в данном случае байты просто высыпаются в последовательный порт. Можно также задать получение данных в виде HEX-текста, видимо, ради предотвращения конфликтов с программным управлением потоком. Мне это не потребовалось, ибо управление потоком я вообще не использую. Параметр length задает размер пакета данных, который мы желаем получить за один раз.

В ответ мы получим нечто вида "+CIPRXGET:2,index,received,excess\r\n__DATA__\r\nOK\r\n" . В поле received будет находиться количество байт, находящихся в пакете данных __DATA__ , а поле excess будет содержать количество байт, ожидающих своей очереди в буфере модуля. Так что если поле received равно нулю, можно с чистой совестью заявлять, что получать нечего. Собственно, пользуясь этим, я и реализовал неблокирующую функцию для приема данных.

В заключение

Настоятельно рекомендую перед написанием кода освоиться в AT-командах при помощи PuTTY, который прекрасно работает с последовательным портом.

Надеюсь, информация из этой статьи поможет кому-нибудь написать код для своего SIM900. Вполне возможно, что принципы работы с GSM-модулем, изложенные выше, можно применить и к модулям других моделей, а, возможно, и производителей.



Часовой пояс: UTC + 3 часа

S900d- GSM сигнализация

JLCPCB, всего $2 за прототип печатной платы! Цвет - любой!

если будете дорабатывать, хотел внести несколько пожеланий
1. несколько триггерных выходов,
2. выход с задержкой для открытия замка домофона.
3. несколько входов для контроля

_________________
Славяне всех стран объединяйтесь!

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Чуть позже . Будет вариант для гаража.
Два независимых шлейфа. Снятие- взятие под охрану . звонком с тел. и пр. пока только пишу программу.
Модуль SIM900 управляется точно также только схема другая.
И аккумулятор не заряжает.

Опубликованы материалы вебинара, посвященного решениям задач освещения с LED-драйверами MEAN WELL. LED-драйверы MEAN WELL насчитывают несколько десятков семейств, которые широко используются, и легко интегрируются в различные светодиодные светильники. На вебинаре были представлены новинки 2022 года. Рассказали о драйверах MEAN WELL, существующих режимах стабилизации, способах повышения устойчивости светильника к имеющимся помехам, а также предложили оптимальные семейства для различных отраслей применения.

_________________
Я не волшебник, я только лечусь

Для надежной работы в жестких условиях компания Mornsun предлагает лучшие в своем классе AC/DC-преобразователи концепции 305RAC, которые не только соответствуют стандартам класса B по уровню электромагнитного излучения, но и немного их превосходят.

Антенна та , что на плате на две еденицы меньше показывает уровень, чем внешняя.
Не знаю в чём модуль меряет. Но если в дБ. то это наверное в разы меньше.
Сейчас быстро не соображу по поводу дБ и разов.
Да оно и понятно. Её -бы не на текстолите делать.
Но когда нет ни какой -то и эта не плохо.


TL; DR программно и аппаратно задуманное реализовано, тест в реальных условиях запущен, исходники и бинарники опубликованы, корпус не осилил.

Устройство и характеристики

Устройство отправляет SMS при возникновении следующих событий:

  • открытие двери (герконовый датчик);
  • резкое изменение освещения (фоторезистор);
  • движение (PIR датчик);
  • выход температуры из заданного диапазона;
  • низкое напряжение батареи.

Пример SMS с событием




Также, раз в сутки можно настроить время ежедневного отчета

Питается устройство от 3-х батареек AA. Расчетное время работы ≥6мес.

Настройка устройства, считывание логов событий и построение месячного графика температуры происходит с помощью утилиты (Python 2.7 + Tk + pyserial + matplotli).




Основное окно утилиты настройки




Окно лога событий




Окно лога температуры

Сборка устройства

Себестоимость деталей устройства на момент публикации этой статьи составляет примерно 1000-1200 рублей (без учета заказа платы).

Для удобства сборки и надежности в эксплуатации лучше заказать плату. Китайские друзья с известного сайта предлагают сделать 10 штук с доставкой за ~$7, а иногда и меньше. Но всегда можно собрать и на макетке, как я и поступил с первым прототипом:




Arduino и совместимые модули были заказаны с aliexpress. Понадобятся:

  • Arduino Pro Mini 3.3v 8MHz (5v 16MHz is also acceptable, but requires different firmware);
  • MH-SR602 MINI Motion Sensor;
  • SIM800C(L) GSM Module;
  • CP2102 MICRO USB to UART TTL Module;
  • DS3231 RTC Module For Raspberry Pi;
  • 3 AA battery holder With ON OFF Switch;
  • различная рассыпуха (резисторы, конденсаторы, зуммер и поч.).

В списке специально указаны названия, дающие нужный результат при вводе в поиск.




Схема устройства

Для снижения энергопотребления с платы Arduino нужно обязательно удалить резистор светодиода питания и регулятор напряжения. Проект платы сделан в Ki-CAD.

Использование

Локализация

Поддержаны два языка для программы конфигурирования и текста SMS: английский, русский. При желании не сложно добавить поддержку других языков: все локализуемые строки вынесены в отдельный файл (принимаю issue с реквестом, если приложите переводы всех строк).

Полевые испытания

Прошу прощения за эстетику монтажа.




Установка на входную дверь. Часть конструкции справа (непосредственно на самой двери) — магнит для срабатывания геркона

Проблемы

За время эксплуатации температура в помещении понизилась с +10°С до -15°С и обнаружилась две проблемы.

В остальном полет нормальный.

Что дальше

В планах (когда-нибудь):

  • спроектировать и напечатать корпус;
  • подключить ESP-01 для конфигурации и просмотра логов через браузер с телефона.

Отладка

Ссылки

Репозиторий проекта: github
Доступны схема и плата в Ki-CAD, прошивка и исходники для Arduino, exe и исходники утилиты конфигурации.


Из чего будем собирать



Подумал я и заказал его из Китая. Однако всё оказалось не так радужно. Датчик просто отказался регистрировать SIM-карту в сети. Было опробовано всё, что только возможно — результат нулевой.
Нашлись добрые люди, которые предоставили мне более крутую штуку — Sim900 Shield. Вот это уже серьёзный штучка. В Shield-е и разъём для микрофона и для наушников, полноценный телефон.


4 стандарта рабочей частоты 850/ 900/ 1800/ 1900 MHz
GPRS multi-slot класс 10/8
GPRS mobile station class B
Соответствует GSM phase 2/2+
Class 4 (2 W @850/ 900 MHz)
Class 1 (1 W @ 1800/1900MHz)
Управление с помощью AT команд (GSM 07.07 ,07.05 и SIMCOM расширенные AT команды)
Низкое энергопотребление: 1.5mA(sleep mode)
Диапазон рабочих температур: от -40°C до +85 °C

Ок, но надо же снимать показания с каких-то датчиков, чтобы оповещать владельца. Вдруг автомобиль эвакуируют, тогда положение автомобиля явно будет меняться в пространстве. Возьмём акселерометр и гироскоп. Отлично. Такс, теперь ищем датчик.


Модуль 3-х осевого гироскопа + 3-х осевого акселерометра GY-521 на чипе MPU-6050. Позволяет определить положение и перемещение объекта в пространстве, угловую скорость при вращении. Так же имеет встроенный датчик температуры. Используется в различных коптерах и авиамоделях, так же на основе этих датчиков можно собрать систему захвата движений.

Микросхема — MPU-6050
Напряжение питания — от 3,5V до 6V (DC);
Диапазон гироскопа — ± 250 500 1000 2000 ° / с
Диапазон акселерометра — ± 2 ± 4 ± 8 ± 16g
Интерфейс связи — I2C
Размер — 15х20 мм.
Вес — 5 г


Напряжение питания — 3.3 — 5В
Выходной сигнал — цифровой High/Low (нормально закрытый)
Используемый датчик — SW-420
Используемый компаратор — LM393
Размеры — 32x14 мм
Дополнительно — Есть регулировочный резистор.

Прикрутим модуль SD карты памяти. Будем ещё писать лог-файл.


Модуль позволяет хранить, читать и записывать на SD карту данные требуемые для работы прибора на основе микроконтроллера. Применение устройства актуально при хранении файлов от десятков мегабайт до двух гигабайт. На плате размещен контейнер SD карты, стабилизатор питания карты, вилка соединителя линий интерфейса и питания. Если требуется работать с звуковыми, видео или другими объемными данными, например, вести журнал регистрации событий, данных датчиков или хранить информацию веб-сервера, то модуль SD карты памяти для Arduino даст возможность применить SD карту для этих целей. С помощью модуля можно изучить особенности работы SD карты.
Напряжение питания — 5 или 3,3 В
Объем памяти SD карты — до 2 Гбайт
Размеры — 46 х 30 мм

И добавим сервопривод, при срабатывании датчиков будет поворачиваться сервопривод с видеорегистратором и снимать видео происшествия. Возьмём сервопривод MG996R.


— Стабильная и надежная защита от повреждений
— Металлический привод
— Двухрядный шарикоподшипник
— Длина провода 300 мм
— Размеры 40х19х43мм
— Масса 55 гр
— Угол поворота: 120 град.
— Рабочая скорость: 0.17сек/60 градусов (4.8В без нагрузки)
— Рабочая скорость: 0.13сек/60 градусов (6В без нагрузки)
— Пусковой момент: 9.4кг/см при питании 4.8В
— Пусковой момент: 11кг/см при питании 6В
— Рабочее напряжение: 4.8 — 7.2В
— Все детали привода выполнены из металла

Собираем


О, совсем забыл упомянуть о питании, от чего же будет питаться наша система. Питание будет от 12v автомобиля.


Тонкие моменты проекта


Фишки на Sim900 Shield должны быть установлены такие образом. Полезность SIM900 Shield.

Положение тумблера питания Sim900 Shield.







На этом всё, весь скетч лежит на GitHub. На мой взгляд, мне удалось создать gsm-сигнализацию, способную оповестить владельца автомобиля в случае происшествия. Проект получился экономным в плане финансовых вложений, что несомненно радует. В будущем планирую усовершенствовать gsm-сигнализацию, добавить новый функционал.



Схема


Прошивку берем здесь
15.04.2017 — добавлена возможность постановки/снятия охраны с помощью брелка.
Например вот таких:


Запихал все это в корпус D6MG (корпус для установки на DIN рейку):

Моя дача отапливается с помощью таких электроконвекторов (не реклама) т.к. газа нет. Да и управлять газовым котлом с помощью электроники — ОПАСНО! Поэтому управление отоплением делалось именно под кварцевые обогреватели.

В память устройства можно прописать до 5-ти номеров телефонов и 12 датчиков. Датчики могут быть как проводные, так и беспроводные. Но всего 12.

Перед постановкой на охрану все датчики проверяются. Если где-то не закрыто (и т.п.), то охрана не включится и придет соответствующее СМС.

Датчик дыма опрашивается всегда (если разрешен его опрос). Отключается командой — dymmonitoroff

Контролируется наличие 5 вольт от источника питания (т.е. косвенно 220 вольт). При пропадании/появлении придет СМС. Отключается командой — voltmonitoroff

Номер первого позвонившего будет сохранен как основной. Только с этого номера можно выполнить команды настройки устройства (команды 1-12, 12.1).

Консольных команд нет. Кому они нужны в реальных условиях…

СМС-Команды (регистр значения не имеет):

3. listphones — прислать в СМС список телефонов, записанных в памяти

4. delphone — удалить номер телефона
например: delphone:1
удалит 1-й номер в списке

7. settime — установить время
например: settime: ГГ/ММ/ДД ЧЧ: ММ

9. listsensors — прислать в СМС список датчиков, прописанных в памяти устройства.

10. delsensor — удаляет датчик
например: delsensor:11 — удалит 11-й датчик в списке

11. resetsensors — сброс всего списка датчиков

15.04.2017 добавилась команда для прописывания брелков (всего можно прописать до 5-ти штук):
12.1 learnkey — включить режим записи кодов брелков (выключается сам через 30 секунд)

15. smson — включить оповещение по СМС

21. guardon — включить охрану

22. guardoff — выключить охрану

23. money — запросить баланс

24. info — запросить состояние системы

25. clearsms — удалить все СМС

28. otoplenieon — включить отопление

29. otoplenieoff — выключить отопление

30. targettemp — установить желаемую температуру в помещении
например: targettemp=30 — желаемая температура 30 градусов

31. help — прислать в ответном СМС список поддерживаемых команд.

Фух! По-моему все.
Так-же можно поставить/снять с охраны по звонку.

Читайте также: