Подключение популярных gsm модулей к ардуино
Содержание:
- Сложно ли работать с Arduino?
- Задачи GSM модуля:
- SIM-карта Telefonica/Movilforum
- Что такое GSM
- Arduino Code – Sending SMS
- Отправка SMS через SIM800
- Код Arduino – чтение SMS
- Протокол TCP/IP в М2М
- Основные функции мобильного телефона на основе платы Arduino
- Код Arduino – тестирование AT команд
- SIM-карты
- Обработка исключительных случаев
- Передача данных по GPRS с помощью SIM900
- Некорректный GET-запрос на сервер
- Работа схемы
- Устройство и характеристики
Сложно ли работать с Arduino?
Модули Arduino отличаются высокой популярностью среди многих пользователей. Это стало возможным благодаря своей простоте и доступности.
Программы для управления модулями пишутся с использованием обычного C++ и дополнений в виде простых функций управления процессами ввода/вывода на контактах модуля. Кроме этого, для программирования может применяться и бесплатная программная среда Arduino IDE, функционирующая под Windows, Linux или Mac OS.
С модулями Arduino существенно упрощена процедура сборки устройств. GSM сигнализация на Ардуино может создаваться без потребности в паяльнике – сборка происходит с использованием макетной доски, перемычек и проводов.
Как создать сигнализацию с помощью Arduino?
К основным требованиям, которым должна отвечать созданная gsm сигнализация на Ардуино своими руками относятся:
- оповещать владельца объекта о взломе или проникновении;
- поддержке внешних систем типа звуковая сирена, сигнальные фонари;
- управление сигнализацией через СМС или звонок;
- автономная работа без внешнего питания.
Для создания сигнализации потребуется:
- модуль Arduino;
- набор функциональных датчиков;
- GSM модуль или модем;
- источник автономного питания;
- внешние исполнительные устройства.
Модули для создания GSM сигнализации на Ардуино
Отличительной особенностью модулей Ардуино является использование специальных плат расширения. С их помощью осуществляется подключение всех дополнительных устройств к Arduino, которые требуются для сборки конфигурации охранной системы. Такие платы устанавливаются поверх модуля Ардуино в виде «бутерброда», а уже к самим платам подключаются соответствующие вспомогательные устройства.
Как это работает?
При срабатывании одного из подключенных датчиков происходит передача сигнала к процессору модуля Arduino. Используя загруженный пользовательский софт, микропроцессор производит его обработку по определенному алгоритму. В результате этого может формироваться команда на срабатывание внешнего исполнительного устройства, которая передается к нему через соответствующую плату расширения-сопряжения.
Чтобы обеспечить возможность оправки предупредительных сигналов владельцу дома или квартиры, которые охраняются, к модулю Arduino, через плату расширения, подключается специальный модуль GSM. В него устанавливается SIM-карта одного из провайдеров сотовой связи.
Модули в сборе для GSM сигнализации на Ардуино
При отсутствии специального GSM-адаптера его роль может выполнять и обычный мобильный телефон. Кроме отправки СМС-сообщений с предупреждением о тревоге и дозвона, наличие сотовой связи позволит управлять GSM сигнализацией на Ардуино дистанционно, а также контролировать состояние объекта, отправляя специальные запросы.
Выводы
Использование модулей Arduino позволит пользователям самостоятельно проектировать GSM-сигнализации, которые могут работать с разно функциональными датчиками и управлять внешними устройствами. Благодаря возможности применения различных датчиков функции сигнализации можно существенно расширить и создать комплекс, который будет следить не только за безопасностью объекта, а и за его состоянием. Например, можно будет контролировать температуру на объекте, фиксировать утечку воды и газа, перекрывать их подачу в случае аварии и многое другое.
Задачи GSM модуля:
- Отправлять данные о времени работы насоса полива;
- Отправлять температуру насоса и воды;
- Принимать данные с веб-сервера о статусе вкл/выкл насоса.
Первым делом в корневом каталоге сервера создаем файл index.php.
На Листинге 2 показан начальный код разметки HTML страницы.
Листинг 2. Начальный код разметки HTML страницы.
В моем случае веб-страница будет открываться только в телефоне, поэтому выберем самый простой дизайн для нее. При желании можно сделать страницу более удобной и информативной.
Результат открытого в браузере файла index.php показан на Рисунке 7.
Рисунок 7. | Результат открытого в браузере файла index.php. |
Добавим пару кнопок на включение насоса и создадим txt файл на сервере для сохранения данных о статусе работы насоса. Кнопки выполним в виде картинок, а их обработку сделаем с помощью AJAX (технология взаимодействия с сервером без полной перезагрузки html-страницы, использует JavaScript). Для этого перед тегом вставляем код, показанный в Листинге 3.
Листинг 3. AJAX обработчик.
Определение картинок кнопок включим в форму. При нажатии на картинку будет записываться значение статуса в файл pomidor.txt. Код обработки кнопок показан в Листинге 4.
Листинг 4. HTML код обработки кнопок.
В коневом каталоге создаем папку transfer и файл pomidor.php, код из которого приведен в Листинге 5.
Листинг 5. PHP скрипт записи статуса кнопки.
Рисунок 8. | Основной интерфейс управления. |
Для полученных значений создаем еще одну папку txt и файл pomidor.txt. Добавляем картинку насоса и получаем минимальный интерфейс управления, который показан на Рисунке 8. На Рисунке 9 показан результат нажатия на кнопку «Выкл». Соответственно, если нажмем на кнопку «Вкл», то будет результат «ON».
Рисунок 9. | Запись данных на сервер в результате нажатия на кнопку «Выкл». |
Сделаем так, чтобы при переключении статуса, менялась картинка насоса. Для этого в поле расположения картинки насоса добавим код (Листинг 6).
Листинг 6. PHP скрипт изменения картинки статуса работы насоса.
Создаем функцию «Nasos», которая каждую секунду читает и сравнивает значение с файла pomidor.txt. В зависимости от результата меняется картинка визуализации насоса. На Рисунке 10 показан пример визуализации насоса при нажатии на кнопку «Вкл».
Рисунок 10. | Визуализация статуса включенного насоса. |
По аналогии добавим вывод температур и времени полива (Рисунок 11).
Рисунок 11. | Законченный интерфейс управления. |
Вопросы безопасности, в случае атаки на веб сервер, выходят за рамки данного повествования, поэтому опустим их.
SIM-карта Telefonica/Movilforum
В комплекте с GSM-модулем Arduino также идет «симка» от Telefonica/Movilforum, которая хорошо подходит для M2M-приложений, т.е. для приложений, где коммуникация будет осуществляться по принципу «машина-машина». Впрочем, использовать именно эту карту необязательно. Можно пользоваться любой «симкой», которая работает в вашем регионе.
Для приема и отправки голосовых звонков эту «симку» использовать нельзя.
Принимать и отправлять SMS-сообщения можно только от SIM-карт из сети Movilforum.
Кроме того, при использовании этой карты нельзя создавать сервер, который будет принимать входящие запросы из интернета общего пользования. Однако вы сможете получать входящие запросы от других SIM-карт из сети Movilforum.
Если вы хотите использовать голосовую и другие функции GSM-модуля, вам понадобится «симка» от другого оператора связи. У разных операторов разные подходы к использованию SIM-карт, и чтобы узнать, какие типы соединений они поддерживают, лучше обратитесь к ним напрямую.
Что такое GSM
GSM – это международный стандарт для мобильной связи. Аббревиатура расшифровывается как Global System for Mobile Communications, что можно перевести как «глобальная система для мобильных коммуникаций». Кроме того, стандарт GSM иногда называют 2G, т.к. это, по сути, сотовая связь второго поколения.
Чтобы Arduino могла получить GPRS-доступ к интернету, а также делать запросы к веб-страницам и обслуживать их, вам нужно узнать у своего мобильного оператора APN (от Access Point Name, т.е. «имя точки доступа»), а также имя пользователя и пароль. Более подробно об этом читайте ниже, в разделе «Подключение к интернету».
Помимо прочего, GSM-модуль поддерживает входящие и исходящие голосовые звонки, стандарт Simple Message System (т.е. SMS или текстовые сообщения) и коммуникацию через GPRS.
То есть GSM-модуль Arduino – это, по сути, GSM-модем. С точки зрения мобильного оператора это обычный мобильный телефон. С точки зрения Arduino это просто модем.
Arduino Code – Sending SMS
Let’s move on to the interesting stuff. Let’s program our Arduino to send an SMS to any phone number you wish. Before trying the sketch out, you need to enter the phone number. Search for the string ZZxxxxxxxxxx and replace ZZ with county code and xxxxxxxxxx with the 10 digit phone number.
The sketch is almost same as earlier except below code snippet. Once the connection is established, we send below AT commands:
AT+CMGF=1 – Selects SMS message format as text. Default format is Protocol Data Unit (PDU)
AT+CMGS=+ZZxxxxxxxxxx – Sends SMS to the phone number specified. The text message entered followed by a ‘Ctrl+z’ character is treated as SMS. ‘Ctrl+z’ is actually a 26th non-printing character described as ‘substitute’ in ASCII table. So, we need to send 26Dec (1AHex) once we send a message.
The loop is kept empty as we want to send SMS only once. If you wish to send SMS one more time, just hit the RESET key on your Arduino. Below screenshot shows SMS sent from SIM900 GSM/GPRS shield.
Отправка SMS через SIM800
Для теста работы пытаемся отправить SMS. Для начала отправляем команду: AT+CMGF=1. Если возник ERROR — скорее всего не прошла регистрация SIM-ки в сети.
AT команда | Ответ | Примечания |
AT+CMGF=1 | OK | Переводим в текстовый режим отправки сообщений. |
AT+CSCS=»GSM» | OK | Устаналиваем charset:«GSM» GSM 7 bit default alphabet (3GPP TS 23.038); «UCS2» 16-bit universal multiple-octet coded character set (ISO/IEC10646); UCS2 character strings are converted to hexadecimal numbers from 0000 to FFFF; e.g. «004100620063» equals three 16-bit characters with decimal values 65, 98 and 99 «IRA» International reference alphabet (ITU-T T.50) «HEX» Character strings consist only of hexadecimal bers from 00 to FF; «PCCP» PC character set Code «PCDN» PC Danish/Norwegian character set «8859-1» ISO 8859 Latin 1 character set |
AT+CSCS? | +CSCS: «GSM» | Проверяем, что нужная кодовая таблица установилась корректно. |
AT+CMGS=»+796019xxxxx» | > | Номер телефона вводить обязательно с +, иначе будет сообщение об ошибке: +CMS ERROR: invalid input value.После запуска команды появится запрос на ввод текста сообщения, которое должно быть завершено отправкой CTRL-z (0x1A или (char)26). К сожалению, Arduino Serial Monitor не позволяет отправить этот код, так что только программно. |
Код Arduino – чтение SMS
Теперь давайте запрограммируем нашу Arduino для чтения входящих сообщений. Этот скетч очень полезен, когда вам нужно инициировать действие при получении определенного SMS сообщения. Например, когда Arduino получает SMS, вы можете дать ей команду включить или выключить реле. Вы поняли идею!
Данный скетч аналогичен предыдущему, за исключением приведенного ниже фрагмента кода. Как только соединение установлено, мы отправляем следующие AT команды:
– выбирает формат SMS сообщения в виде текста. По умолчанию используется формат PDU (Protocol Data Unit).
– указывает, как должны обрабатываться новые входящие SMS сообщения. Таким образом, вы можете указать плате расширения SIM900 либо пересылать новые входящие SMS сообщения непосредственно на компьютер, либо сохранять их в хранилище сообщений, а затем уведомлять компьютер об их расположении в хранилище сообщений.
Отклик на получение сообщения начинается с +CMT: все поля в ответе разделены запятыми. Первое поле является номером телефона. Второе поле – имя человека, отправившего SMS. Третье поле – это временная метка, а четвертое поле – само сообщение.
Обратите внимание, что на этот раз мы НЕ оставили функцию пустой, так как запрашиваем новые входящие SMS сообщения. Как только вы отправите SMS на плату расширения SIM900 GSM/GPRS Shield, вы увидите следующий вывод на мониторе последовательного порта
Рисунок 20 – Чтение SMS через SIM900 GSM ShieldРисунок 21 – AT команды SIM900 GSM Shield для чтения SMS на Arduino
Протокол TCP/IP в М2М
Рис. 1. Обобщенная схема системы сбора данных посредством сети GSM
Обобщенная схема любой системы сбора данных построена на принципах клиент-серверного подключения (рис. 1). То есть где-то в сети есть сервер, который ждет подключения М2М-устройств и принимает от них полезные данные (расход топлива, координаты перемещения объекта, температура, тревожный сигнал, количество потребленной электроэнергии и т. п.) в зависимости от приложения и задач, выполняемых системой. В качестве клиентов в такой схеме выступают устройства на базе GSM/GPRS-модуля и управляющий контроллер (хост): модуль предоставляет доступ в Интернет, а хост управляет этим процессом. Такие клиент-серверные соединения для передачи данных, как правило, используют протокол TCP/IP.
Опытные разработчики знают, что посредством GSM/GPRS-модуля можно выйти в Интернет и подключиться к серверу двумя способами при помощи протокола канального уровня PPP или встроенного протокола TCP/IP. Оба варианта доступны в GSM/GPRS-модулях серии SIM800.
Когда в распоряжении клиентской части имеются продвинутые аппаратные ресурсы хоста и ОС типа Linux или Android, для выхода в Интернет часто применяют протокол PPP. Протоколы до уровня приложений при этом реализованы в самой ОС хоста. Но это относится к небольшому числу случаев. В подавляющем большинстве М2М-приложений ставятся жесткие требования к стоимости проекта, который подразумевает недорогой хост с небольшой памятью и простейшей ОС (без особых изысков). Реализация собственного стека протоколов (надстройка над PPP) в таком случае часто выводит проект за временные рамки сдачи работ и рамки бюджета единицы изделия.
Рис. 2. Граф процессов и состояний стека протоколов TCP/IP
В таких случаях более оправданным является применение встроенного стека TCP/IP-модуля, т. к. значительно упрощается процесс отладки и удешевляется стоимость конечного изделия. Разработчику не нужно знать/помнить принципы сетевых протоколов, тайминги, инкапсуляцию и т. д. (рис. 2), не нужно обрабатывать кадры, пакеты и сегменты данных. При работе со встроенным TCP/IP-стеком модуля хост имеет дело лишь с потоком полезных данных (рис. 3), обмениваясь ими с сервером на прикладном уровне стека протоколов.
Рис. 3. Стек протоколов TCP/IP
GSM/GPRS-модуль, управляемый хостом через последовательный порт UART, берет на себя общение с сетью сотовой связи и работу в IP-сети. Хосту для этого предоставляется командный интерфейс, т. е. доступ к сетевым функциям происходит посредством простой и понятной системы AT-команд . При этом все сложные сетевые процессы, такие как активация контекста, открытие сессии, передача данных, закрытие сессии и т. д., скрыты от хоста.
Кстати, надо сказать, что протокол TCP/IP, наряду с другими протоколами, к примеру UDP/IP, очень удобен для систем, требующих надежности передачи данных, т. к. в его основе заложены принципы подтверждения и повтора посылок в случае потери пакетов. Прикладному уровню не нужно заботиться об организации повторного запроса данных.
Основные функции мобильного телефона на основе платы Arduino
1. Осуществление вызова.
Для осуществления вызова на нашем устройстве мы должны нажать клавишу ‘C’ и затем набрать с помощью клавишной панели номер интересующего нас мобильного абонента. После набора номера необходимо снова нажать ‘C’. После этого плата Arduino начнет процесс соединения с набранным номером при помощи использования AT команд.
2. Прием вызова.
Когда кто то будет звонить на номер SIM-карты, которая вставлена в ваш GSM модуль, устройство будет высвечивать на экране ЖК дисплея сообщение ‘Incoming…’ и после него номер вызывающего абонента. Чтобы принять вызов необходимо нажать ‘A’. При нажатии этой кнопки Arduino передает соответствующую команду на GSM модуль:
3. Передача SMS.
Для передачи SMS с помощью нашего устройства мы должны нажать на клавишной панели клавишу ‘B’. После этого система запросит номер (сообщение ‘to whom’), на который необходимо передать SMS. После набора номера необходимо нажать ‘D’ и после этого ЖК экран запросит текст SMS. После этого необходимо с помощью клавишной панели ввести текст SMS так, как вы это делаете на обычном мобильном телефоне и снова нажать ‘D’ для передачи SMS. Для передачи SMS плата Arduino передает на GSM модуль следующую команду.
И передать 26 на GSM модуль для передачи SMS.
Код Arduino – тестирование AT команд
Для отправки AT команд и взаимодействия с платой расширения SIM900 мы будем использовать монитор последовательного порта. Приведенный ниже скетч позволит Arduino связываться с платой расширения SIM900 в мониторе последовательного порта. Прежде чем приступить к подробному разбору кода, подключите Arduino к компьютеру, скомпилируйте приведенный ниже код и загрузите его в Arduino.
Открыв монитор последовательного порта, убедитесь, что выбрана опция «NL & CR»!
Скетч начинается с включения библиотеки и ее инициализации выводами Arduino, к которым подключены Tx и Rx платы расширения SIM900.
В функции мы инициализируем последовательные каналы связи между Arduino и Arduino IDE, Arduino и платой расширения SIM900 со скоростью передачи 9600 бод.
Теперь, когда мы установили базовое соединение, мы попытаемся установить связь с платой расширения SIM900, отправляя AT команды.
– это самая базовая AT команда. Она также инициализирует автоматическое определение скорости. Если всё работает, вы должны увидеть эхо символов AT, а затем ОК, сообщающее, что все в порядке, и модуль вас правильно понимает! Затем вы можете отправить несколько команд для запроса и получения информации о плате расширения, таких как:
– проверить «уровень сигнала» — первое число – это уровень в дБ, он должен быть выше 5. Чем выше, тем лучше. Конечно, это зависит от вашей антенны и местоположения!
– получить номер SIM-карты – она проверяет, что SIM карта найдена, и вы можете сверить номер, записанный на карте.
– убедиться, что вы зарегистрированы в сети. Второе число должно быть 1 или 5. 1 означает, что вы зарегистрированы в домашней сети, а 5 – в роуминге. Другие цифры, отличающиеся этих двух, означают, что вы не зарегистрированы ни в одной сети.
В основном цикле программы мы вызываем пользовательскую функцию , которая непрерывно ожидает любые входные данные от последовательного монитора и отправляет их на плату расширения SIM900 через вывод D8 (Rx платы расширения). Она также постоянно читает вывод D7 (Tx платы расширения) на случай, если плата расширения выдает какие-либо отклики.
В мониторе последовательного порта вы должны увидеть вывод, примерно такой как показан ниже.
Рисунок 16 – Базовые AT команды SIM900 GSM Shield на Arduino
Теперь вы можете свободно отправлять любые команды через монитор последовательного порта, например, те, которые показаны ниже, и которые дает дополнительную информацию о подключении к сети и состоянии аккумулятора:
– получить имя и версию платы расширения
– проверить, что вы подключены к сети
– вернуть список операторов, присутствующих в сети
– вернуть состояние литий-полимерного аккумулятора. Второе число является процентом от полного заряда (в данном случае это 93%), а третье число является фактическим напряжением в мВ (в данном случае 3,877 В)
Рисунок 17 – Получение дополнительной информации от SIM900 GSM Shield с помощью AT команд на Arduino
Для получения дополнительной информации о AT командах SIM900 смотрите документ ниже.
SIM-карты
Вдобавок к плате Arduino и GSM-модулю вам понадобится SIM-карта. Она представляет собой контракт с оператором связи. Оператор, продающий вам SIM-карту, должен либо обеспечить GSM-покрытие в регионе, где вы находитесь, либо иметь роуминговое соглашение с компанией, обеспечивающей GSM-покрытие в вашем регионе.
SIM-карты, как правило, имеют 4-значный PIN-код – в целях безопасности. Обязательно запомните этот код, т.к. он очень важен для подключения к сети. Если вы потеряете PIN-код, связанный с вашей SIM-картой, для его восстановления, возможно, надо будет обратиться к мобильному оператору. Если много раз раз ввести неправильный PIN-код, некоторые карты имеют свойство блокироваться. Поэтому если вы не уверены в правильности PIN-кода, лучше свериться с документацией, которая идет в комплекте с SIM-картой.
Кроме того, у вас есть возможность сбросить забытый или потерянный PIN-код, и это делается с помощью PUK-кода (от Pin Unlock Code, что значит «код для разблокировки PIN-кода). Этот PUK-код тоже указан в документации, идущей в комплекте с SIM-картой.
Обработка исключительных случаев
Все команды GSM/GPRS-модулей серии SIM800 имеют время исполнения
Разработчику ПО хоста важно знать время исполнения отдельно для каждой команды, чтобы исключить бесконечное ожидание реакции на команду (открытие соединения, к примеру). Значения максимального времени исполнения задокументированы, их можно найти в системе команд GSM/GPRS-модуля
В таблице 2 указаны значения максимального времени исполнения основных команд встроенного TCP/IP-стека. Как видно, некоторые команды исполняются десятки секунд. Это объясняется зависимостью этих команд от быстродействия сети и сервера.
Команда |
Максимальное время исполнения, с |
CIICR |
85 |
CIPSTART |
160 |
CIPSEND |
645 |
CIPCLOSE |
120 |
CIPSHUT |
65 |
Рис. 6. Нормальная процедура закрытия соединения с сервером
Получается, некоторые команды могут исполняться несколько минут, прежде чем можно будет понять, что что-то пошло не так. В М2М такие задержки, конечно, недопустимы. Как же обрабатывать случаи, когда время исполнения команды затянулось, а реакции так и не последовало? Все зависит от того, на каком этапе установления соединения произошел сбой (ошибка или вышел таймаут) и в каком состоянии находится стек (рис. 6). Причин сбоя может быть несколько, и реакция может быть разная, но главное вернуть встроенный стек в исходное состояние IP INITIAL или IP STATUS. Рассмотрим на примере несколько случаев:
- Сервер вышел из строя или доступ в Интернет ограничен (потеря пакетов, высокий пинг и проч.). В этом случае все команды из таблицы 1 приведут к длительному времени исполнения. Чтобы повторить попытку соединения с этим или другим сервером, следует перед этим закрыть сокет командой AT+CIPCLOSE=1. При этом деактивировать контекст командой AT+CIPSHUT не обязательно.
- Потеря связи с GSM-сетью. Такое возможно в местах плохого покрытия сети, из-за ухудшения условий приема сигнала или внезапной выемки SIM-карты из прибора. Здесь следует проверить готовность SIM-карты (AT+CPIN? или чтение ячейки памяти командой AT+CMGR), уровень сигнала (AT+CSQ), наличие регистрации в сети (AT+CREG?) и доступ к услугам GPRS (AT+CGATT?). Если физический доступ к GSM-сети пропадет после или во время открытия сессии командой AT+CIPSTART, то придется закрыть соединение (AT+CIPCLOSE=1), деактивировать контекст и восстанавливать соединение с начала, сразу после того как будут успешно проверены SIM-карта, уровень сигнала, регистрация в сети и доступ к услугам GPRS.
- Истек срок жизни контекста. Когда открывается контекст, сеть выделяет определенные ресурсы на его поддержание. Операторы сотовой связи не допускают мертвые контексты, когда ресурс занят, а обмена данными в этом контексте нет. Если обмена данных нет, то через некоторое время оператор деактивирует контекст. У разных операторов это время разное примерно от трех до семи минут. Модуль при этом в порт UART выдаст уведомление: +PDP DEACT. Его нужно обработать и сбросить встроенный стек в исходное состояние командой CIPSHUT. Однако иногда в некоторых приложениях требуется поддерживать контекст в активном состоянии. Для этого можно периодически обмениваться с сервером пустыми данными, типа эха. Но это неудобно в реализации. Взамен можно воспользоваться функцией поддержания соединения командой AT+CIPTKA .
- Нагрузка на сеть GSM. Всем известно, что GPRS-услуги и голосовая связь делят общие ресурсы. GPRS всегда выделяется оператором по остаточному принципу, а у голосовых соединений наивысший приоритет. Контекст может быть деактивирован оператором принудительно. Внешне данный случай выглядит как предыдущий (п. 3), и обрабатывать его следует аналогично.
Следует предусмотреть случай, когда переинициализация соединения не дает желаемого эффекта. В этом случае рекомендуются штатное выключение/включение модуля и повторная попытка восстановить соединение с самого начала.
Передача данных по GPRS с помощью SIM900
Свои первые опыты по передаче данных через GPRS я начал, используя для управления SIM900 платформу Arduino UNO (просто потому, что она была под рукой). Для начала купил хостинг с сервером под Apatche и развернул на нём простейшее приложение, которое умело отвечать на GET-запросы. Получилось! Я все так же посылал команды с ПК контроллеру Arduino, который в свою очередь пересылал их SIM900.
Всё работало корректно до тех пор, пока GET-запросы были достаточно короткими (до 100 символов). Но как только запросы стали длиннее — начались сбои: запросы передавались не полностью. Было замечено, что глюки могут появиться или исчезнуть даже при увеличении/уменьшении управляющей программы Arduino на несколько строк. Впоследствии выяснилось, что сбои связаны с программным USARTом, которой Arduino UNO использует для общения с SIM900, т.к. такой USART целиком и полностью зависит от программного цикла ядра контроллера. При малом количестве данных, они успевают передаваться всегда, а при увеличении их количества — результат передачи зависит от длительности программного цикла.
Вывод из всего вышесказанного: использовать программный USART при общении с SIM900 НЕЛЬЗЯ
, особенно когда речь идёт о большом количестве передаваемых данных.
У Arduino Uno всего один «железный» интерфейс USART, который был занят под обмен с ПК, поэтому пришлось отказаться от UNO, заменив её на Arduino Mega, которая не страдает недостатком «железных» USARTов. После такой «рокировки» работа устройства стала стабильной и корректной.
Некорректный GET-запрос на сервер
В самом начале своей работы по передаче данных по GPRS я допустил ошибку, которая стоила мне не одного дня мучений. Не имея достаточного опыта работы по взаимодействию с сервером посредством GET-запросов, я, набравшись поверхностных знаний в интернете, составил запрос вида:
Этот запрос не является корректным, однако его отлично «кушал» браузер и прокси сервер, с которого я отправлял запросы для отладки — именно поэтому я считал запрос верным.
Самое удивительное то, что SIM900 тоже отлично справлялся с «плохим» запросом (а отправлял запросы я тогда через TCP-IP стек). Однако, в один прекрасный день сервер начал отвечать на такие запросы ошибкой 404. Произошло это по так и не выясненным обстоятельствам, то ли хостинг-провайдер поменял алгоритмы обработки запроса (он открещивается от этого), то ли это сделал мобильный оператор. Но факт остаётся фактом. Тогда же я попробовал передать тот же запрос через HTTP — всё работало. Объясняется это тем, что внутренний HTTP протокол модуля SIM900 (как я уже говорил, по-сути встроенный браузер) умеет сам правильно «распарсивать» некорректные запросы и транслировать в сеть уже в правильном виде. Это еще один плюс (сомнительный, конечно же) использования HTTP, поскольку позволяет программисту некоторые неточности. А вообще, конечно, запрос должен быть написан правильно и выглядеть вот так:
С таким корректным запросом SIM900 успешно обменивается и через TCP-IP стек, и через HTTP.
Работа схемы
Схема устройства представлена на следующем рисунке.
Как вы можете видеть, мы подали питание на GSM модуль с помощью адаптера на 12V 1A, а на плату Arduino мы подали питание с помощью батарейки 9V, голосовой модуль ISD 1820 запитывается от платы Arduino. Записанный голос с данного модуля (с его контактов динамика) мы можем непосредственно передавать на контакты микрофона GSM модуля.
Плата Arduino и GSM модуль соединены по последовательному каналу связи, контакт Tx модуля подсоединен к контакту 9 платы Arduino, а контакт Rx модуля — к контакту 10 платы Arduino. Это позволит плате Arduino «прослушивать» GSM модуль. Когда на GSM модуль будет поступать входящий звонок плата Arduino будет обнаруживать это. Когда плата Arduino удостоверится в том, что звонок активен, она будет воспроизводить голосовое сообщение с голосового модуля при помощи подачи сигнала высокого уровня на свой контакт 8 в течение 200 мс – таким образом имитируется нажатие кнопки PlayE.
Устройство и характеристики
Устройство отправляет SMS при возникновении следующих событий:
- открытие двери (герконовый датчик);
- резкое изменение освещения (фоторезистор);
- движение (PIR датчик);
- выход температуры из заданного диапазона;
- низкое напряжение батареи.
Пример SMS с событием
Также, раз в сутки можно настроить время ежедневного отчета
Питается устройство от 3-х батареек AA. Расчетное время работы ≥6мес.
Настройка устройства, считывание логов событий и построение месячного графика температуры происходит с помощью утилиты (Python 2.7 + Tk + pyserial + matplotli).
Основное окно утилиты настройки
Окно лога событий
Окно лога температуры