Управление отоплением на ардуино по 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
Отправка 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
Проблемы?
Если розетки ни в какую не хотят переключаться, можно попробовать принять сигнал от родного пульта на приемник. В 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 таких проблем не было.