Соединение gsm модуля sim900 с arduino uno. Освоение GSM на базе модуля SIM900D

GSM модуль представляет собой устройство, для (удаленного) управления выходом реле, установленного на плате. На плате расположен слот для СИМ карты. Основное предназначение - управление воротами, шлагбаумом, рольставнями.

Как работает GSM контроллер?

У любого GSM контроллера есть своя база данных, в которой хранятся разрешенные номера. Так же GSM модуль имеет собственный номер (номер сим карты), который установлен в него. Если ваш номер записан в базу данных контроллера, то при осуществлении звонка на него, реле на плате замкнется на 1 секунду, тем самым даст команду на открытие исполнительному устройству (ворота, шлагбаум). Если вашего номера нет в базе данных, то вы будете слышать обычные гудки в трубку, шлагбаум не откроется.

Как добавить/удалить номер в GSM контроллер?

В зависимости от модели контроллера, к нему идет свой софт для ПК или смартфона, а так же свои команды добавления и удаления номера через SMS. Удобнее всего использовать ПК для добавления номеров. Это позволяет создать базу данных номеров на компьютере, а затем загрузить её через USB кабель в контроллер. Существуют GSM контроллеры со своим облачным сервисом. Что это значит? Облачный сервис позволяет добавлять и удалять номера через интернет, без подключения USB кабеля к нему. Это очень удобно, но имеется один минус, - СИМ карта будет расходовать интернет трафик.

Как подключить GSM контроллер?

Подключение у всех модулей практически одинаковое. На плате имеется клеммная колодка для подключения питания 12-24 Вольт, колодка релейного выхода NO - COM (нормально разомкнутый режим), к которой подключается кабель от управляющих контактов платы. Питание на GSM модуль обычно берут с платы управления автоматики, например у Doorhan, AN motors, на плате есть колодки на которых 12 Вольт. У BFT, Came - 24 Вольта.

Какой тариф выбрать для GSM контроллера?

Чаще всего мы рекомендуем тариф без абонентской платы. Прежде чем покупать СИМ карту, необходимо определить, у какого оператора лучше качество связи на конкретном объекте. Для GSM контроллеров использующих мобильные данные, рекомендуем подключать пакет трафика интернета, такие как ELDES Esim 320. Который работает через интернет.

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

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

Область применения

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

Пример использования данных модулей на видео:

Назначение

Аппаратная платформа Arduino обеспечивает возможным эффективно взаимодействовать с контролируемой средой через широкий спектр функциональных датчиков, которые могут контролировать различные параметры. Благодаря этому на базе такого рода платформ можно формировать охранные комплексы, которые будут следить за перемещениями по охраняемому периметру, за вскрытием окон и дверей, за повреждением стекол. Кроме датчиков охранного типа можно применять также и температурные сенсоры, датчики контроля за утечкой воды или газа.

Используя с платформой Ардуино GSM модуль информацию об опасности или внештатной ситуации на объекте можно предать владельцу максимально быстро. Для этой цели используется одна из сетей мобильных операторов.

Отличительной особенностью устройств Arduino является то, что их микроконтроллер может программироваться самим пользователем, используя язык Arduino, основанный на Wiring. Благодаря этому каждый может программировать алгоритм работы создаваемой охранной сигнализации так, как это требуется для конкретного охраняемого объекта и особенностей его применения.

Преимущества использования

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

  1. Небольшая стоимость. Платформы являются достаточно дешевыми устройствами по сравнению с аналогами, что никоим образом не отражается на их функциональности.
  2. Кросс-платформенность. Софт Arduino эффективно работает под такими операционными платформами, как Windows, Linux, Macintosh-OSX.
  3. Простота программирования. Для настройки микроконтроллеров используется среда программирования Processing. Она оптимально подойдет как профессиональным, так и малоопытным пользователям, которые работают с устройствами Arduino.
  4. Возможность усовершенствования. Специализированный софт Arduino отличается открытым кодом, что позволяет опытным пользователям его адаптировать под конкретные требования.

Высокая надежность аппаратной платформы. Платы Arduino выпускаются с микроконтроллерами ATMEGA8 и ATMEGA168 (более ранние модели) и с контроллерами ATmega32u4, Atmel ATmega328 (новые модели), которые отличаются высокой функциональностью и надежностью.

Принцип работы

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

В GSM-плате применяется специальный радиомодем M10, взаимодействие с которым обеспечивается за счет специальных AT-команд. Обмен информацией с модемом реализован с помощью программного последовательного интерфейса, владеющего цифровыми кодами.

Используемый в Ардуино GSM модем является 4-диапазонным, который может функционировать на следующих частотах: GSM 850MHz и 900MHz, PCS1900MHz и DCS1800MHz. В модеме реализована поддержка таких протоколов, как TCP/UDP и HTTP, обеспечивающих соединения через GPRS. Скорость передачи информационных пакетов в таком режиме будет составлять около 90 кбит/сек.

Отправка СМС через Arduino и GSM модуль реализуется при наличии установленной SIM-карты одного из сотовых операторов.»

Кроме этого появится возможность осуществлять передачу голосовых сообщений, совершать звонки – для этого дополнительно нужен микрофон и внешний динамик. Установка SIM-карты позволит использовать Arduino в режиме сотовой связи или GPRS.

Как подключать модули к ардуино

Перед тем, как подключить GSM модуль к Ардуино в его слот для следует установить подходящего типоразмера «симку» одного из операторов сотовой связи. После этого модуль подсоединяется к аппаратной платформе Arduino в соответствии с инструкцией и производится ее прошивка. Для этой цели используется ПК, который подключается к устройству с помощью USB-кабеля. После загрузки среды Arduino следует нажать клавишу Upload, что запустит процесс загрузки софта. По завершению этого процесса платформа может отсоединяться от компьютера и питаться от внешней системы питания.

Сравнительные характеристики GSM модулей

На потребительском рынке представлен широкий выбор различных GSM модулей под Arduino. Ниже приведены основные характеристики наиболее популярных.

Neoway M590

Ардуино GSM модуль M590 является беспроводным коммуникационным устройством, используемым в целях приема и передачи информации в сетях мобильной связи. Модуль этой серии создан на плате с минимальной обвязкой и позиционируется как GSM-модуль для аппаратной платформы Arduino.

С помощью этого устройства можно устанавливать мобильную связь с внешним телефоном, отправлять СМС-сообщения, производить обмен информацией по стандарту GPRS Class-10. В модуле этой конструкции нет микрофонного входа, что ограничивает возможность осуществления приема голосовой связи – соединение может устанавливаться, но звук передаваться не будет.

Для управления M590 используются АТ-команды, которые подаются посредством последовательной связи. В качестве рабочих радиочастот применяются частоты от 900 МГц до 1800 МГц. Величина питающего напряжения составляет в пределах 3,3…5 В. Поэтому GSM модуль Neoway M590 подключение к Ардуино осуществляет через специальный преобразователь напряжений 5 В « 3,3 В.

GSM-модуль SIM800L

Компактный Sim800l GPRS GSM модуль относится к устройствам, которые применяются для поддержки мобильной связи. Модуль построен на безе SIM-800L, созданного SIMCom Wireless Solutions и рассчитан для предоставления услуг к сервисам информационных сетей GPRS\GSM, используя для этого частоты от 850 МГц до 1900 МГц. С его помощью может осуществляться отправка SMS-сообщений, реализация звонков, а также обмен информацией по GPRS-каналам.

GSM-модуль комплектуется антенной, при потребности улучшения уровня сигнала можно использовать дополнительные антенны. Для управления модулем может использоваться ПК, подключаемый посредством специальной платы преобразования интерфейсов USB-UART либо же непосредственно через сам UART. Если используется Sim800l GPRS GSM модуль, подключение к Ардуино должно реализовываться через преобразователь логических уровней. Это обусловлено тем, что у SIM800L величина напряжения на логическом высоком уровне составляет 2,8 В, а в Arduino – 3,3…5 В.

GPRS Shield от Seeed Studio

Подключение GSM модуля к Arduino обеспечит возможность использования технологий обмена данными GSM/GPRS, а также совершать звонки и посылать СМС-сообщения. Устройства этого типа построены с использованием модуля SIMCom SIM900. Они имеют слот для установки SIM-карты, разъем для подключения внешней антенны, набор 3,5-миллиметровых джеков для аудио входа и выхода. Управление и работа с Arduino GSM Shield осуществляется посредством Serial-соединений и набора специализированных AT-команд.

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

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

Добрый день! Опять мультиобзор китайских электронных компонентов, как обычно обо всём понемногу, постараюсь покороче, но получится ли? Итак, встречайте, GSM сигнализация стоимостью до 700 ₽. Интересно? Прошу под «cut»!

Приступим! Перед началом рекомендую заглянуть в этот , меньше компонентов и большая автономность. Итак, «техзадание», основные требования к сигнализации:

1) Оповещать при срабатывании датчиков.
2) В случае отключения питания должна быть предусмотрена некоторая автономность.
3) Управление сигнализацией через sms и звонки.

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

Перечень того что понадобится:

Список изменений

GSM_03_12_2016-14-38.hex - исправлена работа устройства с модемом M590.
GSM_05_12_2016-13-45.hex - добавлена консольная команда memtest, оптимизация использования оперативной памяти.
GSM_2016_12_06-15-43.hex - добавлен вывод результатов команд в консоль, оптимизация памяти. Занято: 49% SRAM.
GSM_2016_12_07-10-59.hex - теперь телефонные номера добавляются и удаляются правильно. Занято: 49% SRAM, 74% Flash Memory.
GSM_2016_12_07-15-38.hex - добавлена возможность подключения датчика движения , подключается к пину A0 (в данном случае пин A0 используется как цифровой). Добавлены смс - команды PIROn , PIROff . Занято: 48% SRAM, 76% Flash Memory.
GSM_2016_12_08-13-53.hex - Теперь после успешного выполнения команды, которая в ответ не отправляет смс сообщение, устройство однократно мигает синим светодиодом. Теперь после некорректного выполнения команды, которая в ответ не отправляет смс сообщение, устройство дважды мигает синим светодиодом. Теперь после инициализации параметров устройства, если включен «тихий» режим (SendSms = 0), устройство в течение 2 секунд часто мигает синим светодиодом. Исправлена ошибка из-за которой номер не всегда удалялся из памяти командой DeletePhone. Занято: 48% SRAM, 78% Flash Memory.
GSM_2016_12_11-09-12.hex - Добавлены консольные команды AddPhone и DeletePhone, синтаксис аналогичен смс-командам. Оптимизация памяти. Занято: 43% SRAM, 79% Flash Memory.
GSM_2017_01_03-22-51.hex - Реализована поддержка и ему подобных расширителей портов ввода/вывода на чипе PCF8574, для подключения дополнительных 8 датчиков, в том числе герконов. Автоматический поиск адреса и автоматическая настройка модуля. Стандартные названия датчиков и логический уровень их срабатывания изменяется с помощью команды EditSensor. Изменены содержания тревожных смс для основного датчика (пин D0) «Alarm! Main sensor!» и датчика движения (пин A0) «Alarm! PIR sensor!». Добавлены команды EditSensor и I2CScan. Занято: 66% SRAM, 92% Flash Memory.
GSM_2017_01_15-23-26.hex - Поддержка модема A6_Mini. Контроль наличия внешнего питания (пин D7). Добавлены смс команды WatchPowerOn, WatchPowerOff. Добавлены консольные команды ListConfig, ListSensor. Теперь смс команда EditSensor работает правильно. Незначительно «урезан» вывод отладочной информации в монитор порта. Занято: 66% SRAM, 95% Flash Memory.
GSM_2017_01_16-23-54.hex - Теперь в ответном сообщении на смс команду «Info» так же сообщается состояние датчика движения. Исправлена ошибка из-за которой иногда отправлялись пустые ответные смс сообщения. Теперь устройство оповещает не только об отключении, но и о возобновлении внешнего питания. Все модемы стали «меньше болтать», теперь в мониторе порта стало немного чище. Занято: 66% SRAM, 95% Flash Memory.
GSM_2017_02_04-20-23.hex - Исправлена ошибка «Watch the power on». Теперь после снятия с охраны, выключается «тревожный пин». Теперь после удаления номера в консоль выводится правильная информация. Возможно исправлена ошибка из-за которой иногда отправлялись пустые ответные смс сообщения. Занято: 66% SRAM, 90% Flash Memory.
GSM_2017_02_14-00-03.hex - Теперь по умолчанию отправляются смс сообщения, параметр SendSms снова равен 1. Теперь при замыкании контактов основного герконового датчика (закрытии двери) устройство мигает синим светодиодом в течение 2 секунд, сигнализируя о нормальной работе датчика. Занято: 66% SRAM, 90% Flash Memory.
GSM_2017_03_01-23-37.hex - Команда WatchPowerOn удалена. Добавлена консольная команда WatchPowerOff, идентична смс команде. Добавлены команды WatchPowerOn1, WatchPowerOn2. WatchPowerOn1 - мониторинг внешнего питания включен если сигнализация поставлена на охрану, WatchPowerOn2 - мониторинг внешнего питания включен всегда. Реализована функция постановки на охрану и снятия с охраны внешними устройствами, для этого используются выводы A1(D15) и A2(D16). Сигнализация ставит/снимает охрану при появлении на выводе A1(D15) высокого уровня +5В или на выводе A2(D16) низкого уровня GND. Вывод A1(D15) подтягивается к GND, вывод A2(D16) подтягивается к +5V через резисторы 20 (10) кОм. Добавлены команды GuardButtonOn и GuardButtonOff. Теперь после постановки на охрану мигает красный светодиод, пока не будет проверена целостность контура основного герконового датчика. Если контур целый загорается красный светодиод. Занято: 66% SRAM, 95% Flash Memory.
GSM_2017_03_12-20-04.hex - Теперь в консоли стало ещё чище, но если включен тестовый режим «TestOn», то в консоль выводится дополнительная информация. Исправлен баг «Sent!», теперь в консоль правильно выводится информация об отправке сообщений. Исправлен баг «повторного ложного вызова». Теперь запрос баланса должен работать корректно на всех модемах. Занято: 67% SRAM, 95% Flash Memory.
GSM_2017_04_16-12-00.hex - Исправлен . Теперь команды Info и Money всегда будут присылать ответное смс. Команда GuardButtonOn заменена командами GuardButtonOn1 и GuardButtonOn2. Занято: 67% SRAM, 99% Flash Memory.
GSM_2017_04_21-09-43.hex - не рекомендуется к использованию, только в качестве тестирования, спасибо за выявленные ошибки:) - Теперь параметр sendsms не влияет на отправку смс сообщений мониторинга электросети. Добавлена смс команда DelayBeforeGuard отвечающая за задержку при постановке на охрану, значение не может превышать 255 секунд. Добавлена смс команда DelayBeforeAlarm отвечающая за задержку отправки уведомлений и включение «тревожного пина» при срабатывании датчиков, значение не может превышать 255 секунд. Удалены команды ClearSMS, теперь сообщения удаляются автоматически после получения. Занято: 68% SRAM, 100% Flash Memory.
GSM_2017_04_22-20-42.hex - Исправлены множественные ошибки. Команды ClearSMS снова присутствуют в прошивке. Оптимизация памяти. Занято: 68% SRAM, 98% Flash Memory.
GSM_2017_04_23-17-50.hex - Теперь запрос баланса должен работать корректно на всех модемах. Постановка и снятие с охраны внешними устройствами теперь работает правильно. Ответные сообщения смс команды Info не должны быть пустыми. Оптимизация памяти. Занято: 68% SRAM, 98% Flash Memory.
GSM_2017_04_24-13-22.hex - Теперь передача консольных команд в GSM модуль производится только если включен тестовый режим. Теперь нет разделения на смс команды и консольные команды, все существующие команды можно передавать как через смс, так и через консоль. Возможно исправлен баг с командой Info. Оптимизация памяти. Занято: 68% SRAM, 94% Flash Memory.
GSM_2017_04_25-20-54.hex - Исправлен баг при котором команда ListConfig меняла значение последнего события. Теперь при вводе команд через косоль не отправляются ненужные смс сообщения. Возможно исправлен баг с командой Info. Оптимизация памяти. Занято: 66% SRAM, 94% Flash Memory.
GSM_2017_04_30-12-57.hex - Временно включён вывод дополнительной информации в консоль при отправке смс сообщений и формировании ответа на команду Info. Возможно исправлен баг с командой Info. Оптимизация памяти. Занято: 66% SRAM, 92% Flash Memory.
GSM_2017_05_06-11-52.hex - Исправлен с функцией DelayBeforeAlarm. Занято: 66% SRAM, 93% Flash Memory.
GSM_2017_05_23-21-27.hex - Незначительно изменён вывод информации в консоль. Добавлена поддержка модулей расширения портов на PCF8574A c адресами от 0x38 до 0x3f включительно. Исправлен баг c . Теперь устройство перезагружается автоматически после команд FullReset, ResetConfig, ResetPhone и в случае успешного выполнения команды MemTest. Добавлена команда WatchPowerTime. Теперь возможно установить время, по истечении которого будет отправлено смс сообщение об отключении внешнего источника питания. Занято: 67% SRAM, 94% Flash Memory.
GSM_2017_05_26-20-22.hex - Исправлена инициализация памяти датчиков платы расширения. Изменён синтаксис команды AddPhone. Добавлена команда EditMainPhone. Изменен принцип работы системы уведомлений, при срабатывании датчика сначала будут отправлены sms сообщения, после чего будут совершены голосовые вызовы. Тревожные sms сообщения будут отправлены на телефонные номера с признаком «S» (SMS). Голосовые вызовы будут совершены на номера с признаком «R» (Ring). Сообщения об отключении/включении внешнего источника питания будут отправлены на телефонные номера с признаком «P» (Power). Добавлена команда RingTime. Теперь возможно установить длительность тревожного голосового вызова, параметр может иметь значение от 10 до 255 секунд. Теперь команда RingOn/RingOff глобально включает/отключает оповещение голосовыми вызовами. Добавлена команда ResetSensor. Занято: 68% SRAM, 99% Flash Memory.
GSM_2017_06_02-17-43.hex - Командам AddPhone и EditMainPhone добавлен параметр «I» (Info), отвечающий за sms уведомление о постановке или снятии устройства с охраны. Теперь после добавления основного номера устройство автоматически перезагружается. Теперь можно вносить в память устройства одинаковые номера. При добавлении второго и последующих дублирующихся номеров с них автоматически будут сняты атрибуты «M», «S», «P» и «I». Эти номера будут использованы для повторного голосового вызова при срабатывании датчиков. Исправлен баг кривого вывода в консоль после выполнения команды AddPhone, теперь информация не выводится автоматически после добавления номера. Добавлена команда Reboot. Занято: 69% SRAM, 99% Flash Memory.
GSM_2017_06_11-00-07.hex - Теперь вновь при замыкании контактов основного герконового датчика (закрытии двери) устройство мигает синим светодиодом в течение 2 секунд, сигнализируя о нормальной работе датчика, при этом не учитывается поставлено или снято устройство с охраны. Команды RingOn/RingOff удалены. Теперь устройство можно снять с охраны во время тревожного вызова, теперь они совершаются в фоновом режиме. Занято: 69% SRAM, 99% Flash Memory.
GSM_2017_07_04-21-52.hex - Теперь команда Pause не присылает ответное смс. Удалены команды TestOn и TestOff. У всех номеров удалён признак Management. Занято: 68% SRAM, 96% Flash Memory.
GSM_2017_07_24-12-02.hex - Добавлены команды ReedSwitchOn/ReedSwitchOff для мониторинга основного герконовго датчика, теперь его можно включать/отключать так же как и датчик движения. Исправлен баг команды Info. Команды TestOn и TestOff снова присутствуют в прошивке. Занято: 68% SRAM, 96% Flash Memory.
GSM_2017_07_26-10-03.hex - Добавлена команда ModemID. Автоматическое определение модема осуществляется только если значение этого параметра равно 0. После установки значения параметра равным 0 производится автоматическая перезагрузка устройства. Занято: 68% SRAM, 98% Flash Memory.
GSM_2017_08_03-22-03.hex - Теперь сигнализация может управлять внешними устройствами. Для управления используется аналоговый выход A3 (D17 - используется как цифровой). Логический уровень выхода (+5В или GND) может быть изменен, после изменения уровня через команду настройки устройство автоматически будет перезагружено. Длительность сигнала управления внешним устройством может быть изменена. Добавлены команды ExtDeviceLevelLow, ExtDeviceLevelHigh, ExtDeviceTime, Open. Некоторые изменения в логике работы команд управления. Оптимизация памяти. Занято: 68% SRAM, 99% Flash Memory.
GSM_2017_08_10-12-17.hex - Удалены команды SmsOn/SmsOff, ReedSwitchOn/ReedSwitchOff, PIROn/PIROff и всё что с ними связано. Команда DelayBeforeAlarm заменена расширенными командами. Изменён вывод команды Info. Оптимизирован вывод команды ListConfig в консоль. Теперь к пинам D6 и A0 могут быть подключены любые цифровые датчики с высоким или низким уровнем срабатывания, в том числе герконы. Пины D6 и A0 должны быть притянуты к земле (GND) через сопротивление 10 (20) кОм. Если датчик настроен на низкий уровень срабатывания (включен в режиме геркона), то проверяется целостность цепи. Логический уровень срабатывания по входам D6 и A0 (+5В или GND) может быть изменен, после изменения логического уровня устройство автоматически будет перезагружено. Для каждого из датчиков (main, second, PCF-платы расширения) при срабатывании может быть установлено своё время по истечение которого будет осуществлено уведомление (смс и/или голосовой вызов). «PIR Sensor» переименован в «Second sensor». Исправлена работа платы расширения, ошибка из-за которой устройство всегда уведомляло о срабатывании датчиков, вне зависимости от того поставлено устройство на охрану или нет. Теперь можно выбрать режим работы при котором устройство может мониторить датчики платы расширения как во включенном режиме охраны (GuardOn), так и при выключенном режиме (GuardOff). Добавлены команды PCFForceOn/PCFForceOff, MainSensorLevelHigh/MainSensorLevelLow/MainSensorLevelOff, SecondSensorLevelHigh/SecondSensorLevelLow/SecondSensorLevelOff, MainDelayBeforeAlarm, SecondDelayBeforeAlarm, PCFDelayBeforeAlarm. Занято: 68% SRAM, 99% Flash Memory.

*Последующие версии прошивок включают в себя изменения предыдущих версий.


Используемые порты Arduino Nano v3

D4 - выход «тревожного» пина, при срабатывании датчика на этом пине устанавливается сигнал высокого уровня
D5 - инверсный выход «тревожного» пина, при срабатывании датчика на этом пине устанавливается сигнал низкого уровня

D6 - герконовый датчик. Начиная с версии GSM_2017_08_10-12-17.hex к пину D6 могут быть подключены любые цифровые датчики с высоким или низким уровнем срабатывания, в том числе герконы. Пин D6 должен быть притянут к земле (GND) через сопротивление 10 (20) кОм.
D7 - подключен к делителю напряжения от внешнего источника питания +5В. Верхнее плечо 2,2 кОм, нижнее 3,3 кОм.

Делитель напряжения


D8 - модем TX
D9 - модем RX

D10 - красный светодиод
D11 - синий светодиод
D12 - зеленый светодиод

Подключение периферии:
A0 - датчик движения . Начиная с версии GSM_2017_08_10-12-17.hex к пину A0 могут быть подключены любые цифровые датчики с высоким или низким уровнем срабатывания, в том числе герконы. Пин A0 должен быть притянут к земле (GND) через сопротивление 10 (20) кОм.

A1 - Вход для внешнего управления. Сигнализация ставит/снимает охрану при появлении на входе высокого уровня +5В.
A2 - Инверсный вход для внешнего управления. Сигнализация ставит/снимает охрану при появлении на входе низкого уровня GND.

A3 - Настраиваемый (+5В или GND) выход для управления внешними устройствами. При поступлении команды управления значение на этом выходе изменяется в зависимости от того какое было установлено на установленный промежуток времени.

A4 - SDA I2C
A5 - SLC I2C
, для подключения дополнительных 8 датчиков.


Команды управления для hex - прошивки

Внимание! Команды выделенные жирным шрифтом могут быть выполнены только с основного номера, так как отвечают за конфигурацию устройства. Остальные команды могут быть выполнены с номеров с признаком «Management».

SMS - команды управления не чувствительны к регистру :
AddPhone - Добавить номер телефона. Всего может быть добавлено не более 9 номеров + 1 основной номер который автоматически сохраняется в память при первом звонке на устройство после сброса на заводские установки командами ResetPhone или FullReset . Т.е. кто первый позвонил на устройство после его сброска на заводские установки тот и и «главный», этот номер заносится в первую ячейку памяти и его невозможно изменить или удалить через смс. Возможно добавить два одинаковых номера, но тогда у номера дубликата автоматически остаётся только признак «r» - исключительно для повторного голосового вызова.
Пример команды:



Синтаксис команды:

AddPhone - команда
: - разделитель
5 - записать в пятую ячейку памяти
+71234567890 - номер телефона
До версии GSM_2017_05_26-20-22.hex:
а - Параметр «Alarm» - на номера с этим параметром будут отправляться смс - сообщения о срабатывании сигнализации и сообщения постановке или снятии с охраны.
Начиная с версии GSM_2017_05_26-20-22.hex:
m - Параметр «Management» - разрешено управление сигнализацией
s - Параметр «SMS» - будет отправлено sms сообщение при срабатывании датчиков
r - Параметр «Ring» - будет совершен голосовой вызов при срабатывании датчиков
p - Параметр «Power» - будет отправлено sms сообщение при включении/отключении внешнего питания
i - Параметр «Info» - будет отправлено sms сообщение при постановке или снятии с охраны
При отсутствии параметров «m», «s», «r», «p»,«i» телефон заносится в память, но никак не используется.


DeletePhone - Удалить номер телефона.
Пример команды:

Синтаксис команды:

DeletePhone - команда
: - разделитель
+71234567891 - номер телефона


EditMainPhone - Изменить параметры «s», «r», «p», «i» основного телефона, этот номер занесён в первую ячейку памяти.
Пример команды:

Синтаксис команды:

EditMainPhone - команда
: - разделитель
srpi - параметры


BalanceNum - Изменение номера запроса баланса и обработка длины ответа запроса. Значение по умолчанию для Beeline: #100#L22.
Пример команды:

Синтаксис команды:

BalanceNum - команда
: - разделитель
#103# - номер запроса баланса
L24 - Длина (len) пересылаемого ответа 24 символа, обрезаем спам из запроса баланса.


EditSensor - Изменить название датчика и логический уровень срабатывания. Всего может быть не более 8 дополнительных датчиков. После изменения параметров необходима перезагрузка устройства.
Пример команды:
EditSensor:1+Datchik dvizheniya v koridore#h

Синтаксис команды:

EditSensor - команда
: - разделитель
1 - записать в первую ячейку памяти
+ - разделитель
Datchik dvizheniya v koridore - название датчика, не может превышать 36 символов, включая пробелы.
#h - Признак высокого логического уровня с датчика, при получении которого сработает сигнализация. Если отсутствует "#h", сигнализация будет срабатывать при получении с датчика низкого логического уровня.


SleepTime - Время «засыпания» сигнализации при получении смс - команды «Pause», указывается в минутах. Значение по умолчанию: 15, не может быть менее 1 и более 60.
Пример команды:

Синтаксис команды:

SleepTime - команда
: - разделитель
20 - 20 минут «сна».


AlarmPinTime - Время на которое включается/выключается тревожный/инверсный пин, указывается в секундах. Значение по умолчанию: 60, не может быть менее 1 секунды и более 43200 секунд (12 часов).
Пример команды:

Синтаксис команды:

AlarmPinTime - команда
: - разделитель
30 - 30 секунд включения/выключения тревожного пина.


DelayBeforeGuard - Время до постановки устройства на охрану, после получения соответствующей команды.
Пример команды:

Синтаксис команды:

DelayBeforeGuard - команда
: - разделитель
25 - 25 секунд до постановки на охрану


DelayBeforeAlarm - Время по истечении которого будет отправлено «тревожное» смс уведомление, если за этот период времени сигнализация не была снята с охраны. Заменена расширенными командами начиная с версии GSM_2017_08_10-12-17.hex
Пример команды:

Синтаксис команды:

DelayBeforeAlarm - команда
: - разделитель
40 - 40 секунд до отправки «тревожного» уведомления


WatchPowerTime - Время в минутах по истечении которого будет отправлено смс сообщение об отключении внешнего источника питания. Если внешнее питание будет восстановлено до истечения установленного времени, то сообщение не будет отправлено.
Пример команды:

Синтаксис команды:

WatchPowerTime - команда
: - разделитель
5 - 5 минут до отправки смс сообщения


RingTime - Длительность тревожного голосового вызова, параметр может иметь значение от 10 до 255 секунд.
Пример команды:

Синтаксис команды:

RingTime - команда
: - разделитель
40 - 40 длительность вызова составит 40 секунд, после чего будет вызван следующий абонент.


ModemID - Принудительная установка модели используемого модема. Возможные значения: 0 - автоопределение модема, 1 - M590, 2 - SIM800l, 3 - A6_Mini.
Пример команды:

Синтаксис команды:

ModemID - команда
: - разделитель
2 - ID модема.


ExtDeviceTime - Количество секунд на которое изменится уровень сигнала на выходе управления внешним устройством.
Пример команды:

Синтаксис команды:

ExtDeviceTime- команда
: - разделитель
5 - 5 секунд


ExtDeviceLevelLow - Внешнее устройство подключенное к выходу A3 управляется низким уровнем сигнала (GND). На выходе по умолчанию будет присутствовать высокий уровень +5В, пока не поступит команда управления внешним устройством
ExtDeviceLevelHigh - Внешнее устройство подключенное к выходу A3 управляется высоким уровнем сигнала (+5V). На выходе по умолчанию будет присутствовать низкий уровень GND, пока не поступит команда управления внешним устройством

ResetSensor - сброс параметров датчиков расширителя порта

ResetConfig - сброс настроек на заводские установки

ResetPhone - удаление из памяти всех телефонных номеров

FullReset - сброс настроек, удаление из памяти всех телефонных номеров, восстановление значения по умолчанию команды BalanceNum.

RingOn - включить уведомление звонком на «главный» номер записанный в первую ячейку памяти при срабатывании датчика. Удалена начиная с версии GSM_2017_06_11-00-07.hex
RingOff - выключить уведомление звонком при срабатывании датчика. Удалена начиная с версии GSM_2017_06_11-00-07.hex

SmsOn - включить sms-уведомление при срабатывании датчика. Удалена начиная с версии GSM_2017_08_10-12-17.hex
SmsOff - выключить sms-уведомление при срабатывании датчика. Удалена начиная с версии GSM_2017_08_10-12-17.hex

PIROn - включить обработку датчика движения
PIROff - выключить обработку датчика движения

ReedSwitchOn - включить обработку основного герконового датчика
ReedSwitchOff - выключить обработку основного герконового датчика

WatchPowerOn - включить контроль внешнего питания, смс сообщение об отключении внешнего питания будет отправлено при условии что сигнализация поставлена на охрану. Удалена начиная с версии GSM_2017_03_01-23-37.

WatchPowerOn1 - включить контроль внешнего питания, смс сообщение об отключении внешнего питания будет отправлено при условии что сигнализация поставлена на охрану.
WatchPowerOn2 - включить контроль внешнего питания, смс сообщение об отключении внешнего питания в любом случае будет отправлено

WatchPowerOff - выключить контроль внешнего питания

GuardButtonOn - управление сигнализацией внешними устройствами или кнопкой включено Удалена начиная с версии GSM_2017_04_16-12-00.
GuardButtonOn1 - функция постановки или снятия охраны внешними устройствами или кнопкой включена
GuardButtonOn2 - функция только постановки на охрану внешними устройствами или кнопкой включена, снятие с охраны производится по звонку на устройство или с помощью смс команды.
GuardButtonOff - управление сигнализацией внешними устройствами или кнопкой выключено

PCFForceOn - постоянный мониторинг группы всех датчиков модуля расширения
PCFForceOff - мониторинг группы всех датчиков модуля расширения только при постановке устройства на охрану

MainSensorLevelHigh - тревожное уведомление будет отправлено при появлении сигнала высокого уровня (+5 В) на входе (D6) от датчика
MainSensorLevelLow - тревожное уведомление будет отправлено при появлении сигнала низкого уровня (GND) на входе (D6) от датчика
MainSensorLevelOff - обработка датчика на входе (D6) отключена

SecondSensorLevelHigh - тревожное уведомление будет отправлено при появлении сигнала высокого уровня (+5 В) на входе (A0) от датчика
SecondSensorLevelLow - тревожное уведомление будет отправлено при появлении сигнала низкого уровня (GND) на входе (A0) от датчика
SecondSensorLevelOff - обработка датчика на входе (A0) отключена

MainDelayBeforeAlarm - время по истечении которого будет отправлено «тревожное» смс уведомление при срабатывании основного датчика (D6), если за этот период времени сигнализация не была снята с охраны. Синтаксис аналогичен команде DelayBeforeAlarm.
SecondDelayBeforeAlarm - время по истечении которого будет отправлено «тревожное» смс уведомление при срабатывании дополнительного датчика (A0), если за этот период времени сигнализация не была снята с охраны. Синтаксис аналогичен команде DelayBeforeAlarm.
PCFDelayBeforeAlarm - время по истечении которого будет отправлено «тревожное» смс уведомление при срабатывании датчиков платы расширения (PCF8574), если за этот период времени сигнализация не была снята с охраны. Синтаксис аналогичен команде DelayBeforeAlarm.

GuardOn - поставить на охрану
GuardOff - снять охраны

Open - команда управления внешним устройством

Info - проверить состояние, в ответ на это сообщение будет отправлено sms с информацией о том с какого номера была включена/выключена охрана

Pause - приостанавливает работу системы на время установленное командой sleeptime в минутах, система не реагирует на срабатывания датчика.

TestOn - включается тестовый режим, мигает синим светодиодом.
TestOff - выключается тестовый режим.

LedOff - выключает светодиод режима ожидания.
LedOn - включает светодиод режима ожидания.

Money - запроса баланса.

ClearSms - Удалить из памяти все sms

Консольные команды (до версии GSM_2017_04_24-13-22.hex) - вводятся в мониторе порта Arduino IDE:

AddPhone - аналогична sms-команде AddPhone

DeletePhone - аналогична sms-команде DeletePhone

EditSensor - аналогична sms-команде EditSensor

ListPhone - вывод в монитор порта списка сохранённых в памяти телефонов

ResetConfig - аналогична sms-команде ResetConfig

ResetPhone - аналогична sms-команде ResetPhone

FullReset - аналогична sms-команде FullReset

ClearSms - аналогична sms-команде ClearSms

WatchPowerOn1 - аналогична sms-команде WatchPowerOn1
WatchPowerOn2 - аналогична sms-команде WatchPowerOn2
WatchPowerOff - аналогична sms-команде WatchPowerOff

GuardButtonOn - аналогична sms-команде GuardButtonOn . Удалена начиная с версии GSM_2017_04_16-12-00
GuardButtonOn1 - аналогична sms-команде GuardButtonOn1
GuardButtonOn2 - аналогична sms-команде GuardButtonOn2
GuardButtonOff - аналогична sms-команде GuardButtonOff

Memtest - тест энергонезависимой памяти устройства, все настройки устройства будут сброшены, аналогично команде FullReset.

I2CScan - поиск и инициализация поддерживаемых устройств на шине I2C.

ListConfig - вывод в монитор порта текущей конфигурации устройства.

ListSensor - вывод в монитор порта текущей конфигурации датчиков.

UPD. При использовании датчика движения , для исключения ложных срабатываний при работе модема, необходимо между пинами GND и A0 Arduino поставить сопротивление , спасибо говорим товарищу
AllowPhone = {«70001234501», «70001234502», «70001234503», «70001234504», «70001234505»} - Номера которым разрешено управлять охраной.
AlarmPhone = {«70001234501», «70001234502»} - Номера для отправки sms-уведомлений при срабатывании датчика и уведомления о снятии или постановке на охрану. На первый номер в списке будет осуществляться вызов при срабатывании датчика если выполнена команда RingOn, по-умолчанию эта опция включена. Это сделано потому что sms-сообщения могут прийти с некоторой задержкой, а звонок должен пройти сразу.

Если поступил вызов с разрешенного номера или sms-сообщение с командой GuardOn/GuardOff, то в зависимости от текущего состояния охраны будет отправлено sms-сообщение о постановке или снятии с охраны на номера перечисленные в массиве AlarmPhone, так же будет отправлено sms-сообщение на номер с которого поступил вызов.

При срабатывании датчика отправляются sms-сообщения на все номера из массива (списка) AlarmPhone и осуществится голосовой вызов на первый номер из этого массива.

Световая индикация:
Светодиод светится красным цветом - поставлено на охрану.
Светодиод светится зелёным цветом - снято с охраны, включается/отключается sms-командой LedOn/LedOff.
Светодиод постоянно мигает синим цветом - сигнализирует о том что c Arduino всё в порядке, плата не зависла, используется исключительно для отладки, включается/отключается sms-командой TestOn/TestOff.
* В коде присутствует функция LedTest(), она мигает синим светодиодом, сделана лишь для того чтобы мониторить Arduino, мигает - значит работает, не мигает - зависла. Пока ещё не зависала:)

НЕ Актуально!

Подключение 2 и более датчиков для открытых прошивок (касается только этой прошивки sketch_02_12_2016.ino)
Для подключения дополнительных герконовых датчиков используем свободные цифровые пины D2,D3,D5 или D7. Схема подключения с дополнительным датчиком на D7.

Необходимые изменения в прошивке
... #define DoorPin 6 // Номер входа, подключенный к основному датчику int8_t DoorState = 0; // Переменная для хранения состояния основного датчика int8_t DoorFlag = 1; // Переменная для хранения состояния основного датчика #define BackDoorPin 7 // Номер входа, подключенный к дополнительному датчику int8_t BackDoorState = 0; // Переменная для хранения состояния дополнительного датчика int8_t BackDoorFlag = 1; // Переменная для хранения состояния дополнительного датчика...
void setup() { ... pinMode(DoorPin, INPUT); pinMode(BackDoorPin, INPUT); ...
... void Detect() { // Считываем значения с датчиков DoorState = digitalRead(DoorPin); BackDoorState = digitalRead(BackDoorPin); //Обработка основного датчика if (DoorState == LOW && DoorFlag == 0) { DoorFlag = 1; delay(100); if (LedOn == 1) digitalWrite(GLed, LOW); Alarm(); } if (DoorState == HIGH && DoorFlag == 1){ DoorFlag = 0; delay(100); } //Обработка дополнительного датчика if (BackDoorState == LOW && BackDoorFlag == 0) { BackDoorFlag = 1; delay(100); if (LedOn == 1) digitalWrite(GLed, LOW); Alarm(); } if (BackDoorState == HIGH && BackDoorFlag == 1){ BackDoorFlag = 0; delay(100); } } ...

И ещё кое что :
1. Диоды лучше использовать рассчитанные на ток 2 А, так как модуль заражает током в 1 А и нам ещё нужно чем то питать Arduino и модем. В этом экземпляре используются диоды 1N4007, если выйдут из строя заменю на 2 А.
2. Все резисторы для светодиода использовал на 20 кОм, для того чтобы ночью не освещать весь коридор.
3. На герконовый датчик между пином GND и пином D6 так же повесил резистор на 20 кОм.

На этом пока всё. Спасибо за внимание! :)

Планирую купить +207 Добавить в избранное Обзор понравился +112 +243