Бюджетная GSM сигнализация с мозгами из Arduino. Как подключить GSM модуль к шлагбауму или воротам

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

Итак, SIM900 – GSM-модуль компании SIM COM, управляется AT-командами, умеет посылать SMS, совершать звонки, организовывать прямое CSD-соединение, обмениваться информацией по GPRS.

В моих руках оказалась заказанная из Китая отладочная плата SIM900 GPRS shield – совместимая с платформой Arduino.

На плате находится сам чип SIM900, разъёмы для микрофона и наушников, переключатель источника питания (от внешнего разъёма или от Arduino), антенна, несколько светодиодов для индикации режимов работы, разъём для батарейки (если нужны часы реального времени), кнопка включения/выключения. Хорошее описание я нашёл на wiki производителя . Там же приведён код для управления модемом в различных режимах.

Как заявляет нам производитель плата отлично совместима с Arduino Uno. Действительно, плата SIM900 просто втыкается в Uno и сразу же начинает работать. Однако, как выяснилось, Arduino Uno может оказаться «слабоватой» для реализации некоторых функций, но об этом я расскажу чуть ниже.

С Arduino Mega плата работает с некоторыми ограничениями. Это связано с тем, что у Меги в отличие от Uno пины 7 и 8, недоступны для использования в качестве software serial (программный USART). Это решается переключением интерфейса USART на ноги 0 и 1, для этого на плате SIM900 предусмотрены джамперы.

Вообще, плату можно подключить к любому контроллеру с интерфейсом USART. Например, пробовал управлять модемом с помощью контроллера STM32F4.

SIM900: SMS-сообщения и звонки

Испытания модуля для обмена SMS-сообщениями и звонков прошли «на УРА»! Модуль справился с этими задачами без особых проблем, для этого я просто скопировал c того же сайта , скомпилировал и прошил в Arduino Uno вот этот код:

//Serial Relay - Arduino will patch a //serial link between the computer and the GPRS Shield //at 19200 bps 8-N-1 //Computer is connected to Hardware UART //GPRS Shield is connected to the Software UART #include SoftwareSerial GPRS(7, 8); unsigned char buffer; // buffer array for data recieve over serial port int count=0; // counter for buffer array void setup() { GPRS.begin(19200); // the GPRS baud rate Serial.begin(19200); // the Serial port of Arduino baud rate. } void loop() { if (GPRS.available()) // if date is comming from softwareserial port ==> data is comming from gprs shield { while(GPRS.available()) // reading data into char array { buffer=GPRS.read(); // writing data into array if(count == 64)break; } Serial.write(buffer,count); // if no data transmission ends, write buffer to hardware serial port clearBufferArray(); // call clearBufferArray function to clear the storaged data from the array count = 0; // set counter of while loop to zero } if (Serial.available()) // if data is available on hardwareserial port ==> data is comming from PC or notebook GPRS.write(Serial.read()); // write it to the GPRS shield } void clearBufferArray() // function to clear buffer array { for (int i=0; i

Для того, чтобы посылать модулю команды, его нужно подключить к компьютеру. Это можно сделать, используя USB порт Arduino. На компьютере для этого нужен любой монитор COM-порта. Его можно скачать отсюда , а можно использовать монитор, встроенный в Arduino IDE.

Всё, что делает прошитая программа Arduino, — «ловит» команды пользователя и посылает их модулю, а затем возвращает пользователю ответы SIM900. Таким образом, передавая модулю AT-команды в ручном режиме, я опробовал приём и передачу SMS-сообщений, а подключив в соответствующие разъёмы микрофон и наушники — воспользовался модулем SIM900 в качестве мобильного телефона.

Передача данных по 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ов. После такой «рокировки» работа устройства стала стабильной и корректной.

SIM900: TCP-IP стек или HTTP? Что лучше?

Изучая руководство по управлению модемом, я обнаружил что существует две группы AT-команд. Первая группа используется для передачи данных через встроенный TCP-IP стек, а вторая использует HTTP протокол уже реализованный внутренней логикой SIM900. Сколько я ни мучал Google и Яндекс пытаясь узнать, чем же отличаются данные способы, каковы плюсы и минусы каждого из них, — ничего не нашёл, поэтому попробовал оба и делюсь своим практическим опытом тут.

Оба способа рабочие и имеют право на существование.

TCP-IP стек немного сложнее инициализируется (больше команд нужно передать модулю), им немного сложнее управлять. Для того, чтобы передать запрос, необходимо открыть соединение, дождаться ответа и корректно закрыть его.

HTTP — это, говоря простыми словами, браузер встроенный в SIM900. Он прост в инициализации, для того чтобы начать обмен с сервером необходимо открыть сеанс. При этом открытие и закрытие соединения при каждом запросе и решение других «организационных задач» ложиться на плечи SIM900. Это удобно, к тому же передача данных таким способом происходит несколько быстрее, как раз из-за того, что у SIM900 быстрее получается выполнять все «вспомогательные операции», чем это может делать управляющий контроллер.

Таким образом, при выборе способа обмена я все-таки остановился на протоколе HTTP.

Некорректный GET-запрос на сервер

В самом начале своей работы по передаче данных по GPRS я допустил ошибку, которая стоила мне не одного дня мучений. Не имея достаточного опыта работы по взаимодействию с сервером посредством GET-запросов, я, набравшись поверхностных знаний в интернете, составил запрос вида:

GET http://xxx.ru/d_command.php?UC=1111 HTTP/1.1
HOST: xxx.ru

Этот запрос не является корректным, однако его отлично «кушал» браузер и прокси сервер, с которого я отправлял запросы для отладки — именно поэтому я считал запрос верным.

Самое удивительное то, что SIM900 тоже отлично справлялся с «плохим» запросом (а отправлял запросы я тогда через TCP-IP стек). Однако, в один прекрасный день сервер начал отвечать на такие запросы ошибкой 404. Произошло это по так и не выясненным обстоятельствам, то ли хостинг-провайдер поменял алгоритмы обработки запроса (он открещивается от этого), то ли это сделал мобильный оператор. Но факт остаётся фактом. Тогда же я попробовал передать тот же запрос через HTTP — всё работало. Объясняется это тем, что внутренний HTTP протокол модуля SIM900 (как я уже говорил, по-сути встроенный браузер) умеет сам правильно «распарсивать» некорректные запросы и транслировать в сеть уже в правильном виде. Это еще один плюс (сомнительный, конечно же) использования HTTP, поскольку позволяет программисту некоторые неточности. А вообще, конечно, запрос должен быть написан правильно и выглядеть вот так:

GET /d_command.php?UC=1111 HTTP/1.1
HOST: xxx.ru

С таким корректным запросом SIM900 успешно обменивается и через TCP-IP стек, и через HTTP.

Зависание SIM900

Иногда при обмене по GPRS возникают ситуации, после которых модуль может зависнуть. Этому виной могут быть некорректные данные, пришедшие по сети и загнавшие в ступор SIM900, или помехи на линии обмена модуля и контроллера, при которых SIM900 получил «не то, что ждал», или ещё какие-то неведомые проблемы. Производитель чипа предупреждает о том, что это может происходить и предлагает в таких случаях перезагружать модуль с помощью специальной последовательности импульсов, подаваемых на вход PWRKEY.

Однако, как выяснилось, это не всегда помогает — после такой перезагрузки модуль может «проснуться» всё ещё «глюкнутым». И об этом тоже нас предупреждает производитель, если внимательно читать DataSheet на модуль. Вот что рекомендуется в документации:

NOTE: It is recommended to cut off the VBAT power supply directly instead of using external reset pin when SIM900 can not respond to the AT command “AT+CPOWD=1” and PWRKEY pin.

Поэтому самым правильным способом перезагрузки модуля является полное снятие с него питания (с ножки VBAT), выдержка некоторой паузы (хотя бы секунду на всякий случай) и повторная подача питания. Для перезагрузки модуля на плате лучше предусмотреть реле или транзисторный ключ, управляемый контроллером.

Заключение

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

До свидания! Следите за обновлениями на LAZY SMART .

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

Вот так владелец открывает ворота при въезде на территорию

Наиболее широкое распространение GSM-модуль получил как надежный и бюджетный контроллер для управления групповым доступом на объект, совместимый с популярной автоматикой ворот и шлагбаумов Doorhan и Came.

Как работает модуль

По сути GSM-модуль — это радиоприемник с установленной sim картой любого оператора сотовой связи и контроллер для обработки поступающей и исходящей информации. В базу данных модуля заносятся телефонные номера всех пользователей, имеющих право доступа на закрытую территорию. Современные модели поддерживают запись и хранение до 2000 номеров, более дорогие модификации способны обрабатывать до 10000 номеров.

Принцип работы устройства показан на рисунке.

Принципиальная схема работы устройства

При осуществлении звонка контроллер производит сверку входящего номера с записанными данными, и при его наличии в памяти подается команда на осуществление открытия и приведение в действие привода шлагбаума и откатных ворот. Если номера в списке нет, то устройство просто сбрасывает звонок, не производя больше никаких действий. Подобным же образом контроллер открывает распашные ворота, оборудованные электрозамком и приводом Doorhan или Came.

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

Приведем пример gsm-модуля от компания ООО «Тор-Хаус». Существуют две модели, которые отличаются количеством пользовательских номеров и набором функций. Фото модулей на рисунке ниже.

Технические характеристики модулей приведены в таблице.

Характеристика Модель TH-G01 Модель TH-G02
Электропитание, В =12 или 24 В =9 … 24В
Частота, МГц Диапазоны 850/900/1800 Диапазоны 850/900/1800
SIM-карта Стандартная 1.8/3В Стандартная 1.8/3В
Антенна 50 Q SMA, возможно подключение выносной антенны с разъемом SMA
Реле 1, сухой контакт NO/NC 2, сухой контакт NO/NC
Кол-во пользователей 99 3002
Запись пользователей SMS SMS или звонок
Диапазон температур -30 … +60 -30 … +60

Плюсы и минусы gsm модулей

  • отпадает необходимость покупки индивидуальных пультов, брелоков или карточек, причем не все системы управления шлагбаумом «резиновые» и рассчитаны на их ограниченное число;
  • открыть шлагбаум или ворота можно с любого места, входящего в сеть покрытия мобильного оператора, благодаря чему обеспечить пропуск знакомого на территорию, находясь вне зоны досягаемости - не проблема, + упрощение работы службы охраны;
  • осуществление контроля - с помощью программного обеспечения или смс-команд, возможно добавление и удаление номеров из базы, настройка таких параметров, как допуск по дням недели, времени суток, запрет въезда при неуплате обязательных взносов, ведение журнала въездов и т. д.;
  • возможность установки на автоматические шлагбаум и ворота любого производителя;
  • экономия - цена на один gsm-контроллер приблизительно равняется стоимости трех пультов Came, и при большом количестве пользователей такая автоматизация проезда существенно выгоднее.

И небольшая ложка дегтя в бочку с медом - ворота или шлагбаум невозможно будет открыть при разряженной батарее телефона или нулевом балансе, будь они трижды Doorhan или Came, но тоже самое может приключиться, если вы, к примеру, забыли или потеряли пульт.

Характеристики популярных моделей

Teltonika

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

Teltonika VRT012

Совместим с автоматикой Doorhan, рабочее напряжение - 12 В, укомплектовывается блоком питания для подключения к сети 220 В. Стабильно работает от -20 до +40°С. Настройка списка клиентов осуществляется с помощью смс или через компьютерное приложение.

Doorhan

Контроллер сохраняет в базе данных до 500 номеров. Предназначен для установки как непосредственно в корпус откатных ворот и шлагбаума с автоматикой Doorhan, так и снаружи. Работает при температуре -20 до +40°С, имеет собственный корпус для защиты от внешних воздействий. Электропитание 12-24 В.

Модуль Doorhan

Настройка параметров производится смс-командами или через компьютер. Модуль Doorhan совместим с автоматикой других производителей, существует лишь небольшое число приводов, для которых требуется дополнительная адаптация. Чтобы выяснить о возможности установки, обратитесь к специалистам организации-продавца.

ESIM 110/120

Осуществляет пропуск на территорию до 500 клиентов, дополнительная опция - расширение до 2000. В улучшенной версии - ESIM 120 реализована технология облачного управления через WEB-интерфейс и с мобильного приложения.

ESIM120 ELDES — GSM контроллер для открывания ворот и скуд

Контроллер совместим с автоматикой откатных ворот Doorhan, компактен и может встраиваться внутри блока системы привода. Удобное ведение журнала, где можно задать различные параметры разрешений на въезд индивидуально по каждому клиенту и просмотреть, кто и когда заезжал - память на 1000 событий. Рабочее напряжение 10-24 В, диапазон температур от -20 до +55°С.

Места применения

Модули применяются для управления любого типа оборудования с электроприводом:

  • автоматических ворот, шлагбаумов;
  • котлов;
  • офисных дверей (при наличии электрозамка);
  • сигнализаций;
  • автомобилей;
  • и прочих устройств.

Мы уже знакомы с такими устройствами, как GSM/MMS камеры (), GSM-сигнализации (), отправляющие сообщения при активации датчика движения. Это были первые устройства с применением GSM-модулей и их применение стало расширятся.

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

Допустим, в ЖК «Березка» 5 домов, 500 квартир умножаем на 1500 руб. (средняя цена ключа). ТСЖ придется собрать с жильцов 750000 руб. только на закупку ключей.

Получается большая экономическая выгода в сравнении с покупкой ключей!

Уговорить собственников жилья на покупку автоматического шлагбаума будет легче, когда сумма инвестиций в оборудование и монтаж будет составлять 2000-3000 руб с квартиры.

Если сравнить с RFID метками, которые тоже могут применяться в качестве открывания ворот, то RFID идентификации несколько другой, комплект оборудования стоит дороже, но и диапазон применения шире.

В следующей статье разберем модуль от компании SmartAirkey — бесключевой доступ в подъезды и парковки многоквартирных домов.

Работу с GSM/GPRS-шилдом SIM900 , сейчас речь пойдёт о дешёвом (порядка 150 рублей) модуле GSM NEOWAY M590 .

Модуль продаётся «врассыпную» (в комплекте есть всё необходимое) , поэтому потребуются навыки пайки, впрочем, ничего сложного там нет.

В комплекте поставляется
Две маленькие, чёрные штучки - это резисторы, полярность не имеет значения.
Квадратная жёлтая штука - это танталовый конденсатор, полярность здесь важна, поэтому припаиваем как на картинке.
Чёрный цилиндр - это диод (в данной конструкции отвечает за понижение напряжения) , обязательно соблюдение полярности, так что делаем как на иллюстрации.
Маленькая прозрачная штучка - это светодиод, опять же, важна полярность, на плате минус расположен ближе к букве B oot.

Остальные детали, думаю, не вызывают вопросов.

Для тех, кто планирует разводить плату под модуль самостоятельно:

Подключение и эксплуатация

NEOWAY общается с ардуиной (или иным устройством) через UART (RX, TX) с помощью AT-команд . Для того чтоб посылать команды, надо выяснить скорость UARTа.
Для выяснения скорости, нужно подключить собраный модуль к компьютеру с помощью USB-UART моста, выглядит эта штука так:

В этом случае соединяем:

USB-UART <> NEOWAY

+5 <> +5
GND <> GND
TX <> RX
RX <> TX

Контакт BOOT используется для включения/отключения модуля кратковременным (~1сек) соединением с GND , однако удобнее просто соединить его с GND и не отсоединять. Включение модуля будет происходить при подачи питания.

Если такой штуки нет, то можно превратить ардуину в USB-UART мост залив в неё вот такой скетч…

Void setup() { pinMode(0, INPUT); pinMode(1, INPUT); } void loop() {}

… и соединив следующим образом:

Ардуина <> NEOWAY

+5 <> +5
GND <> GND
RX <> RX
TX <> TX

Контакт BOOT соедините с GND .

О питании

Модуль может потреблять большой ток , до 2-х ампер в пике, поэтому для надёжной работы необходимо организовать дополнительный БП. В принципе заработает то он и от ардуины, но в момент регистрации в сети или приёма звонка, модуль может перегружаться.

Так же будет не лишним поставить электролитический конденсатор (~1000 микрофарад, 16 вольт) поближе к модулю.

После подачи питания, на плате должен начать м и г а т ь светодиод (примерно раз в секунду) - это говорит о том, что он готов к работе.

Теперь подключаем Вашу конструкцию к компьютеру, в IDE Arduino открываем «Монитор последовательного порта» (в дальнейшем «терминал») , выбираем (внизу-справа) NL & CR , устанавливаем скорость 9600 и отправляем команду проверки связи - AT

Если ответ - ОК, то значит модуль работает и скорость UARTа установлена 9600 . Если ответа нет, то проверьте правильность соединения UARTа и дальше действуйте методом «тыка» подставляя разные скорости, пока не увидите заветное ОК .

После старта модем скажет - MODEM:STARTUP , а о готовности к работе сообщит - +PBREADY

Если модему не будет хватать питания (большинство возникающих проблем происходят из-за этого) , то он будет постоянно рестартовать.

Ещё я столкнулся с тем, что модем работает не со всеми сим-картами.

Если всё в порядке, тогда переходим к изучению АТ-команд для общения с NEOWAY и его настройки.

АТ-команды

АТ - запрос состояния, ответ - ОК.

ATE0 - отключить «эхо».

ATE1 - включить «эхо».
Эхо - это повтор введённой команды в терминал.

ATI - название и версия модуля.

AT+getvers - версия прошивки.

AT+IPR=9600 - установка скорости UARTа (9600) , возможные варианты - 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200.

AT&W0

AT&W1 - сохранение конфигурации настроек в EEPROM.
0 для нулевого профиля, 1 для первого профиля.

AT+CPAS - проверка статуса модема, ответ - +CPAS: 0.
Статусы: 0 - готов к работе, 2 - неизвестно, 3 - входящий звонок, 4 - в режиме соединения.

AT+CPWROFF - отключение модуля.

AT+CLIP=1 - включить АОН.

AT+CLIP=0 - отключить АОН.

ATD+79634759175; - позвонить.
В терминал будут выводиться сообщения: CONNECT - соединение установлено, BUSY - занят, NO ANSWER - нет ответа, NO CARRIER - вызов сброшен.

ATH - сбросить все соединения.

ATH1 - сбросить текущие соединение.

AT+CMGF=1 - настроить на текстовый формат SMS.

AT+CMGF=0 - настроить SMS на PDU формат.

AT+CSCS=«GSM» - кодировка текста sms - ASCII. Переправьте на нормальные кавычки.
Возможны другие кодировки: HEX – шестнадцатеричными значениями, IRA – международный справочный алфавит, PCCP437 – кодировка CP437(IBM PC), 8859-1 – кодовые страницы семейства ISO 8859, UCS2 – кодировка unicode.

AT+CMGR=1 - чтение sms, где цифра - порядковый номер сообщения. То есть в данном случае читается первое сообщение, так - AT+CMGR=2 второе и т.д.

AT+CMGD=1 - удаление sms, где цифра - порядковый номер сообщения.

AT+CMGD=1,1 - удалить все прочитанные sms.

AT+CMGD=1,2 - удалить все прочитанные и отправленные sms.

AT+CMGD=1,3 - удалить все прочитанные, отправленные и неотправленные sms.

AT+CMGD=1,4 - удалить все sms.

AT+CNMI=1,2,2,1,0 - вывод принятого sms в терминал.

Можно найти исчерпывающую информацию по ат-командам.

Отправка SMS будет осуществляться ардуиной.

Далее будем управлять модулем с помощью ардуины

Если на вашем модуле установлена скорость UARTа отличная от 9600 , тогда дайте команду:

AT+IPR=9600
При взаимодействии с ардуиной будет использоваться SoftwareSerial, а он плохо работает на скоростях выше 9600.

Отключите девайс от питания и переключите RX и TX (остальное без изменений) модуля к ардуине следующим образом:

Ардуина <> NEOWAY

+5 <> +5
GND <> GND
D2 <> TX
D3 <> RX

Контакт BOOT соедините с GND .

Вначале загружаем в ардуину простой скетч (предварительно вписав номер, с которого будете звонить на модуль) .

При старте, на каждую команду должно быть подтверждение - ОК.

#include SoftwareSerial mySerial(2, 3); byte led = 13; void setup() { delay(2000); pinMode(led, OUTPUT); digitalWrite(led, LOW); Serial.begin(9600); mySerial.begin(9600); Serial..println(); Serial.println("Turn on AOH:"); mySerial.println("AT+CLIP=1"); //включить АОН delay(100); // ПРИ СТАРТЕ, НА КАЖДУЮ КОМАНДУ ДОЛЖНО БЫТЬ ПОДТВЕРЖДЕНИЕ - ОК } void loop() { if(mySerial.available()) //если модуль что-то послал { char ch = " "; String val = ""; while(mySerial.available()) { ch = mySerial.read(); val += char(ch); //собираем принятые символы в строку delay(3); } Serial.print("Neo send> "); Serial.println(val); if(val.indexOf("RING") > -1) //если есть входящий вызов, то проверяем номер { if(val.indexOf("79891196709") > -1) // ВПИШИТЕ НОМЕР, с которого Вы будете звонить на модуль { Serial.println("Call my phone"); mySerial.println("ATH"); //разрываем связь Serial.println("Disconnection"); Serial.println("On D13"); digitalWrite(led, HIGH); //включаем светодиод на 5 сек Serial.println("5 sec pause"); delay(5000); digitalWrite(led, LOW); //выключаем Serial.println("Off D13"); } } } }
При звонке со вписанного номера, будет на 5 секунд зажигаться D13, а связь обрываться. Если это будет другой номер, то ничего не произойдёт. Все действия отображаются в терминале.

Следующий скетч будет посылать SMS в ответ на наш звонок:

#include SoftwareSerial mySerial(2, 3); byte led = 13; void setup() { delay(2000); pinMode(led, OUTPUT); digitalWrite(led, LOW); Serial.begin(9600); mySerial.begin(9600); Serial..println(); Serial.println("Turn on AOH:"); mySerial.println("AT+CLIP=1"); // включить АОН delay(100); Serial.println("Text format sms:"); mySerial.println("AT+CMGF=1"); // текстовый формат SMS delay(100); Serial.println("Mode GSM:"); mySerial.println("AT+CSCS=\"GSM\""); // кодировка текста - GSM delay(100); // ПРИ СТАРТЕ, НА КАЖДУЮ КОМАНДУ ДОЛЖНО БЫТЬ ПОДТВЕРЖДЕНИЕ - ОК } void loop() { if(mySerial.available()) //если модуль что-то послал { char ch = " "; String val = ""; while(mySerial.available()) { ch = mySerial.read(); val += char(ch); //собираем принятые символы в строку delay(5); } Serial.print("Neo send> "); Serial.println(val); if(val.indexOf("RING") > -1) //если есть входящий вызов, то проверяем номер { if(val.indexOf("79919790861") > -1) // ВПИШИТЕ НОМЕР, с которого Вы будете звонить на модуль { Serial.println("Call my phone"); mySerial.println("ATH"); //разрываем связь Serial.println("Disconnection"); delay(3000); sms(String("Hello from сайт"), String("+79919790861")); // ВПИШИТЕ НОМЕР, с которого Вы будете звонить на модуль } } } } void sms(String text, String phone) // отправка СМС { Serial.println("Start SMS send"); mySerial.println("AT+CMGS=\"" + phone + "\""); delay(500); mySerial.print(text); delay(500); mySerial.print((char)26); delay(500); Serial.println("SMS send OK"); delay(2000); }
Вместо строки «Hello from сайт» можно вписать какую-либо переменную, например температуру с датчика, а звонок заменить каким-либо событием, например, нажатием на кнопку (дописав обработчик нажатия кнопки).

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

#include SoftwareSerial mySerial(2, 3); byte led = 13; void setup() { delay(2000); pinMode(led, OUTPUT); digitalWrite(led, LOW); Serial.begin(9600); mySerial.begin(9600); Serial..println(); } void loop() { if(Serial.available()) //если в мониторе порта ввели что-то { char ch = " "; String val = ""; while (Serial.available()) { ch = Serial.read(); val += char(ch); //собираем принятые символы в строку delay(5); } if(val.indexOf("callmy") > -1) // своя команда { mySerial.println("ATD+79196989701;"); // ВПИШИТЕ номер, на который нужно позвонить } else mySerial.println(val); // передача всего, что набрано в терминале в GSM модуль } while(mySerial.available()) { Serial.print((char)mySerial.read()); delay(3); } }
Если ввести в терминале ат-команду - AT+CLIP=1 , то включится АОН, а если ввести свою команду - callmy , тогда модуль перезвонит на вписанный в скетче телефон.

Скетч для отправки SMS-команд:

#include SoftwareSerial mySerial(2, 3); byte led = 13; void setup() { delay(2000); pinMode(led, OUTPUT); digitalWrite(led, LOW); Serial.begin(9600); mySerial.begin(9600); Serial..println(); Serial.println("Turn on AOH:"); mySerial.println("AT+CLIP=1"); //включить АОН delay(300); Serial.println("Text format sms:"); mySerial.println("AT+CMGF=1"); // текстовый формат SMS delay(300); Serial.println("Mode GSM:"); mySerial.println("AT+CSCS=\"GSM\""); // кодировка текста - GSM delay(300); Serial.println("SMS to terminal:"); mySerial.println("AT+CNMI=2,2,0,0,0"); // вывод смс в консоль delay(300); } void loop() { if(mySerial.available()) //если модуль что-то послал { char ch = " "; String val = ""; while(mySerial.available()) { ch = mySerial.read(); val += char(ch); //собираем принятые символы в строку delay(3); } Serial.print("Neo send> "); Serial.println(val); if(val.indexOf("+CMT") > -1) //если есть входящее sms { if(val.indexOf("led13on") > -1) // смотрим, что за команда { Serial.println("On D13"); digitalWrite(led, HIGH); //включаем светодиод } if(val.indexOf("led13off") > -1) // смотрим, что за команда { digitalWrite(led, LOW); //выключаем Serial.println("Off D13"); } } } }
Если отправить модулю смску с текстом - led13on , то светодиод зажжётся, а если отправить текст - led13off , то погаснет.

И последний скетч, который позволяет отправив в модуль смс со специальным словом, получить в ответ смс с балансом денег на симке, которая стоит в NEOWAY
Не забудьте вписать нужный номер.

#include SoftwareSerial mySerial(2, 3); byte led = 13; void setup() { delay(2000); pinMode(led, OUTPUT); digitalWrite(led, LOW); Serial.begin(9600); mySerial.begin(9600); Serial..println(); Serial.println("Turn on AOH:"); mySerial.println("AT+CLIP=1"); //включить АОН delay(300); Serial.println("Text format sms:"); mySerial.println("AT+CMGF=1"); // текстовый формат SMS delay(300); Serial.println("Mode GSM:"); mySerial.println("AT+CSCS=\"GSM\""); // кодировка текста - GSM delay(300); Serial.println("SMS to terminal:"); mySerial.println("AT+CNMI=2,2,0,0,0"); // вывод смс в консоль delay(300); } void loop() { if(mySerial.available()) //если модуль что-то послал { char ch = " "; String val = ""; while(mySerial.available()) { ch = mySerial.read(); val += char(ch); //собираем принятые символы в строку delay(3); } Serial.print("Neo send> "); Serial.println(val); if(val.indexOf("+CMT") > -1) //если есть входящее sms { if(val.indexOf("money") > -1) // смотрим, что за команда { delay(3000); mySerial.println("ATD#100#;"); } } if(val.indexOf("+CUSD") > -1) //если есть входящее sms { if(val.indexOf("Balance") > -1) // смотрим, что за команда { delay(3000); val = val.substring(val.indexOf("Balance"),val.indexOf("r")); sms(String(val), String("+79967081199")); // ВПИШИТЕ ВАШ НОМЕР } } } } void sms(String text, String phone) //отправка СМС с балансом модема { Serial.println("Start SMS send"); mySerial.println("AT+CMGS=\"" + phone + "\""); delay(500); mySerial.print(text); delay(500); mySerial.print((char)26); delay(500); Serial.println("SMS send OK"); delay(2000); }
Отправьте модулю смску с текстом - money и через несколько секунд придёт ответная смс с количеством денег на балансе симки NEOWAY.

Все эксперименты проводились с оператором МТС.

Теперь можно из этих скетчей собирать то, что Вам нужно.

При поступлении входящего вызова на контакте RING появляются импульсы с низким логическим уровнем длительностью 30 мс, в такт звуку гудка. При получении SMS сообщения, появляется однократный импульс длительностью 25-35 мс.

На этом пожалуй всё…

Вступайте в

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

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

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

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

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

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

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

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

Функции, которые требуются коду:

  • uint16_t init_serial_port(char *port_name) Эта функция настраивает указанный последовательный порт. Под Windows.
  • uint16_t puts_serial(uint8_t *buffer, uint16_t size) А эта пишет строку байт в этот порт.
  • gets_serial(uint8_t *buffer, uint16_t size) Эта, соответственно, читает строку байт из последовательного порта.
Функции, которые код предоставляет:
  • init_gprs() & stop_gprs() Соответственно инициализируют и вырубают GSM-модуль.
  • uint16_t connect_gprs(uint8_t index, uint8_t mode, char *address, char *port) Устанавливает подключение с сервером. Стоит отметить, что модуль умеет работать с протоколами TCP и UDP как в качестве клиента, так и будучи клиентом. Поддерживается максимум 8 одновременных подключений.
  • uint16_t close_gprs(uint8_t index) Закрывает указанное подключение.
  • uint16_t send_gprs(uint8_t index, uint8_t *buffer, uint16_t size) Отправка сообщения через указанное подключение.
  • uint16_t recv_gprs(uint8_t index, uint8_t *buffer, uint16_t size) Получение сообщения. Неблокирующая функция, что значит она не будет ждать появления данных в потоке, а вернет управление, если получать нечего. Стоит отметить, что такое поведение реализовать проще, чем блокирующее.

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

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

Вот как выглядит функция инициализации порта:
uint16_t init_serial_port(char *port_name) { COMMTIMEOUTS timeouts; DCB parameters; int result; serial_port_handle = CreateFile(port_name, // "\\\\.\\COMx" GENERIC_READ | GENERIC_WRITE, 0, // Значения последующих параметров фиксированы при работе с портом NULL, OPEN_EXISTING, 0, NULL); if (serial_port_handle == INVALID_HANDLE_VALUE) { printf("Error opening a serial port!\n"); return 1; } // Максимальное время между чтением двух байт подряд timeouts.ReadIntervalTimeout = 100; // Следующее значение умножается на количество читаемых из порта символов timeouts.ReadTotalTimeoutMultiplier = 0; // и прибавляется к этому значению, получается максимальное время на выполнение // всей операции timeouts.ReadTotalTimeoutConstant = 1000; // Значение то же, что и у предыдущих двух параметров, однако таймаут считается на запись. timeouts.WriteTotalTimeoutMultiplier = 0; timeouts.WriteTotalTimeoutConstant = 1000; result = SetCommTimeouts(serial_port_handle, &timeouts); if (result == 0) { printf("Error setting timeouts for serial port!\n"); close_serial_port(); return 1; } // В параметры порта занесены самые простые настройки - без контроля // четности, без управления потоком, 1 стоп-бит. memset(¶meters,0,sizeof(parameters)); parameters.DCBlength = sizeof(DCB); GetCommState(serial_port_handle, &parameters); parameters.BaudRate = (DWORD)BAUD_RATE; parameters.ByteSize = 8; parameters.Parity = NOPARITY; parameters.StopBits = ONESTOPBIT; parameters.fAbortOnError = TRUE; parameters.fDtrControl = DTR_CONTROL_DISABLE; parameters.fRtsControl = RTS_CONTROL_DISABLE; parameters.fBinary = TRUE; parameters.fParity = FALSE; parameters.fOutX = FALSE; parameters.fInX = FALSE; parameters.XonChar = (uint8_t)0x00; parameters.XoffChar = (uint8_t)0xff; parameters.fErrorChar = FALSE; parameters.fNull = FALSE; parameters.fOutxCtsFlow = FALSE; parameters.fOutxDsrFlow = FALSE; parameters.XonLim = 128; parameters.XoffLim = 128; result = SetCommState(serial_port_handle, &parameters); if (result == 0) { printf("Error setting serial port parameters!\n"); close_serial_port(); return 1; } return 0; }

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

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

Команда является простой строкой из ASCII-символов. Чтобы команду воспринял модуль, в ее конце нужно поставить символ перевода каретки "\r" . В ответ модуль передаст строку символов, состоящую из двух частей - команды, на которую модуль отвечает и отделенным от нее символами "\r\r\n" ответом, заканчивающимся символами "\r\n" . Чтобы было удобнее разбирать ответы я создал макрос, который устанавливает указатель на начало ответа в принимающем буфере. Если хочется вывести ответ в консоль, нужно добавить нулевой символ в конец принятого сообщения.

Void at_send(char *cmd, uint16_t size) { uint16_t result; cmd = "\r"; result = puts_serial(cmd, size); return; } uint16_t at_recv(uint8_t *buffer, uint16_t size) { uint16_t result; result = gets_serial(buffer, size); return result; }
Примерно так и выглядят вспомогательные функции для отправки команды и получения ответа.

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

Самая большая функция в коде отвечает за настройку модуля. При инициализации отправляется много AT-команд. Я опишу их в порядке посылки модулю. Специально не расписываю аргументы и варианты ответов подробно, ибо их можно найти в документации.
  • "AT+CPIN=pin-code" Как несложно догадаться, эта команда разблокирует SIM-карту путем ввода пин-кода. Чтобы проверить, требуется ли пин-код, можно использовать команду "AT+CPIN?" .
  • "AT+CREG?" Эта команда возвращает статус регистрации модуля в сети. Нужно выполнять ее, пока модуль не ответит, что в сети он зарегистрирован.
  • "AT+CGATT=1" Заставляет модуль подключиться к GPRS. Проверить, подключен ли он, можно командой "AT+CGATT?" .
  • "AT+CIPRXGET=1" Включает получение данных, переданных через соединение, вручную. По умолчанию этот параметр отключен и данные передаются в последовательный порт сразу после получения. Это не слишком удобно, хотя и не критично - можно настроить модуль так, чтобы вместе с данными он передавал и заголовки IP, по которым можно определить, от кого был получен пакет. Я решил, что вручную данные получать проще и не ошибся. Как я понял, данная команда воспринимается только GSM-модулями SIM.COM.
  • "AT+CIPMUX=1" По умолчанию модуль может устанавливать только одно подключение. Этот параметр включает возможность создавать несколько подключений. Отправка и прием данных будут отличаться только на один параметр - индекс подключения.
  • "AT+CSTT="internet"" APN - Access Point Name, имя точки доступа для GPRS. Для моего провайдера выглядит именно так.
  • "AT+CIICR" Устанавливает беспроводное подключение GPRS. Может занять некоторое время, так что ее нужно выполнять в цикле и проверять ответ.
  • "AT+CIFSR" Возвращает IP-адрес модуля. Я использую ее чтобы проверить, подключен ли модуль к интернету.
  • "AT+CDNSCFG="8.8.8.8","8.8.4.4"" Этой командой устанавливаются сервера DNS, которые будет использовать модуль.
  • "AT+CIPSTATUS" Помимо данных о состоянии подключений эта команда дает информацию о том, готов ли модуль к установке соединений. Так что нужно проверить ее ответ.
После выполнения этих команд модуль будет готов к работе. Ну или не будет. Тут уж как повезет.

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

Создание подключения производится командой "AT+CIPSTART=index,"mode","address","port"" .
  • index указывает порядковый номер подключения, может принимать значения от 0 до 7.
  • mode определяет протокол, который будет использоваться соединением. Может быть «TCP» или «UDP».
  • address задает адрес сервера. Если при настройке были указаны DNS-сервера, то можно использовать как IP-адрес, так и доменное имя.
  • port задает порт сервера, с которым будет устанавливаться соединение.
Замечу, что при использовании протокола UDP по умолчанию датаграммы будут отсылаться и приниматься только с одного адреса. Для того, чтобы использовать UDP на полную катушку и отсылать/принимать данные с любых адресов, можно использовать так называемый расширенный режим UDP, настраиваемый командой "AT+CIPUDPMODE" . За подробностями отсылаю к документации.

В ответ на команду можно получить несколько вариантов ответов. Если все хорошо, то после стандартного "OK" через небольшой промежуток времени можно получить один из трех ответов:

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

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

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

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

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

Прием данных

Как только GSM-модуль принимает данные, он сигнализирует об этом, посылая в последовательный порт строку вида "+CIPRXGET:1,index\r\n" . Я честно не знаю, что означает единица, ибо данная функция модуля документирована достаточно слабо, но у меня она фигурирует во всех сообщениях о приеме пакета.

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

Так вот, принимать данные можно командой "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-модулем, изложенные выше, можно применить и к модулям других моделей, а, возможно, и производителей.

Обзор платы GSM/GPRS SIM900 Shield

Плата Arduino GPRS/GSM Shield (рисунок 1) предоставляет нам возможность использовать для удаленного приема и передачи данных мобильной GSM-связи. Осуществить это можно тремя способами:

    используя отправку/прием коротких текстовых сообщений (SMS);

    отправкой голосовых (аудио) команд на основе технологий CSD (стандартная технология передачи данных в сети GSM) и/или DTMF (двухтональный многочастотный аналоговый сигнал, используемый для набора телефонного номера);

    используя пакетную передачу данных на основе технологии GPRS.

    Плата построена на базе модуля SIMCom SIM900.

Также на ней расположены:

    слот для SIM-карты;

    джек 3,5 мм для аудио-входа и выхода;

    разъём для внешней антенны.

Общение с платой производится через serial-соединение с помощью набора AT-команд. С помощью перемычек на плате возможно установить используемые для коммуникации контакты: аппаратные 0- 1-й или 2-3 (на некоторых платах) 7- 8-й для работы через SoftwareSerial.

Рисунок 1. GPS GPRS shield.

Плату GSM GPRS SIM900 Shield можно включить двумя способами:

    аппаратным (нажатие кнопки PWRKEY);

    программным.

Подключение к плате Arduino

Плата GSM GPRS SIM900 Shield сделана в формате шилда для плат Ардуино. Контакты шилда (гребенки) легко вставляются в разъемы платы, образуя при этом "бутерброд" (рисунок 2).


Рисунок 2. Установка GPS GPRS shield на плату Arduino.

Управление модулем GSM GPRS SIM900 с помощью AT-команд

Рассмотрим управление модулем GSM GPRS shield с помощью AT-команд. Для этого установим модуль на и подключим её к компьютеру. Arduino-скетч отправки и получения данных между компьютером и модулем GSM GPRS shield через плату показан в листинге 1.


Листинг 1

#include

// создание объекта

SoftwareSerial grs(7, 8); // RX, TX

// скорость обмена

#define GSMbaud 9600

Serial.begin(9600);

gsm.begin(GSMbaud);

Serial.println("Start");

if (Serial.available()) {

str1 = Serial.readStringUntil("\n");

str1.toCharArray(buffer, hh.length() + 1);

gsm.write(buffer);

gsm.board.write("\n");

if (gsm.available()) {

Serial.write(gprs.read());

Загружаем скетч на плату ардуино, открываем монитор последовательного порта и набираем команды установки режима:

Команда проверки подключения модуля к GPRS-сети, которую при ответе COMMAND NO RESPONSE необходимо постоянно повторять

Подключаемся к точке доступа оператора связи. Для Билайн:

AT + CGDCONT = 1, "IP", "internet.beeline.ru"

AT + CSTT = "internet.beeline.ru","", ""

Установка интернет-соединения:

AT + CGACT = 1,1

Обращение к интернет-ресурсу

Весь процесс подключения представлен на рисунке 3.


Рисунок 3. Процесс работы с модулем GSM GPRS SIM800 в мониторе последовательного порта.

Пример отправки sms-сообщений с платы Arduino

Рассмотрим пример использования отправки sms-сообщений при уменьшении температуры воздуха в помещении ниже определенного значения. Нам потребуются следующие детали:

    модуль GSM GPRS Shield – 1 шт;

    sim-карта сотового оператора с положительным балансом;

    блок питания 12В – 1 шт;

Схема подключения показана на рисунке 4.


Рисунок 4. Схема подключения для отправки sms-сообщений при низких значениях температуры воздуха.

Приступим к написанию скетча. Каждые 30 секунд получаем данные влажности и температуры с датчика DHT11. Используем библиотеку DHT. При значении температуры ниже критического отправляем sms на номер указанный в константе PHONE. И делаем паузу на 10 минут.

Содержимое скетча показано в листинге 2.


Листинг 2

// подключение библиотек

#include

#include "DHT.h"

// телефон для отправки sms

#define PHONE_NUMBER "+7928222222"

// создание объектов

SoftwareSerial gsm(7, 8);

DHT sensorDHT(2, DHT22);

// пороговое значение температуры

#define TEMPP 18

unsigned long millissend;

// запуск последовательного порта

Serial.begin(9600);

// запуск датчика DHT

sensorDHT.begin();

// запуск SoftwareSerial

gsm.begin(9600);

if (millis()-millissend>30*1000) { // показания каждые 30 секунд?

// получение данных с датчика DHT

int h = sensorDHT.readHumidity();

int t = sensorDHT.readTemperature();

if(t

// отправить sms

// ждем 10 минут

delay(10*60*1000);

millissend=millis();

// отправка sms

void SendSMS(int t) {

// установка text mode

gsm.print("AT+CMGF=1\r");

// телефон

gsm.println(PHONE_NUMBER);

gsm.println("\"");

// отправить данные t

// окончание передачи

gsm.println((char)26);

Загружаем скетч, проверяем событие прихода sms-сообщения на выбранный номер телефона при критическом значении температуры.


Рисунок 5. Схема в сборе.

Создадим прошивку получения данных при отправке sms-сообщения на sim-карту, находящийся в модуле GSM GPRS shield. Содержимое скетча показано в листинге 3.


Листинг 3

// подключение библиотек

#include

#include "DHT.h"

// создание объектов

SoftwareSerial gsm(7, 8);

DHT sensorDHT(2, DHT22);

// переменные

String phone = ""

String str1 = ""; //

boolean isSMS = false;

// подключение последовательного порта

Serial.begin(9600);

// запуск датчика DHT

// запуск SoftwareSerial

gsm.begin(9600);

// Настройка приёма сообщений

gsm.print("AT+CMGF=1\r");

gsm.print("AT+IFC=1, 1\r");

gsm.print("AT+CPBS=\"SM\"\r");

gsm.print("AT+CNMI=1,2,2,1,0\r");

if (gsm.available()) {

char c = gsm.read();

if ("\r" == c) {

if (isSMS) { // текущая строка - sms-сообщение,

if (!str1.compareTo("tmp")) { // текст sms - tmp

// отправить sms на приходящий номер

// получение данных

int t = dht.readTemperature();

// AT-команда установки text mode

gsm.print("AT+CMGF=1\r");

// номер телефона получателя

gsm.println("AT + CMGS = \"");

gsm.println(phone);

gsm.println("\"");

// сообщение – данные температуры

// окончание передачи

gsm.println((char)26);

Serial.println(currStr);

if (str1.startsWith("+CMT")) {

Serial.println(str1);

// выделить из сообщения номер телефона

phone=str1.substring(7,19);

Serial.println(phone);

// если текущая строка начинается с "+CMT",

// то следующая строка является сообщением

else if ("\n" != c) {

str1 += String(c);

Загружаем скетч на плату, отправляем sms-сообщение с текстом tmp на sim-карту и получаем в ответ sms-сообщение с данными температуры.

Часто задаваемые вопросы FAQ

1. Нет связи с Arduino по последовательному порту.

    Проверьте питание платы.

    Проверьте правильность установки перемычек.

2. Не отправляются sms-сообщения

    Проверьте наличие внешнего питание GSM GPRS shield.

    Проверьте баланс sim-карты.