GSM-сигнализация на Arduino: описание, подключение, схема, характеристики | ВИКИ

Введение

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

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

Свой проект я решил начать с составления общей структурной схемы. На ней в виде блоков будут изображены все составляющие будущего устройства, а также необходимые взаимосвязи. Когда начнёт просматриваться общий концепт, я детально раскрою каждый блок и смогу получить целостную и рабочую схему в целом. Итак, в моём понимании структура охранной сигнализации должна иметь следующий вид:

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

Блок зарядки АКБ будет постоянно подзаряжать аккумулятор в буферном режиме от основного источника, и отключать его от нагрузки при падении напряжения до критической отметки в режиме резервного питания.

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

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

Читайте про операторов:  Акционерное Общество «Радиокомпания «Вектор» - официальный сайт

Центральное устройство управления – это мозг всей системы, в роли которого выступит плата Arduino Nano.

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

Блок индикации введён для визуального и звукового оповещения о текущем состоянии системы.

Клавиатура, на мой взгляд, необходима для возможности снятия с охраны объекта путём непосредственного ввода пароля без использования мобильной связи. Это может быть актуально, если в текущий момент у хозяина нет доступа к своему телефону (севшая батарея, утеря и т.п.). Помимо снятия с охраны, на клавиатуру можно навесить ещё несколько дополнительных функций, но про это чуть позже.

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

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

.3. Загрузка звуковых файлов в память SIM800L

Для загрузки AMR-файлов в память модуля нам понадобится
специальная программа. Утилита позволяет соединиться с SIM800L по COM-порту с целью передачи списка заранее подготовленных файлов. Внешний вид программы показан ниже.

При работе с программой следует закрыть монитор порта среды Arduino IDE, чтобы освободить занятый им СОМ-порт. Также обращаем внимание на скорость обмена данными. Перед записью следует добавить ARM-файлы в центральное окно при помощи кнопки Add. Соответственно, удаление файла из списка осуществляется кнопкой Del.

После того, как список сформирован, подаём питание на схему, выжидаем 5 секунд, пока инициализируется SIM800L и нажимает кнопку Start. Начинается процесс записи, идущий по цепи: Sim800 Series AmrFile Downloader V1.00 → Arduino Nano → SIM800L. В нижней части окна отображается номер записываемого в данный момент файла и уровень прогресса. На следующей иллюстрации можно наблюдать, как ведёт себя программа в процессе записи.

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


Теперь можно повторно запросить остаток памяти и список файлов SIM800L через AT-команды, рассмотренные в начале раздела. Запускаем монитор порта и последовательно вводим две команды:

В случае успешно проделанной работы ответ должен выглядеть следующим образом:

Из рисунка видно, что объём свободной памяти уменьшился, а файловая система модуля SIM800L теперь содержит 10 звуковых дорожек. На этом начальная подготовка GSM-модуля окончена и можно приступать к разработке программного кода.

Где купить датчики и модули для Arduino?Купить датчики Arduino можно в нашем магазине 3DIY с доставкой по всей России!

. Техническое задание

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

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

Постановка объекта под охрану осуществляется путём нажатия # на матричной клавиатуре или соответствующей клавиши мобильного телефона при установленном соединении. В случае использования матричной клавиатуры, сигнализация станет активной по истечении 20 сек, чтобы человек мог вовремя покинуть охраняемое помещение. Свидетельством того, что объект находиться под охраной, является мигание красного светодиода с периодом 1 раз в секунду.

Снятие объекта с охраны также можно выполнить двумя способами, а именно: ввод секретного кода на клавиатуре и нажатие * на мобильном телефоне во время сеанса мобильной связи с блоком управления. В случае управления клавиатурой перед каждым вводом пароля следует нажимать кнопку *, а также при неправильном вводе символа. Нажатие данной кнопки сбрасывает буфер пароля и его можно вводить повторно.

Любой дозвон на блок сигнализации сопровождается голосовым приветствием. После соединения, помимо постановки и снятия с охраны объекта, пользователь может управлять двумя нагрузками. Включение и отключение первой нагрузки можно выполнить кнопками 1 (включить)

Нажатие на телефоне цифры 3 приведёт к измерению напряжения батареи с последующим сообщением результата (в норме/разряжена).

В случае проникновения, блок сигнализации позвонит на телефон пользователя и сообщит о проникновении на охраняемую территорию.

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


Для корректной работы скетча понадобится библиотека матричной клавиатуры
Keypad.h.

Блок контроля охранных шлейфов

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

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

Чтобы сделать сигнализацию более устойчивой к обманным действиям злоумышленника (обрезание или закорачивание проводов шлейфа), в конце каждой цепи устанавливается оконечный резистор с фиксированным сопротивлением. Это сопротивление и является эталонным для блока измерения. Любое отклонение от этого параметра будет являться признаком сигнала тревоги. Для своего проекта я выбрал Rок=2k.

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

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


Как видно из схемы, все 4 каскада согласования идентичны друг другу, поэтому рассмотрим назначение элементов только одного из них, например того, что контролирует 1-й охранный шлейф.

Итак, напряжение 12V через токоограничивающий резистор R1 подаётся в охранный шлейф с датчиками. Резисторы R2 и R5 образуют делитель напряжения, который согласовывает 12-вольтовый уровень шлейфа с максимальным входным напряжением аналогового входа Arduino Nano, равным 5V. Конденсатор С1 в совокупности с остальными компонентами выполняет фильтрацию помех.

Учитывая все вышеперечисленные факторы и то, что сопротивление Rок=2k, получаем около 2,43V на аналоговом входе Arduino при 12-вольтовом питании шлейфа. Это как раз середина диапазона встроенного в микроконтроллер АЦП, что позволит удобно отслеживать любые отклонения как в большую, так и в меньшую сторону.

Hardwareserial mega

На платах форм-фактора Arduino Mega 2560 аппаратный UART, который отвечает за передачу данных через пины 1 и 0, отвечает также за передачу по USB. Это означает невозможность использовать одновременно UART для коммуникации с GPRS-модулем и отладки по USB.

Но на платах такого форм-фактора есть ещё дополнительно три аппаратных UART:

Список поддерживаемых плат:

Подключите GPRS Shield к платформе Arduino Mega 2560.

  1. Оденьте модуль сверху на управляющую платформу.

  2. Снимите джампера с пинов TX и RX GPRS Shield’a и перекиньте управляющие контакты с 0(RX) и 1(TX) — на 19(RX1) и 18(TX1) пин соответственно.

GSM-сигнализация на Arduino: описание, подключение, схема, характеристики | ВИКИ

Протестируйте.
В качестве примера отправим SMS на указанный номер с GPRS Shield’a. Прошейте управляющую плату скетчем приведённым ниже. Откройте монитор последовательного порта для анализа действий программы.

HardwareSerialMegaSendSMS.ino
// библиотека для работы с GPRS устройством#include <GPRS_Shield_Arduino.h>
 
// создаём объект класса GPRS и передаём в него объект Serial1 
GPRS gprs(Serial1);// можно указать дополнительные параметры — пины PK и ST// по умолчанию: PK = 2, ST = 3// GPRS gprs(Serial1, 2, 3);
 
void setup(){// открываем последовательный порт для мониторинга действий в программе
  Serial.begin(9600);// открываем Serial-соединение с GPRS Shield
  Serial1.begin(9600);// ждём, пока не откроется монитор последовательного порта// для того, чтобы отследить все события в программеwhile(!Serial){}
  Serial.print("Serial init OKrn");// включаем GPRS шилд
  gprs.powerOn();// проверяем есть ли связь с GPRS устройствомwhile(!gprs.init()){// если связи нет, ждём 1 секунду// и выводим сообщение об ошибке// процесс повторяется в цикле// пока не появится ответ от GPRS устройства
    delay(1000);
    Serial.print("Init errorrn");}// выводим сообщение об удачной инициализации GPRS Shield
  Serial.println("GPRS init success");// отправляем сообщение по указанному номеру с заданным текстом
  gprs.sendSMS(" 79263995140", "Hello SMS from Amperka!");}
 
void loop(){}

Softwareserial

Некоторые платы Arduino, например, Uno, прошиваются через пины 0 и 1. Это означает невозможность использовать одновременно прошивку/отладку по USB и общение с GPRS модулем. Решение проблемы — программный UART. Снимите джампера с TX и RX GPRS Shield’a и с помощью проводов «мама-папа» перебросьте на свободные пины управляющей платы.

В качестве примера подключите GPRS Shield к платформе Arduino Uno.

  1. Оденьте модуль сверху на управляющую платформу.

  2. Снимите джампера с пинов TX и RX GPRS Shield’a и перекиньте управляющие контакты с 0(RX) и 1(TX) — на 10 и 11 пин соответственно.

GSM-сигнализация на Arduino: описание, подключение, схема, характеристики | ВИКИ

Протестируйте. Отправим SMS на указанный номер с GPRS Shield’a.

При использовании программного UART не забудьте про библиотеку SoftwareSerial.

Прошейте управляющую плату скетчем приведённым ниже. Откройте монитор последовательного порта для анализа действий программы.

SoftwareSerialSendSMS.ino
// библиотека для работы с GPRS устройством#include <GPRS_Shield_Arduino.h>
 
// библиотека для эмуляции Serial порта// она нужна для работы библиотеки GPRS_Shield_Arduino#include <SoftwareSerial.h>
 
// создаём объект mySerial и передаём номера управляющих пинов RX и TX
SoftwareSerial mySerial(10, 11);
 
// создаём объект класса GPRS и передаём в него объект mySerial 
GPRS gprs(mySerial);// можно указать дополнительные параметры — пины PK и ST// по умолчанию: PK = 2, ST = 3// GPRS gprs(mySerial, 2, 3);
 
void setup(){// открываем последовательный порт для мониторинга действий в программе
  Serial.begin(9600);// открываем Serial-соединение с GPRS Shield
  mySerial.begin(9600);// ждём, пока не откроется монитор последовательного порта// для того, чтобы отследить все события в программеwhile(!Serial){}
  Serial.print("Serial init OKrn");// включаем GPRS шилд
  gprs.powerOn();// проверяем есть ли связь с GPRS устройствомwhile(!gprs.init()){// если связи нет, ждём 1 секунду// и выводим сообщение об ошибке// процесс повторяется в цикле// пока не появится ответ от GPRS устройства
    delay(1000);
    Serial.print("Init errorrn");}// выводим сообщение об удачной инициализации GPRS Shield
  Serial.println("GPRS init success");// отправляем сообщение по указанному номеру с заданным текстом
  gprs.sendSMS(" 79263995140", "Hello SMS from Amperka!");}
 
void loop(){}

Входящие звонки

Произведём входящий звонок на GPRS Shield. Не забудьте подключить наушники и микрофон в соответствующие разъёмы на плате, чтобы вы смогли слышать абонента, а он вас.

GPRSIncomingСall.ino
// библиотека для работы с GPRS устройством#include <GPRS_Shield_Arduino.h>
 
// создаём объект класса GPRS и передаём в него объект Serial1 
GPRS gprs(Serial1);// можно указать дополнительные параметры — пины PK и ST// по умолчанию: PK = 2, ST = 3// GPRS gprs(Serial1, 2, 3);
 
void setup(){// открываем последовательный порт для мониторинга действий в программе
  Serial.begin(9600);// ждём, пока не откроется монитор последовательного порта// для того, чтобы отследить все события в программеwhile(!Serial){}
  Serial.print("Serial init OKrn");// открываем Serial-соединение с GPRS Shield
  Serial1.begin(9600);// включаем GPRS шилд
  gprs.powerOn();// проверяем есть ли связь с GPRS устройствомwhile(!gprs.init()){// если связи нет, ждём 1 секунду// и выводим сообщение об ошибке// процесс повторяется в цикле,// пока не появится ответ от GPRS устройства
    delay(1000);
    Serial.print("GPRS Init errorrn");}// вывод об удачной инициализации GPRS Shield
  Serial.println("GPRS init success");// сообщаем об ожидании звонка
  Serial.println("Wait to call ");}
 
void loop(){// ожидаем звонкаif(gprs.ifcallNow()){// если поступает входящий звонок// выводим сообщение
    Serial.println("Incoming call");// по истечении 5 секунд берём трубку
    delay(5000);
    gprs.answer();// выводим сообщение о начале разговора
    delay(1000);
    Serial.println("Call a conversation");while(!gprs.ifcallEnd()){// ждём пока месть абонент не положит трубку}// выводим сообщение о конце разговора
    Serial.println("Call over");}}

Исходный код программы

В программе первым делом необходимо подключить библиотеку для работы с ЖК дисплеем, сообщить Arduino к каким его контактам подключен ЖК дисплей, инициализировать необходимые контакты и переменные.

После этого необходимо инициализировать последовательный порт для работы со скоростью 9600 бод/с, задать направление работы для используемых контактов.

Для работы с последовательным портом мы будем использовать 2 функции: Serial.available, которая будет проверять поступили ли какие-нибудь данные по последовательному порту и Serial.read, которая будет считывать данные из последовательного порта.

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

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

Далее приведен полный текст программы.

Исходящие звонки

Чтобы позвонить с GPRS Shield’a, воспользуйтесь скетчем, приведенным ниже. Не забудьте подключить наушники и микрофон в соответствующие разъёмы на плате, чтобы вы смогли слышать абонента, а он вас. Если открыть монитор последовательного порта, можно проследить порядок действий.

GPRSOutgoingСall.ino
// библиотека для работы с GPRS устройством#include <GPRS_Shield_Arduino.h>
 
// номер на который будем звонить#define PHONE_NUMBER  " 79263995140"
 
// создаём объект класса GPRS и передаём в него объект Serial1 
GPRS gprs(Serial1);// можно указать дополнительные параметры — пины PK и ST// по умолчанию: PK = 2, ST = 3// GPRS gprs(Serial1, 2, 3);
 
void setup(){// открываем последовательный порт для мониторинга действий в программе
  Serial.begin(9600);// ждём, пока не откроется монитор последовательного порта// для того, чтобы отследить все события в программеwhile(!Serial){}
  Serial.print("Serial init OKrn");// открываем Serial-соединение с GPRS Shield
  Serial1.begin(9600);// включаем GPRS шилд
  gprs.powerOn();// проверяем есть ли связь с GPRS устройствомwhile(!gprs.init()){// если связи нет, ждём 1 секунду// и выводим сообщение об ошибке// процесс повторяется в цикле// пока не появится ответ от GPRS устройства
    delay(1000);
    Serial.print("GPRS Init errorrn");}// вывод об удачной инициализации GPRS Shield
  Serial.println("GPRS init success");// сообщаем о наборе номера
  Serial.print("Start to call ");
  Serial.print(PHONE_NUMBER);// звоним по указанному номеру
  gprs.callUp(PHONE_NUMBER);}
 
void loop(){}

Отправка sms

Помимо приёма и совершения звонков модуль может принимать и отправлять короткие текстовые сообщения — SMS. Ниже представлен пример отправки текстового сообщения.

GPRSSendSMS.ino
// библиотека для работы с GPRS устройством#include <GPRS_Shield_Arduino.h>
 
// номер на который будем отправлять сообщение#define PHONE_NUMBER  " 79263995140"// текст сообщения, которое будем отправлять#define MESSAGE  "Hello from GPRS Shield"
 
// создаём объект класса GPRS и передаём в него объект Serial1 
GPRS gprs(Serial1);// можно указать дополнительные параметры — пины PK и ST// по умолчанию: PK = 2, ST = 3// GPRS gprs(Serial1, 2, 3);
 
void setup(){// открываем последовательный порт для мониторинга действий в программе
  Serial.begin(9600);// ждём пока не откроется монитор последовательного порта// для того, чтобы отследить все события в программеwhile(!Serial){}
  Serial.print("Serial init OKrn");// открываем Serial-соединение с GPRS Shield
  Serial1.begin(9600);// включаем GPRS-шилд
  gprs.powerOn();// проверяем, есть ли связь с GPRS-устройствомwhile(!gprs.init()){// если связи нет, ждём 1 секунду// и выводим сообщение об ошибке;// процесс повторяется в цикле,// пока не появится ответ от GPRS-устройства
    delay(1000);
    Serial.print("GPRS Init errorrn");}// вывод об удачной инициализации GPRS Shield
  Serial.println("GPRS init success");// сообщаем о написании и отправке СМС по указанному номеру
  Serial.println("Start to send message ...");// отправляем сообщение по указанному номеру с заданным текстом
  gprs.sendSMS(PHONE_NUMBER, MESSAGE);}
 
void loop(){}

Подключение модуля sim800l к микроконтроллеру esp8266

ESP8266 стал настоящей новостью прошлого года для всех, кто занимается созданием девайсов на Ардуино. Дешёвый микроконтроллер, с возможностями, превышающими его дорогостоящий аналог, и при этом совместимый с АТ .

Ардуино не остались за бортом, и теперь данный модуль официально добавлен в списки поддерживаемых платой, а соответственно, всё больше пользователей приобщится к китайскому мк для wi-fi соединения. Но бывает, что в системе необходимо отслеживать и местоположение модуля, для чего одной платы esp8266 будет недостаточно. Здесь и пригодится esp8266 sim800l.

Для смарт-домов и множества поделок требуется получать уведомление о местоположении платы, будь то дистанционная дверь или обычный трекер. Вот лишь краткий список поделок, которые можно создать, совмещая esp8266 sim800:

  1. Умный дом. Практически любую технику для умных домов можно настроить на определённые патерны при приближении объекта. Но зачем устанавливать датчики движения, если можно просто прикрепить в wi-fi плате sim800, вшить в какой-то предмет одежды мк с аккумулятором (благо, много энергии не потребуется) и автоматически включать свет или открывать дверь при приближении пользователя.
  2. Разнообразные отслеживающие устройства. Речь не идёт о противозаконных жучках и прочих устройствах, нарушающих ваше право на неприкосновенность. Однако мк может работать отдельно от ардуино, а если к нему прикрепить sim800, общие размеры устройства не превысят спичечный коробок. Просто оберните всё в металлический корпус и прикрепите к ключам, в качестве брелока. Отныне найти смартфон, ключи и даже вашу машину на парковке будет в разы проще.
  3. Робототехника и смежные направления. Здесь можно долго говорить о развитии современного виртуального интеллекта и нейросетях, но зачастую, чтобы создавать карту местности и ориентироваться в ней, железякам недостаточно датчиков. И если вы занимаетесь чем-то подобным, то gps модуль пригодится. Особенно он удобен в паре с дронами.

Когда вы определитесь с конечной целью проекта, следует разобраться в нюансах вопроса. Подключение устройств к вышеназванному микроконтроллеру такое же, как у стандартных плат ардуино, разница лишь в количестве доступных пинов. GPS трекер требует для работы от 3.7 до 4.

2 вольт, в отличие от стандартных 5, выдаваемых микроконтроллером. Это следует учитывать при построении схемы платы и соответствующе подбирать вспомогательные источники питания.

Либо устанавливать трансформаторы и резисторы, в зависимости от того, что вы ещё будете подсоединять к конечной системе.

Регистрируясь в сети, модулю потребуется приблизительно 2А, но это его пиковое потребление и в дальнейшем необходимая сила тока снизится до 1-1.2 А.

Как только вы подключите трекер к системе, необходимо будет его запустить и отправить первые команды, лучше всего подойдут АТ и АТ .

Только после этих действий модуль, наконец, начнёт посылать данные и отвечать на ваши запросы, поэтому не стоит беспокоится, если вы его подсоединили, диод мигает, но никаких реакций на скрипты нет.

Вам просто необходимо активировать Sim800i при первом использовании, чтобы он успел зарегистрироваться в сети.

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

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

Соответственно, они являются хорошим дополнением друг к другу, но никак не альтернативой.

Подробнее о

gsm/gprs shield:

Есть несколько поколений сетей сотовой связи 1G, 2G, 3G, 4G …, где G означает Generation – поколение, так вот 2G это и есть GSM (Global System for Mobile communications) – глобальная система мобильной связи. Это стандарт цифровой мобильной сотовой связи, с Гауссовской частотной модуляцией (GMSK), разделением каналов по времени (TDMA) и частоте (FDMA).

Значит GSM/GPRS Shield, A6 может работать только с SIM (Subscriber Identification Module) картами тех сотовых операторов, которые поддерживают стандарт сотовой связи 2G (GSM). К таким операторам относится тройка: MTS, Megafon и Beeline, о поддержке стандарта GSM другими операторами сотовой связи, уточняйте у их представителей.

GPRS (General Packet Radio Service) – пакетная радиосвязь общего пользования, это дополнение (или надстройка) к GSM позволяющая осуществлять обмен данными с другими устройствами и внешними сетями, в т.ч. интернет.

GSM/GPRS Shield, A6 построен на базе PCB модуля A6 производства компании Ai-Thinker, который отличается от своих конкурентов меньшим энергопотреблением. Не смотря на заявленное производителем пиковое (кратковременное) потребление тока до 2А, в процессе тестирования (в течении месяца) максимальное потребление тока не превышало 500 мА.

Такое низкое энергопотребление (по сравнению с другими GSM модулями) позволяет работать от USB порта компьютера (ноутбука, планшета), а при питании от аккумуляторных батарей или Battery Shield, значительно увеличивает срок автономной работы.

Для питания модуля на плате установлен импульсный DC-DC преобразователь, так же имеется преобразователь уровней для согласования выводов шины UART с 5В логикой. Встроенная PCB антенна позволяет работать без подключения внешней. Назначение переключателя шин UART и перемычек будут подробно рассмотрены ниже.

На плате имеются разъемы: 3,5 jack – для подключения гарнитуры (с микрофоном), PLS-2 – для подключения динамика и микрофона громкой связи, IPX U.FL – для подключения внешней антенны, SIM LG P970 – для установки SIM карты размера 2FF, а так же разъёмы для установки платы на Arduino/Piranha UNO/MEGA/Leonardo.

Для работы с GSM/GPRS Shield предлагаем воспользоваться библиотекой iarduino_GSM, позволяющей устанавливать голосовые соединения и обмениваться SMS (в т.ч. на Русском языке) используя несколько простых и понятных функций.

Подробнее про установку библиотеки читайте в нашей инструкции.

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

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

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

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

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

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

Листинг 2

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

#include <SoftwareSerial.h>

#include "DHT.h"

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

#define PHONE_NUMBER " 7928222222"

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

SoftwareSerial gsm(7, 8);

DHT sensorDHT(2, DHT22);

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

#define TEMPP 18

unsigned long millissend;

void setup() {

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

   Serial.begin(9600);

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

   sensorDHT.begin();

   // запуск SoftwareSerial

   gsm.begin(9600);

}

void loop() {

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

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

      int h = sensorDHT.readHumidity();

      int t = sensorDHT.readTemperature();

      if(t<TEMPP) {

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

         SendSMS(t);

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

         delay(10*60*1000);   

      }

      millissend=millis();

   }

}

// отправка sms

void SendSMS(int t) {

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

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

   delay(100);

   // телефон

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

   gsm.println(PHONE_NUMBER);

   gsm.println(""");

   delay(50);

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

   gsm.println(t);

   delay(50);

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

   gsm.println((char)26);

   delay(50);

   gsm.println();

}


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

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

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

Листинг 3

Функция callstatus();

  • Назначение: получение состояния голосового вызова.
  • Синтаксис: CALLstatus();
  • Параметры: нет.
  • Возвращаемое значение: соответствует одной из констант:
    • GSM_OK – свободен для звонков.
    • GSM_CALL_ACTIVE – активное голосовое соединение.
    • GSM_CALL_OUT_DIAL – исходящий вызов в режиме набора адреса (номера).
    • GSM_CALL_OUT_BEEP – исходящий вызов в режиме дозвона (ждём поднятия трубки).
    • GSM_CALL_IN_BEEP – входящий вызов в режиме дозвона (ждёт поднятия трубки).
    • GSM_CALL_IN_WAIT – входящий вызов в режиме ожидания.
    • GSM_CALL_HELD – вызов в режиме удержания.
    • GSM_CALL_END – вызов разъединяется (кратковременный статус).
    • GSM_CALL_ERR – состояние вызова не определено.
  • Примечание:
    • Данную функцию удобно использовать для распределения функционала на разных стадиях голосового вызова.
  • Пример:
if(gsm.CALLdial( "70123456789" )){                           // Если исходящий вызов инициирован, то...
    Serial.println( "Dialing ..." );                         // "Набираю ..."
    while(gsm.CALLstatus()==GSM_CALL_OUT_DIAL){              // Ждём завершения набора номера.
//      Код будет выполняться в процессе набора номера.      //
    }   delay(500);                                          // Даём немного времени для установки состояния - "дозвон" или "соединён".
    if(gsm.CALLstatus()==GSM_CALL_OUT_BEEP){                 // Если начались гудки дозвона, то ...
        Serial.println( "Waiting for an answer ... " );      // "Ждём ответа ...".
        while(gsm.CALLstatus()==GSM_CALL_OUT_BEEP){          // Ждём поднятия трубки на вызываемой стороне.
//          Код будет выполняться в процессе ожидания ответа //
        }   delay(500);                                      // Даём немного времени для установки состояния - "соединён".
    }                                                        //
    if(gsm.CALLstatus()==GSM_CALL_ACTIVE){                   // Если соединение установлено (абонент ответил), то ...
        Serial.println( "Voice connection established!" );   // "Установлено голосовое соединение!"
        while(gsm.CALLstatus()==GSM_CALL_ACTIVE){            // Ждём завершения активного голосового соединения.
//          Код будет выполняться в процессе разговора       //
        }                                                    //
        Serial.println( "Call ended" );                      // "Вызов завершён".
    }else{                                                   // Иначе, если активное голосовое соединение не было установлено, то ...
        Serial.println( "No answer!" );                      // "Абонент не ответил".
    }                                                        //
}                                                            //

Функция smsread();

  • Назначение: чтение одного входящего не прочитанного SMS сообщения.
  • Синтаксис: SMSread( ТЕКСТ [,АДРЕС [,ДАТА [,ID,КОЛИЧЕСТВО,НОМЕР]]] );
  • Параметры:
    • ТЕКСТ – строка (char[161]) в которую требуется сохранить текст SMS сообщения. Текст сообщение может достигать 160 символов символ конца строки.
    • АДРЕС – строка (char[13]) в которую требуется сохранить адрес (номер) отправителя SMS. Адрес отправителя может достигать 12 символов символ конца строки.
    • ДАТА – строка (char[18]) в которую требуется сохранить дату отправки SMS. Дата отправки сообщения содержит 17 символов “ДД.ММ.ГГ ЧЧ:ММ:СС” символ конца строки.
    • ID – переменная (uint16_t) в которую требуется сохранить идентификатор. Если сообщение состоит из нескольких SMS (составное сообщение), то у каждой SMS данного сообщения будет один и тот же идентификатор. Если сообщение состоит из 1 SMS, то идентификатор будет равен 0.
    • КОЛИЧЕСТВО – переменная (uint8_t) в которую требуется сохранить количество SMS в составном сообщении. Если сообщение состоит из 1 SMS, то количество будет равно 1.
    • НОМЕР – переменная (uint8_t) в которую требуется сохранить номер данной SMS в составном сообщении. Если сообщение состоит из 1 SMS, то номер будет равен 1.
  • Возвращаемое значение: (bool) флаг корректности чтения true/false.
  • Примечание:
    • Если предполагается принимать только короткие SMS сообщения (сообщения состоящие из одной SMS), то параметры ID, КОЛИЧЕСТВО и НОМЕР можно не указывать.
    • Параметры АДРЕС и ДАТА так же являются необязательными.
    • ТЕКСТ короткого SMS сообщения может достигать 160 символов (без Кириллицы) или 70 символов (если в тексте есть хотя бы один символ Кириллицы).
    • ТЕКСТ одной SMS в составе составного сообщения может достигать 152 символов (без Кириллицы) или 66 символов (если в тексте данной SMS есть хотя бы один символ Кириллицы).
    • Данная функция удаляет SMS сообщение из памяти SIM-карты, сразу после его чтения.
    • SMS сообщения читаются в порядке их поступления.
    • символы Кириллицы отображаются некорректно, см. функцию TXTreadCoding().
  • Пример:
char SMStxt[161];                 // Объявляем строку (массив) для получения текста SMS.
char SMSadr[13];                  // Объявляем строку (массив) для получения адреса отправителя SMS.
if(gsm.SMSavailable()){           // Если есть SMS сообщения, то ...
    gsm.SMSread(SMStxt, SMSadr);  // Читаем SMS сообщение (только текст и адрес отправителя).
    Serial.println(SMSadr);       // Выводим адрес (номер) отправителя SMS.
    Serial.println(SMStxt);       // Выводим текст SMS сообщения.
}                                 //

Функция status();

  • Назначение: получение состояния GSM/GPRS Shield.
  • Синтаксис: status();
  • Параметры: нет.
  • Возвращаемое значение: соответствует одной из констант:
    • GSM_OK – модуль готов к работе.
    • GSM_SPEED_ERR – не удалось согласовать скорость UART.
    • GSM_UNAVAILABLE – модуль недоступен (AT-команды не выполняются).
    • GSM_UNKNOWN – статус неизвестен (AT-команды могут не выполнятся).
    • GSM_SLEEP – модуль в режиме ограниченной функциональности.
    • GSM_SIM_PIN – требуется ввод PIN1 (CHV1).
    • GSM_SIM_PUK – требуется ввод PUK1 и новый PIN1.
    • GSM_SIM_PIN2 – требуется ввод PIN2 (CHV2).
    • GSM_SIM_PUK2 – требуется ввод PUK2 и новый PIN2.
    • GSM_SIM_NO – нет SIM-карты.
    • GSM_SIM_FAULT – SIM-карта неисправна.
    • GSM_SIM_ERR – неопределённое состояние SIM-карты.
    • GSM_REG_NO – модем не зарегистрирован в сети оператора.
    • GSM_REG_FAULT – регистрация модема в сети оператора отклонена.
    • GSM_REG_ERR – статус регистрации модема в сети оператора не читается.
  • Примечание:
    • Функцию status() удобно использовать сразу после функции begin() для ожидания регистрации модема в сети оператора связи, определения необходимости ввода pin-кода, информирования об отсутствии SIM-карты и т.д.
    • Так же функцию удобно использовать в коде loop() для отслеживания разрыва регистрации с сетью оператора связи.
  • Пример:
if( gsm.status()==GSM_SIM_PIN   ){ gsm.pin("1234"); } // Вводим pin-код "1234" если он нужен.
while( gsm.status()==GSM_REG_NO ){ delay(1000); }     // Ждём завершения регистрации модема в сети оператора связи.
while( gsm.status()!=GSM_OK     ){ delay(1000); }     // Ждём полной готовности модуля к работе (включая регистрацию модема в сети оператора связи).

Чтение sms

Прочитаем сообщения, которые будут поступать на сим-карту, установленную в модуль. Вся информация будет выводиться в монитор Serial порта.

GPRSReadSMS.ino
// библиотека для работы с GPRS устройством#include <GPRS_Shield_Arduino.h>
 
// длина сообщения#define MESSAGE_LENGTH 160
 
// номер сообщения в памяти сим-картыint messageIndex =0;
 
// текст сообщенияchar message[MESSAGE_LENGTH];// номер, с которого пришло сообщениеchar phone[16];// дата отправки сообщенияchar datetime[24];
 
// создаём объект класса GPRS и передаём в него объект Serial1 
GPRS gprs(Serial1);// можно указать дополнительные параметры — пины PK и ST// по умолчанию: PK = 2, ST = 3// GPRS gprs(Serial1, 2, 3);
 
void setup(){// открываем последовательный порт для мониторинга действий в программе
  Serial.begin(9600);// ждём пока не откроется монитор последовательного порта// для того, чтобы отследить все события в программеwhile(!Serial){}
  Serial.print("Serial init OKrn");// открываем Serial-соединение с GPRS Shield
  Serial1.begin(9600);// включаем GPRS-шилд
  gprs.powerOn();// проверяем, есть ли связь с GPRS-устройствомwhile(!gprs.init()){// если связи нет, ждём 1 секунду// и выводим сообщение об ошибке;// процесс повторяется в цикле,// пока не появится ответ от GPRS-устройства
    delay(1000);
    Serial.print("GPRS Init errorrn");}// выводим сообщение об удачной инициализации GPRS Shield
  Serial.println("GPRS init success");
  Serial.println("Please send SMS message to me!");}
 
void loop(){// если пришло новое сообщениеif(gprs.ifSMSNow()){// читаем его
    gprs.readSMS(message, phone, datetime);
 
    // выводим номер, с которого пришло смс
    Serial.print("From number: ");
    Serial.println(phone);
 
    // выводим дату, когда пришло смс
    Serial.print("Datetime: ");
    Serial.println(datetime);
 
    // выводим текст сообщения
    Serial.print("Recieved Message: ");
    Serial.println(message);}}

Функция smssendclass();

  • Назначение: указание класса для всех отправляемых SMS сообщений.
  • Синтаксис: SMSsendClass( КЛАСС );
  • Параметры:
    • КЛАСС – значение соответствующее одной из констант:
      • GSM_SMS_CLASS_NO – отправлять SMS сообщения без класса (по умолчанию).
      • GSM_SMS_CLASS_0 – отправлять SMS сообщения с указанием 0 класса.
      • GSM_SMS_CLASS_1 – отправлять SMS сообщения с указанием 1 класса.
      • GSM_SMS_CLASS_2 – отправлять SMS сообщения с указанием 2 класса.
      • GSM_SMS_CLASS_3 – отправлять SMS сообщения с указанием 3 класса.
  • Возвращаемое значение: нет.
  • Примечание:
    • Сообщения без класса это обычные SMS сообщения отправляемые с телефона на телефон.
    • Входящие сообщения 0 класса (ими информируют о ЧС и называют Flash SMS) выводятся напрямую на дисплей телефона. Такие сообщения либо не сохраняются вообще, либо телефон запрашивает разрешение на сохранение сообщения в памяти входящих SMS.
    • Входящие сообщения 1 класса (ими оператор отправляет настройки телефона) сохраняются в памяти телефона.
    • Входящие сообщения 2 класса сохраняются в памяти SIM-карты.
    • Входящие сообщения 3 класса передаются терминальному оборудованию или приложению.
    • Выбранный класс будет применяться ко всем SMS сообщениям отправляемым функцией SMSsend().
  • Пример:
gsm.SMSsendClass(GSM_SMS_CLASS_0);      // Отправлять все последующие SMS с указанием класса 0 (отображая их сразу на экране телефона).
gsm.SMSread("Привет", " 70123456789");  // Данное сообщение будет отправлено как SMS класса 0.
gsm.SMSsendClass(GSM_SMS_CLASS_NO);     // Отправлять все последующие SMS без класса (как обычные SMS сообщения).

Функция smssend();

  • Назначение: отправка одного SMS сообщения.
  • Синтаксис: SMSsend( “ТЕКСТ” ,“АДРЕС” [,ID,КОЛИЧЕСТВО,НОМЕР] );
  • Параметры:
    • “ТЕКСТ” – текст отправляемого SMS сообщения, может содержать символы Кириллицы.
    • “АДРЕС” – текст с номером получателя SMS сообщения. Можно указывать короткие номера, ведущий символ ‘ ‘ в номере телефона можно не указывать.
    • ID – идентификатор, случайное число (uint16_t), указывается только для SMS составного сообщения. Составное сообщение это длинное сообщение состоящее из нескольких SMS с одним и тем же идентификатором, такое сообщение отображается на телефоне получателя как одно большое сообщение.
    • КОЛИЧЕСТВО – число (uint8_t) указывается только для SMS составного сообщения. Определяет количество SMS в составе составного сообщения.
    • НОМЕР – число (uint8_t) указывается только для SMS составного сообщения. Определяет порядковый номер данной SMS в составе составного сообщения.
  • Возвращаемое значение: (bool) флаг корректности отправкиtrue/false.
  • Примечание:
    • Если отправляется обычное (короткое) SMS сообщение, то параметры ID, КОЛИЧЕСТВО и НОМЕР не указываются.
    • ТЕКСТ короткого SMS сообщения не может превышать 160 символов (без Кириллицы) или 70 символов (если в тексте есть хотя бы один символ Кириллицы).
    • ТЕКСТ одной SMS в составе составного сообщения не может превышать 152 символа (без Кириллицы) или 66 символов (если в тексте данной SMS есть хотя бы один символ Кириллицы).
    • Отправленные SMS сообщения не сохраняются в памяти.
    • Если на телефоне принимающей стороны некорректно отображаются символы Кириллицы, см. функции TXTsendCoding()и TXTsendCodingDetect().
    • Если принимающей стороне одновременно поступят несколько (больше одного) составных сообщений с одинаковым ИДЕНТИФИКАТОРОМ и одинаковым КОЛИЧЕСТВОМ SMS в составе составных сообщений, то существует вероятность неправильной склейки ТЕКСТА этих сообщений (часть текста будет от одного сообщения, а часть от другого). По этому значение ИДЕНТИФИКАТОРА должно генерироваться как случайное число от 1 до 65535.
  • Пример:
gsm.SMSread("Привет", " 70123456789");  // Отправка SMS с текстом "Привет" на номер  7(012)345-67-89.
gsm.SMSsend(F("Данное SMS сообщение является составным, так как содержит более 70"), "70123456789", 0x1234, 3, 1); // Отправка 1 из 3 SMS в составе составного сообщения с идентификатором 0x1234, на номер получателя  7(012)345-67-89.
gsm.SMSsend(F(" символов. По этому это сообщение будет отправлено как 3 SMS сообщ"), "70123456789", 0x1234, 3, 2); // Отправка 2 из 3 SMS в составе составного сообщения с идентификатором 0x1234, на номер получателя  7(012)345-67-89.
gsm.SMSsend(F("ения.nНо получатель увидит его как один большой целый текст."     ), "70123456789", 0x1234, 3, 3); // Отправка 3 из 3 SMS в составе составного сообщения с идентификатором 0x1234, на номер получателя  7(012)345-67-89.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *