Управление отоплением на ардуино по gsm. Подключение с помощью GSM-GPRS шилда. Основные характеристики Arduino Uno

GSM-lib написанна под Arduino IDE версии 1.0. Скачать последную версию библиотеки с готовыми примерами использования можно из репозитория проекта . Для установки - распакуйте архив GSM в директорию libraries (/arduino-1.0/libraries/GSM). После запуска среды разработки Arduino, в меню программы «File -> Examples» появится пункт GSM, с примерами скетчей.

Библиотека GSM разработана для работы с шилдом « ». Она аппаратно совместима с платами Arduino (Uno, Duemilanove и прочие аналоги). При использовании других плат, возможно, потребуется внесение правок в GSM.cpp для указания правильного порта, на который выведена с шилда линия включения модема.

В настоящий момент в библиотеке реализованы следующие функциональные возможности.

  • Регистрация в GSM-сети
  • Отправка SMS
  • Прием и разбор SMS
  • Прием входящих вызовов
  • Проверка статуса соединения с сетью GSM, восстановление сети при потере сигнала

Регистрация в GSM-сети

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

Первичная инициализация выполняется в функции setup().

#include #include const char PIN PROGMEM = "0000"; // ПИН-код void setup() { while (GSM.Init(PIN)<0); // Регистрация в сети GSM.NewSMSindic(); // Настройка индикатора новых SMS GSM.WaitCall(); // Ждем входящие вызовы GSM.WaitSMS(); // Ждем входящих SMS }

Отправка SMS

Для отправки текстовых сообщений служит функция SendSMS(), в которую передаются 2 параметра - номер получателя SMS и само сообщение.

While(GSM.SendSMS(RemoteID, "Hello from Arduino!") < 0);

Где RemoteID - это номер получателя. Эту константу предпочтительнее выносить в заголовок программы.

Const char RemoteID PROGMEM = "+79280000000";

Текст сообщения можно формировать также динамически.

String textMessage; textMessage += "Sensor1 "; textMessage += "Sensor2"; char Out; textMessage.toCharArray(Out,(textMessage.length())+1); while(GSM.SendSMS(RemoteID, Out) < 0);

Прием и разбор SMS

Для считывания входящих SMS сообщений служит функция ReadSMS(), в которую передаются 2 параметра - индекс SMS и указатель, куда будет скопирован текст. Ниже представлен фрагмент скетча, в котором разбирается текст входящего сообщения. Когда SMS равен 1 - выполняем некое действие, а когда равен 2 - производим другое действие. Полный пример скетча SmsCheck.ino смотрите в examples .

If (GSM.CheckSMS()== 1) { //Есть новое СМС GSM.ReadSMS(NewSMS_index, (char*) SMStxt); GSM.DeleteAllSMS(); // Удалить СМСки (накапливать не будем!) strSMS = String(SMStxt); if(strSMS == "1") { // тут выполняем действие 1 } if(strSMS == "2") { // тут выполняем действие 2 } GSM.WaitCall(); GSM.WaitSMS(); }

Примечание. Библиотека GSM умеет работать только с латинскими символами, кириллица в настоящее время не поддерживается.

Прием входящих вызовов

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

Например, можно сделать вызов на шилд, на Ардуино проверить номер звонящего абонента и в случае совпадения с шаблонным номером - выслать на него SMS с показаниями датчиков. Следующий фрагмент реализует подобный функционал. Полная версия скетча CallCheck.ino смотрите в examples .

If (IncomingCall == 1) { //пришёл звонок! while (GSM.TerminateCall()<0); // Ложим трубку IncomingCall = 0; // Проверяем, если номер звонящего CallerID совпал с шаблоном RemoteID if (strstr_P(CallerID, RemoteID)) { while(GSM.SendSMS(RemoteID, "Hello from Arduino!") < 0);// SMS из SRAM памяти } GSM.WaitCall(); }

Проверка статуса соединения с сетью GSM

Бывают ситуации, когда соединение с сетью пропадает. Для выявления потери сети служит функция CheckStatus(), которая возвращает 0 в том случае, когда соединение с сетью утеряно. Пример использования приводится в следующем блоке кода.

// Через определенные промежутки времени проверяем состояние GPRS подключения! if(currentMillis - previousMillis > interval) { if ((GSM.CheckStatus() != 1)) { // GPRS соединение не установлено! while (GSM.Init(PIN)<0); // Делаем инициализацию } GSM.WaitCall(); currentMillis = previousMillis = millis(); }

Выполнение произвольных AT-команд из скетча

Для выполнения AT-команд из скетча используется функция WriteStr_P().

GSM.WriteStr_P(PSTR("AT\r\n"));

Хочу представить вам очень простой способ удаленного управления электропитанием.
Мы будем использовать готовые радиоуправляемые розетки, поэтому нам не потребуется ничего паять. Это очень здорово, потому что 220 В (начинающим) лучше не трогать.

Код

Если вы используете не GSMSHIELD, а какую-то другую библиотеку, то код разумеется будет отличаться, но принцип будет один и тот же. Через определенные интервалы времени мы проверяем, нет ли у нас непрочитанных SMS, парсим их, и если пришла валидная команда с авторизованного номера, то посылаем радиосигнал функциями mySwitch.switchOff или mySwitch.switchOn , передавая им адрес розетки.
Прим. в моем случае для шилда от Seeedstudio нужно было залезть в GSM.cpp и поменять заданные пины на 7 и 8. /* Arduino GSM-switch example code Switch on/off radio controlled controlled outlets Author: Vladislav Ross, 2014 Contact: [email protected] You need to download: 1. rc-switch https://code.google.com/p/rc-switch/ 2. GSMSHIELD http://www.gsmlib.org/ For GSMSHIELD: * To change pins for Software Serial, use the two lines in GSM.cpp. * If you are using Mega, uncomment "#define MEGA" line in HWSerial.h * You can enable debug messages on serial port by defining DEBUG_ON */ #include "SIM900.h" #include #include "sms.h" #include "call.h" #include // 433MHz transmitter pin const byte RCpin = 12; char groupAddress = "11111"; char smsLetters = "ABC"; char* deviceAddresses = { "10000", //A "01000", //B "00100" //C }; char adminNumber = "+74991356235"; //your phone number CallGSM call; SMSGSM sms; RCSwitch mySwitch = RCSwitch(); char number; byte stat=0; char smsText; byte position; int deviceLetterIdx = -1; byte i,j; void setup() { gsm.begin(2400); delay(10000); for(i = 1; i <= 21; i++) { sms.DeleteSMS(i); } mySwitch.enableTransmit(RCpin); }; void loop() { //hang up all incoming calls /*stat=call.CallStatus(); if(stat==CALL_INCOM_VOICE) { call.HangUp(); }*/ position = sms.IsSMSPresent(SMS_UNREAD); //get new SMS if (position) { sms.GetSMS(position, number, smsText, 10); sms.DeleteSMS(position); if(strcmp(number, adminNumber) == 0) //accept SMS only from defined number { for (i = 0; i < sizeof(smsText) - 1; i++) { if(deviceLetterIdx != -1) { //got letter, now expecting 0 or 1 if(smsText[i] == "0") { mySwitch.switchOff(groupAddress, deviceAddresses); delay(500); } if(smsText[i] == "1") { mySwitch.switchOn(groupAddress, deviceAddresses); delay(500); } deviceLetterIdx = -1; } else { //waiting for letter A,B,C... for(j = 0; j < sizeof(smsLetters) - 1; j++) { if(smsLetters[j] == smsText[i]) { deviceLetterIdx = j; break; } } } } } } delay(10000); }; GitHub .

Проблемы?

Если розетки ни в какую не хотят переключаться, можно попробовать принять сигнал от родного пульта на приемник. В rc-switch есть пример кода.

Что дальше?

Как дальше можно развить этот проект:
Во-первых, у нас осталось еще куча пинов на самом Ардуино и на GSM-шилде. Можно подключить к ним какие-то датчики или устройства. Например, сделать удаленный мониторинг температуры или полив цветов.
Во-вторых, мы использовали только SMS, а модуль еще умеет передавать голос и GPRS. GPRS может передать гораздо больше данных. Кроме того, можно не бросать трубку при звонке, а, например, принимать вызов и давать слушать, что происходит на месте.
Возможно также, что вы захотите принимать управляющие SMS не с одного номера, а с нескольких. В этом случае я бы рекомендовал хранить номера в адресной книге &mash; в библиотеке есть соответствующие функции.

Можно также отправлять SMS - сообщения, все что для этого понадобится это специальный модуль Arduino GSM/GPRS SIM900. Данная плата расширения подходит под распространенные платы Arduino UNO, MEGA и Leonardo. С ее помощью можно сделать кучу разных проектов использующие GPRS интернет или доступ в сеть GSM. Она будет работает везде где есть мобильная сеть. При помощи этого модуля можно сделать GSM сигнализацию, которя вместе с системой видеонаблюдения обеспечит отличную защиту вашего жилища.

Модуль позволяет использовать сети стандартов GSM 850, GSM 900, GSM 1800, GSM 1900 и поддерживает протокол TCP с доступоп в сеть GPRS.

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

Особенности подключения платы GSM к платам Arduino Leonardo и Arduino Mega

Плата с расширением GSM работает с Ардуино непосредственно благодаря библиотеке Software Serial. При стандартных настройках, для взаимодействия модема с Ардуино подключаются цифровые выводы № 2 и № 3. На Arduino Uno подходят такие настройки, но для правильной работы шилда на Arduino Leonardo или Arduino Mega необходимо внести поправки.

Вывод GSM_TX, так же именуется выводом № 2 на плате расширения, отправляет информацию Ардуино. Чтобы точно знать, в какой момент необходимо считывать информацию, Ардуино применяет механизм прерываний: при перемене цифрового уровня сигнала в этом выводе возникает соответствующее прерывание. Однако в Arduino Leonardo и Arduino Mega вывод № 2 не поддерживает прерывания.

Что бы шилд нормально функционировал на Arduino Mega или Leonardo совсем не нужно переменять программный код, библиотека сама изменяет номер вывода RX Ардуино при выборе надлежащей модели в меню "Tools" среды разработки.

Arduino Leonardo


Для правильного функционирования с Leonardo библиотека GSM использует цифровой вывод № 8. Для этого на плате расширения GSM необходимо замкнуть проводником цифровые выводы № 2 и № 8.

На задней стороне платы GSM необходимо отогнуть в сторону штыревой контакт, соответствующий выводу № 2, так, чтобы он не соприкасался с Arduino Leonardo.

Arduino Mega2560


Библиотека GSM для корректной роботы с Mega использует цифровой вывод № 10. На плате расширения GSM необходимо замкнуть проводником цифровые выводы № 2 и №10, как и с Arduino Leonardo. Не забыв при этом отогнуть с обратной стороны платы GSM в сторону штиревой контакт соответствующий выводу № 2, так, чтобы он не касался Arduino Mega.

Статья для тех, кто хочет заставить Arduino отправлять СМС через данный GSM модуль . Модуль NEOWAY M590 на базе чипа SIM900 подойдет для создания самодельной сигнализации, умного дома. Существует также альтернативный GSM модуль подключаемый напрямую к Arduino через 5 Вольт: Sim800L EVB v2.0

Постановка задачи

  • Используя только Arduino и GSM модуль управлять светодиодом посредством звонка с телефона.
  • Отправлять СМС (пока через команду поступающую через монитор порта в Arduino IDE)

Подключение к Arduino

Соединяем GSM модуль с Arduino.
5В модуля -> 5V Arduino
GND модуля -> GND Arduino
ТХ модуля -> digital pin2 Arduino
RX модуля -> digital pin3 Arduino
Распиновку можно посмотреть на фото. Порядок контактов такой: 1 - +5В, 2 - GND, 7 - TX, 8 - RX.


Запитать модуль можно от 4В до 5В, я использовал 5 вольтовый выход.

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

Землю Ардуино и модуля GSM при раздельном питании надо соединить, но сначала нужно мультиметром замерить напряжение между этими "землями". Некоторые компьютерные блоки питания имеют перепад потенциала на корпусе и земле USB до 100В. Ток там мизерный и убить не может, но уничтожить Ардуино или модуль GSM или то и другое вместе - запросто.

Скетч

#include < SoftwareSerial . h > SoftwareSerial mySerial (2 , 3 ) ; // RX, TX int ch = 0 ; int led = 13 ; String val = "" ; void setup () {
delay(2000); //время на инициализацию модуля pinMode (led , OUTPUT ) ; digitalWrite (led , LOW ) ; Serial . begin (9600 ) ; //скорость порта Serial . println ("GSM tester v1.0" ) ; mySerial . begin (9600 ) ; mySerial . println ("AT+CLIP=1" ) ; //включаем АОН delay (100 ) ; mySerial . println ("AT+CMGF=1" ) ; //режим кодировки СМС - обычный (для англ.) delay (100 ) ; mySerial . println ("AT+CSCS=\"GSM\"" ) ; //режим кодировки текста delay (100 ) ; } void loop () { if (mySerial . available () ) { //если GSM модуль что-то послал нам, то while (mySerial . available () ) { //сохраняем входную строку в переменную val ch = mySerial . read () ; val += char (ch ) ; delay (10 ) ; } if (val . indexOf ("RING" ) > - 1 ) { //если звонок обнаружен, то проверяем номер if (val . indexOf ("71234567890" ) > - 1 ) { //если номер звонящего наш. Укажите свой номер без "+" Serial . println ("--- MASTER RING DETECTED ---" ) ; mySerial . println ("ATH0" ) ; //разрываем связь digitalWrite (led , HIGH ) ; //включаем светодиод на 3 сек delay (3000 ) ; digitalWrite (led , LOW ) ; //выключаем реле } } else Serial . println (val ) ; //печатаем в монитор порта пришедшую строку val = "" ; } if (Serial . available () ) { //если в мониторе порта ввели что-то while (Serial . available () ) { //сохраняем строку в переменную val ch = Serial . read () ; val += char (ch ) ; delay (10 ) ; } //mySerial.println(val); //передача всех команд, набранных в мониторе порта в GSM модуль if (val . indexOf ("sendsms" ) > - 1 ) { //если увидели команду отправки СМС sms (String ("hello world" ) , String ("+71234567890" ) ) ; //отправляем СМС на номер +71234567890 } val = "" ; //очищаем } } void sms (String text , String phone ) //процедура отправки СМС { Serial . println ("SMS send started" ) ; mySerial . println ("AT+CMGS=\"" + phone + "\"" ) ; delay (500 ) ; mySerial . print (text ) ; delay (500 ) ; mySerial . print ((char ) 26 ) ; delay (500 ) ; Serial . println ("SMS send complete" ) ; delay (2000 ) ; }

Проверка


GPRS

В рассматриваемой версии модуля 1.30 поддержка GPRS урезанная. Мне не удалось подключиться к серверу по его DNS имени (например mysite.ru), получилось только по IP-адресу. В другом модуле SIM800L таких проблем не было.

Перечень некоторых AT команд:

Shield GPRS/GSM SIM900 с антенной
SIM900 GPRS/GSM Shield Development Board Quad-Band Kit For Arduino Compatible

Модуль для работы микроконтроллерных устройств Arduino и аналогичных в сетях сотовой связи по стандартам GSM и GPRS. Ориентирован на использование в системах автоматики и управления. Обмен данными с другими модулями происходит через интерфейс UART. Shield GPRS/GSM SIM900 с антенной может сопрягаться непосредственно с микроконтроллером через интерфейс UART или работать совместно с персональным компьютером при использовании преобразователя интерфейса портПК-UART. Это возможно благодаря программной совместимости на уровне класса команд используемых для управления модемами - АТ команды.
Мониторинг объектов и управление ими происходит благодаря обмену данными в пределах досягаемости мобильной связи. Обеспечивается голосовая связь, отправка СМС, ММС и много других функций и сервисов. Работа модуля основана на компоненте SIM900.

Статья на русском из журнала о компоненте SIM900 . Компонент разработан компанией SIMCom Wireless Solutions. Сайт SIMCom имеет русскоязычную версию . Плата GSM модуля на стороне компонентов содержит соединители для подключения антенны, наушников и микрофона. На стороне пайки платы размещены держатель батареи CR1220 3 вольта поддерживающей работу часов модуля и контейнер для установки симкарты.
Одно из применений устройства - система слежения за перемещениями транспорта совместно с ГЛОНАСС или GPS прибором. Отправка СМС сообщений позволяет использовать модуль в диспетчеризации, беспроводной сигнализации и в охранных системах. В результате происходящих событий могут отправляться различные СМС: “Аварийный стоп лифта 2 дома №34”, “Дверь автомобиля открыта”, “Подвал открыт”, “Напряжение 220 В выключено”, “Входная дверь дачи открыта”, “Включено освещение”, “Температура в теплице ниже критической”. Модуль незаменим для контроля и управления подвижными объектами, перемещающимися на большие расстояния. Или в случае удаления оператора на большое расстояние от стационарного объекта.

Shield GPRS/GSM SIM900 с антенной дает широкие возможности изучения работы компонента SIM900. Монтаж компонента SIM900 выполняется по самым современным технологиям из-за чего припаять к печатной плате SIM900 в лабораторных условиях весьма затруднительно. Имея модуль с установленным SIM900 можно проводить эксперименты по применению компонента SIM900. При использовании в собственных разработках компонента SIM900 появляется возможность отладки программного обеспечения и проверки схемотехнических решений.

Характеристики

Питание
напряжение, В
номинальное 5
диапазон 4,8-5,2
ток
обычный режим 50-450 мА
в спящем режиме 1,5 мА
предельный импульсный 2 А
Поддерживает симкарты питанием 1,8 и 3 В
Диапазоны связи 850, 900, 1800, 1900 МГц
Поддерживает сеть 2G
Мощность передачи в различных диапазонах
1 Вт 1800 и 1900 МГц
2 Вт 850 и 900 МГц
Соответствует стандарту GSM фазы 2/2+
Встроенные протоколы TCP и UDP
Класс передачи данных GPRS multi-slot class 10/8
Аудиокодеки HR, FR, EFR, AMR, подавление эха
CSD до 14,4кбит/сек
PPP стек
MUX (07.10)
Протоколы HTTP и FTP
Есть возможность отправлять сигналы DTMF и проигрывать записи как на автоответчике
Поддержка часов реального времени RTC
Температура, ℃
воздуха при работе -30...75
хранения -45...90
размеры 86 х 58 х 19 мм

Компоненты управления

Переключателем Power select устанавливается источник питания: внешний, подключенный к коаксиальному соединителю или источник питания микроконтроллерного модуля Arduino.

Кнопкой Power key включается или выключается питание при нажатии и удерживании в течение 2 с.

Индикация

О состоянии модуля сообщают 3 светодиода:
PWR (зеленый) - индикатор питания модуля,
Status (красный) - индикатор питания компонента SIM900,
Net Light (зеленый) - соединение с сетью.
Сообщения светодиода Net Light.
Выключен - SIM900 не работает.
Мигает с интервалами, указано в секундах:
0,064 включен и 0,8 выключен - сеть не обнаружена,
0,064 включен и 0,3 выключен - сеть обнаружена,
0,064 включен, 0,03 выключен - GPRS подключен.

Контакты

Компонент SIM900 содержит порт UART, его сигналы выведены на выводы компонента и соединены с перемычками, устанавливающими с какими контактами модуля Shield GPRS/GSM SIM900 будет соединен порт UART компонента SIM900 с D0, D1 или D7, D8.
UART Shield GPRS/GSM можно подключнить: к аппаратному интерфейсу МК через контакты TXD и RXD модуля Shield GPRS/GSM, для этого используются D0, D1. Или к программно эмулируемому средствами ардуино, для этого используются контакты D7 и D8 модуля Shield GPRS/GSM. Полный интерфейс UART имеет 10 сигналов выведенных на контакты в углу платы: R1, DCD, DSR, CTS, RTS, GND, 2V8, TX, RX, DTR.
12 подписанных контактов цифровых линий ввода-вывода GPIO расположены в углу платы. Имеется 2 контакта выходных сигналов с широтно-импульсной модуляцией PWM1, PWM2. Вход АЦП контакт ADC. Интерфейс встроенного счетчика времени имеет 4 контакта. Обозначение контактов: DISP_CLK, DISP_DATA, DISP_D/C, DISP_CS.
Контакт D9 используется для программного контроля включения или выключения SIM900.
На плате установлен соединитель для подключения антенны.

Назначение выводов компонента SIM900.

Внешнее включение и выключение питания

Включить или выключить питание модуля можно с помощью сигнала на управляющем входе D9. Для изменения состояния на D9 подается импульс продолжительностью 1 с. Изменение состояния происходит спустя 3,2 с после начала импульса.

Включение модуля. Графики напряжения питания модуля, внешнего управляющего импульса и индикатора питания STATUS.

При управлении модулем руководящим устройством включение должно происходить без применения кнопки Power key, т. е. сразу после подачи питания. Для этого в программу МК следует добавить несколько команд.

Void powerUpOrDown()
{
pinMode(9, OUTPUT);
digitalWrite(9,LOW);
delay(1000);
digitalWrite(9,HIGH);
delay(2000);
digitalWrite(9,LOW);
delay(3000);
}

Эту группу команд в программе можно использовать и для выключения модуля. Также выключить GSM модуль можно посылая AT команду.



Есть вопросы?

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам:

AT+CMGF=1 Вкл. текстового режима (смс только латиницей)
AT+CSCS= "GSM" Вкл. режима
AT+CLIP=1 включение определения номера входящего звонка
Если отправить команду с 0, то определение номера отключится и модуль вместо номера вызывающего будет слать только сообщение "RING".
AT+CMGS="+79123456789" Отправка СМС
ATI Получить информацию об устройстве
AT+IPR=19200 настройка скорости порта
AT+GSN вернет IMEI модуля
AT+CCLK? считываем время с модуля
AT+CCLK=«yy/mm/dd,hh:mm:ss+zz» где по порядку идут «год/месяц/дата,час:минуты:секунды+часовой пояс» Данные обязательно отправляются с ведущими нулями, то есть, к примеру, если месяц у нас "4", то отправить должны "04".
Получить обратно текущие время и дату можно отправив ту же команду, только со знаком "?":
AT+CMEE=0 уровень информации об ошибке. Может быть от 0 до 2.
0 - отключено. Будет просто писать ERROR.
1 - код ошибки. Будет возвращать цифровой код ошибки.
2 - описание ошибки. Напишет что именно ему не нравится в команде.
Для работы с модулем через терминал удобней режимы ATV1, ATE1 AT+CMEE=2, для общения с микроконтроллером лучше использовать ATV0, ATE0 и AT+CMEE=0 - так проще будет обрабатывать полученные ответы.
Данные настройки не сохраняются после перезагрузки модуля, поэтому необходимо включать эти команды в код программы.
AT+CSQ информация о качестве сигнала.
Модуль вернет два числа +CSQ: 17,0
17 - уровень сигнала. Может быть в диапазоне 0..31 или 99. Чем больше тем лучше, но 99 значит его отсутствие.
0 - коэффициент ошибок связи (т.н. RXQUAL). Может быть от 0 до 7, чем число меньше тем качество связи лучше.
AT+COPS? информация об операторе, в сети которого зарегистрирован модуль
ATD+79121234567; набор номера. (";" обязательно)
Модуль позвонит по указанному номеру и вернет один из вариантов
BUSY - номер занят
NO DIALTONE - нет сигнала на линии
NO CARRIER - нет сети или другая проблема (например, нет денег на счету)
NA ANSWER - нет ответа
CONNECT - есть контакт!
AT+CMGR=3,0