Захаров Денис, Украина
Современные беспроводные технологии позволяют разрабатывать функциональные и доступные устройства. Подобные приборы взаимодействуют с широким спектром систем общего назначения. В этой статье пойдет речь об организации двухсторонней передачи данных между GSM модулем SIM800L (Рисунок 1) и полноценным веб-сервером.
![]() |
||
Рисунок 1. | GSM модуль SIM800L. |
В сети есть много примеров использования этого модуля. Как правило, его применяют в различных системах сигнализации и удаленного управления объектами. При этом данные передаются по SMS протоколу, что совершенно неудобно с пользовательской точки зрения.
Для организации работы такой системы нам понадобятся GSM модуль SIM800L, плата Arduino Nano (Рисунок 2) и веб-сервер с доменом.
![]() |
||
Рисунок 2. | Плата Arduino Nano. |
Принципиальная схема устройства показана на Рисунке 3.
![]() |
||
Рисунок 3. | Принципиальная схема устройства. |
Настройка GSM модуля SIM800L
В моем случае используется оператор связи «Киевстар». Для работы с подобными устройствами был подключен тарифный план «Киевстар датчик» (Рисунок 4), ежедневная плата за который составляет 1 грн (примерно 0.04USD). При этом предоставляется 10 Мб Интернета в сутки. Для наших задач этого трафика будет достаточно.
![]() |
||
Рисунок 4. | Тарифный план «Киевстар датчик». |
Для удобного программирования микроконтроллера платы Arduino Nano обмен данных с GSM модулем организован по программному UART с помощью стандартной библиотеки . Выводы D2-D3 назначены как Rx и Tx, соответственно.
Инициализация
Первым делом необходимо провести инициализацию и первичную настройку модуля SIM800L. Для этого в теле setup() вызываем подпрограмму init_GSM(), которая перезагружает модуль и последовательно отправляет команды:
AT
ATE0
AT+GSMBUSY=0
AT+CPAS
AT+CREG?
AT+CSQ
AT+CBC
AT+CUSD=1,"*111#"
Разберем назначение каждой команды:
- AT – проверяем готовность модуля в приему команд.
- ATE0 – отключаем режим ЭХО.
- AT+GSMBUSY=0 – запрещаем входящие звонки.
- AT+CPAS – проверяем готовностью и текущее состояние модуля.
- AT+CREG? – проверка регистрации в сети.
- AT+CSQ – проверка уровня сигнала.
- AT+CBC – проверяем питание.
- AT+CUSD=1,"*111#" – проверяем баланс SIM-карты.
Каждую команду необходимо проверять на наличие положительного ответа «ОК», в противном случае нужно заново отправить команду и дождаться нужного ответа. Как правило, при первом включении команда AT+CPAS с первого раза не дает ответ «ОК», обычно готовность появляется после 2-3 попыток.
На Рисунке 5 показан процесс выполнения подпрограммы init_GSM.
![]() |
||
Рисунок 5. | Процесс выполнения подпрограммы init_GSM. |
На Листинге 1 показан пример обработки команды AT+CPAS.
Листинг 1. Программа обработки команды AT+CPAS.
Во время ответа от модуля в cycle_for() происходит сравнение и установка значения в bit_ok. Если значение равняется 1, то модуль вернул «ОК», при ответе 2 – модуль возвращает «Error». Если положительно ответа нет, то через 1 секунду повторяем отправку i раз.
Настройка GPRS соединения
После того как основная настройка модуля прошла успешно, можно начинать инициализировать GPRS соединение.
Для этого вызываем функцию init_GPRS(), которая отправляет в модуль следующие строки:
GPRS test
AT+SAPBR=3,1,"APN","internet.tele2.ru"
AT+SAPBR=3,1,"USER","tele2"
AT+SAPBR=3,1,"PWD","tele2"
AT+SAPBR=1,1
AT+HTTPINIT
AT+HTTPPARA="CID",1
Аналогично подпрограмме init_GSM(), во всех необходимых местах проверяем положительный ответ «ОК» от модуля.
На Рисунке 6 показан процесс выполнения подпрограммы init_GPRS().
![]() |
||
Рисунок 6. | Процесс выполнения подпрограммы init_GPRS(). |
На этом этапе работу с модулем можно завершить. Для последующей работы необходимо настроить сервер и создать соответствующие файлы для обмена данными.
Создание файлов и работа с веб-сервером
Чтобы принять данные с GSM модуля, нужно приобрести услугу хостинга с минимальными требованиями, главное, чтобы была поддержка PHP. PHP – это популярный язык программирования, который исполняется на стороне сервера, в то время как JavaScript исполняется в браузере на стороне пользователя.
В качестве примера сделаем удаленное управление поливом теплицы.
Распишем основные задачи для веб-сервера и GSM модуля.
Задачи веб-сервера:
- Принимать и отображать на веб-странице данные температуры, времени работы и статус насоса;
- Предоставлять данные 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. | Законченный интерфейс управления. |
Вопросы безопасности, в случае атаки на веб сервер, выходят за рамки данного повествования, поэтому опустим их.
Считываем данные с сервера в Arduino
После завершения процесс отладки записи статуса вкл/выкл насоса в файл pomidor.txt можно считывать данные в Arduino. Напишем функцию чтения данных с сервера (Листинг 7).
Листинг 7. Функция чтения данных с сервера.
В строке adress_site указываем адрес своего сайта форматом http://site.ru/. В строке adress_txt указываем путь к txt файлу.
Прочитаем статус вкл/выкл насоса из файла txt/pomidor.txt, отобразим значение на терминале и на выводе D5 платы Arduino (Листинг 8).
Листинг 8. Программа формирования логического уровня вывода D5 в зависимости от статуса насоса.
Пример отображения при нажатии кнопки включении насоса показан на Рисунке 12.
![]() |
||
Рисунок 12. | Пример отображения при нажатии кнопки «Вкл» насоса. |
Передача данных из Arduino на веб-сервер
Для передачи данных на веб-сервер напишем функцию SEND_GPRS с указанием адреса "adress_php", в который будет записываться значение int типа "out_messeng_Server". Для записи значения типа String нужно вызывать функцию SEND_string_GPRS. В Листинге 9 показана функция отправки данных на сервер.
Листинг 9. Функция отправки данных на сервер.
В корневом каталоге веб-сервера создаем папку in, внутри ее располагаем другие папки со скриптами для обработки приема данных GSM модуля. Внутренние папки содержат файл index.php и log.txt.
На Листинге 10 показано содержание файла index.php.
Листинг 10. PHP листинг файла index.php.
Как видно, с приходом новых данных происходит перезапись файла log.txt.
![]() |
||
Рисунок 13. | Собранная схема на макетной плате. |
Все компоненты собраны на макетной плате (Рисунок 13). Устройство не требует настроек, после сборки и прошивки сразу готово к работе.