GSM охранная система для дома на базе Arduino


Сигнализация для дома на Arduino

Рассмотрим, как сделать на Arduino Uno или Nano сигнализацию для дома, загородного садового участка или гаража. В проекте мы использовали сенсор движения, датчик воды и температуры — это набор основных сенсоров для самой простой системы оповещения. Вы узнаете о прорыве водопровода, снижении температуры в доме или проникновении посторонних людей в помещении в любое время и в любом месте.

Датчики Ардуино для охранной сигнализации

Датчики Ардуино для домашней сигнализации

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

Выводы

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

Касаемо программирования контроллеров, с этим тоже не возникнет проблем. С помощью библиотек, АТ-команд и скетчев, можно определять статус SIM-карты, получать и отправлять SMS сообщения, принимать звонки и тому прочее. Осуществляется это в среде программирования Arduino IDE или в аналогичных средах, установленных на удаленном устройстве, которыми могут быть как смартфон, так компьютер, что непосредственно подключен к программируемому устройству.

Как сделать сигнализацию Ардуино

Для этого проекта нам потребуется:

  • плата Arduino Uno / Arduino Nano / Arduino Mega;
  • смартфон с выходом в Интернет;
  • блютуз модуль HC-05;
  • датчик температуры и влажности DHT11;
  • датчик утечки воды (water sensor);
  • датчик движения и кнопка (переключатель);
  • светодиоды, резисторы, провода и т.д.

Схема сигнализации на Ардуино Нано для дома

Скетч охранной сигнализации на Arduino Uno / Nano

#include <SoftwareSerial.h> // подключение библиотеки SoftwareSerial.h SoftwareSerial mySerial(2, 3); // указываем пины rx и tx соответственно #include <DHT.h> // подключаем библиотеку для датчика DHT dht(16, DHT11); // сообщаем на каком порту будет датчик int tmp; #define PIR 5 // порт для подключения датчика движения int pir; #define KNP 7 // порт для подключения переключателя int knp; #define WTR 19 // порт для подключения датчика воды int wtr; #define LED 11 // порт для подключения светодиодов #define BUZ 9 // порт для подключения пьезодинамика // строки для идентификации информации, получаемой на смартфоне String stringT = String(«*»); String stringP = String(«^»); String stringW = String(«-«); String stringH = String(«#»); // переменные для счетчиков, отсчета циклов и т.д. unsigned long motion; unsigned long hour; byte m, s1, s2, s3, c = 10; void setup() { mySerial.begin(9600); Serial.begin(9600); dht.begin(); pinMode(PIR, INPUT); analogWrite(PIR, LOW); pinMode(KNP, INPUT); analogWrite(KNP, LOW); pinMode(WTR, INPUT); analogWrite(WTR, LOW); // проверка светодиодов и пищалки при включении питания pinMode(BUZ, OUTPUT); pinMode(LED, OUTPUT); analogWrite(LED, 255); tone(BUZ, 100); delay(1000); analogWrite(LED, 0); noTone(BUZ); delay(1000); } void loop() { tmp = dht.readTemperature(); pir = digitalRead(PIR); knp = digitalRead(KNP); wtr = analogRead(WTR); // запускаем счетчик hour = millis(); // 3600000 миллисекунд — это 1 час, 10800000 — 3 часа // если прошло 3 часа — отправляем данные на смартфон // при необходимости ставите свои значения вместо 10800000 if (millis() — hour > 10800000) { mySerial.println(tmp + stringT); // отправляем значение температуры mySerial.println(pir + stringP); // отправляем наличие движения в доме mySerial.println(wtr + stringW); // отправляем данные с датчиков воды mySerial.println(stringH); // отправляем сигнал, что 3 часа прошло } // ведем отсчет циклов, каждый десятый цикл отправляем данные на смартфон c—; Serial.print(c); Serial.println(» — цикл»); Serial.println(«»); delay(1000); noTone(BUZ); if (c > 10) { c = 10; } if (c < 1) { s1 = 0; s2 = 0; s3 = 0; mySerial.println(tmp + stringT); // отправляем значение температуры mySerial.println(pir + stringP); // отправляем наличие движения в доме mySerial.println(wtr + stringW); // отправляем данные с датчиков воды // выводим на монитор порта номер все данные с датчиков Serial.print(«TMP = «); Serial.println(tmp); Serial.print(«PIR = «); Serial.println(pir); Serial.print(«KNP = «); Serial.println(knp); Serial.print(«WTR = «); Serial.println(wtr); Serial.println(«»); } // СРАБОТАЛ ДАТЧИК ДВИЖЕНИЯ И КНОПКА ВЫКЛЮЧЕНА — ВКЛЮЧАЕМ СВЕТ if (pir == HIGH && knp == LOW) { analogWrite(LED, 255); } // ДАТЧИК ДВИЖЕНИЯ ОТКЛЮЧИЛСЯ И КНОПКА ВЫКЛЮЧЕНА — ВЫКЛЮЧАЕМ СВЕТ if (pir == LOW && knp == LOW) { motion = millis(); while (pir == LOW) { tmp = dht.readTemperature(); pir = digitalRead(PIR); knp = digitalRead(KNP); wtr = analogRead(WTR); c—; Serial.print(c); Serial.println(» — цикл»); Serial.println(«»); delay(1000); noTone(BUZ); if (c > 10) { c = 10; } if (c < 1) { s1 = 0; s2 = 0; s3 = 0; mySerial.println(tmp + stringT); // отправляем значение температуры mySerial.println(pir + stringP); // отправляем наличие движения в доме mySerial.println(wtr + stringW); // отправляем данные с датчиков воды // выводим на монитор порта номер все данные с датчиков Serial.print(«TMP = «); Serial.println(tmp); Serial.print(«PIR = «); Serial.println(pir); Serial.print(«KNP = «); Serial.println(knp); Serial.print(«WTR = «); Serial.println(wtr); Serial.println(«»); } // ИНТЕРВАЛ ВЫКЛЮЧЕНИЯ СВЕТА В МИЛЛИСЕКУНДАХ if (millis() — motion > 5000) { analogWrite(LED, 0); break; } if (pir == HIGH) { analogWrite(LED, 255); break; } } } // СРАБОТАЛ ДАТЧИК ДВИЖЕНИЯ И КНОПКА ВКЛЮЧЕНА — ЗАПУСКАЕМ ТАЙМЕР if (pir == HIGH && knp == HIGH) { motion = millis(); delay(1000); analogWrite(LED, 255); Serial.println(«СРАБОТАЛ ДАТЧИК»); Serial.println(«»); delay(1000); while (knp == HIGH) { tmp = dht.readTemperature(); pir = digitalRead(PIR); knp = digitalRead(KNP); wtr = analogRead(WTR); c—; Serial.print(c); Serial.println(» — цикл»); Serial.println(«»); delay(1000); noTone(BUZ); if (c > 10) { c = 10; } if (c < 1) { s1 = 0; s2 = 0; s3 = 0; mySerial.println(tmp + stringT); // отправляем значение температуры mySerial.println(pir + stringP); // отправляем наличие движения в доме mySerial.println(wtr + stringW); // отправляем данные с датчиков воды // выводим на монитор порта номер все данные с датчиков Serial.print(«TMP = «); Serial.println(tmp); Serial.print(«PIR = «); Serial.println(pir); Serial.print(«KNP = «); Serial.println(knp); Serial.print(«WTR = «); Serial.println(wtr); Serial.println(«»); } // ЕСЛИ ДАТЧИК ДВИЖЕНИЯ ОТКЛЮЧИЛИ — ОТПРАВКА СООБЩЕНИЯ НА БЛЮТУЗ if (knp == LOW) { Serial.println(«СИГНАЛИЗАЦИЯ ОТКЛЮЧЕНА»); Serial.println(«»); delay(1000); } // ЕСЛИ ПРОШЛО БОЛЕЕ 10 СЕКУНД — ОТПРАВКА СООБЩЕНИЯ НА БЛЮТУЗ if (millis() — motion > 10000 && s1 != 1) { m = 1; goto message1; } delay(1000); } } // ЕСЛИ ПРОИЗОШЛА УТЕЧКА ВОДЫ — ОТПРАВКА СООБЩЕНИЯ НА БЛЮТУЗ if (wtr > 500 && s2 != 2) { m = 2; goto message2; } if (wtr > 500) { tone(BUZ, 400); } if (wtr <= 500) { noTone(BUZ); } // ЕСЛИ УПАЛА ТЕМПЕРАТУРА — ОТПРАВКА СООБЩЕНИЯ НА БЛЮТУЗ if (tmp < 20 && s3 != 3) { m = 3; goto message3; } if (tmp < 20) { tone(BUZ, 200); } if (tmp >= 20) { noTone(BUZ); } message1: while (m == 1) { Serial.println(«СИГНАЛ ТРЕВОГИ ОТПРАВЛЕН НА БЛЮТУЗ»); Serial.println(«»); delay(1000); mySerial.println(tmp + stringT); // отправляем значение температуры mySerial.println(1 + stringP); // отправляем наличие движения в доме mySerial.println(wtr + stringW); // отправляем данные с датчиков воды s1 = 1; m = 0; break; } message2: while (m == 2) { Serial.println(«СИГНАЛ УТЕЧКИ ВОДЫ ОТПРАВЛЕН НА БЛЮТУЗ»); Serial.println(«»); delay(1000); mySerial.println(tmp + stringT); // отправляем значение температуры mySerial.println(pir + stringP); // отправляем наличие движения в доме mySerial.println(500 + stringW); // отправляем данные с датчиков воды s2 = 2; m = 0; break; } message3: while (m == 3) { Serial.println(«СИГНАЛ ТЕМПЕРАТУРЫ ОТПРАВЛЕН НА БЛЮТУЗ»); Serial.println(«»); delay(1000); mySerial.println(20 + stringT); // отправляем значение температуры mySerial.println(pir + stringP); // отправляем наличие движения в доме mySerial.println(wtr + stringW); // отправляем данные с датчиков воды s3 = 3; m = 0; break; } }

Пояснения к коду:

  1. ;
  2. .

На первый взгляд схема может показаться сложной, однако это не так. Сигнализацию можно собрать на любой плате, в том числе и Arduino Uno. Вместо светодиодов можно можно использовать LED ленту, но при этом питание для платы нужно будет уже 12 Вольт, и подключать LED ленту не к 5V, а к пину Vin Arduino. Со светодиодами можно использовать для питания схемы обычную зарядку от телефона на 5 Вольт.

Установка приложения на смартфон для сигнализации

Чтобы установить приложение закачайте файл home_twit.apk на свой телефон через USB шнур, найдите его в памяти телефона и нажмите «Установить». Этот телефон должен быть всегда в зоне Bluethoth сигнала Ардуино. После установки откройте приложение и нажмите кнопку «Настроить». Здесь потребуется указать минимальное и максимальное значение температуры, при которой будет отправляться сообщение.

А сейчас самое сложное — настройка аккаунтов в Twitter. Укажите в настройках логин пользователя в Твиттере, кому вы будете отправлять сообщение. Также требуется указать логин, API key и API secret key от лица которого будут поступать сообщения. Последние нововведения обусловлены борьбой со спамом и сбором информации о пользователях в соцсети. Как получить API key и API secret — читайте в этом обзоре.

На телефоне, который будет всегда при вас и будет получать сообщения потребуется установить официальное приложение Twitter с PlayMarket и войти в него под нужным логином. В итоге приложение signalizaciya.apk с телефона, находящегося в доме, будет собирать данные с датчиков Ардуино и отправлять их личным сообщением через Твиттер пользователю, под чьим логином вы установили приложение Twitter.

Если у вас возникли проблемы с настройками сигнализации на Ардуино — пишите свои вопросы в комментариях к этому обзору.

Топ 6 самых популярных модулей

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

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

Ниже будут приведены модули, такие как Neoway M590, A6 и A7, и прочие, представлены их характеристики.

SIM900

Разработанный компанией SIMCom Wireless Solution модуль SIM900 подключается и обменивается данными через распространенный физический протокол передачи данных UART. Подключение к ПК осуществляется через USB-UART преобразователь.

Плата позволяет в двухстороннем режиме работать с сообщениями и звонками адресата.

Спецификация:

  1. Диапазон частот EGSM900, DCS1800, GSM850, PCS1900.
  2. Напряжение 3,2-4,8 В.
  3. Сила тока в режиме простоя – 450 мА.
  4. Максимальный ток – 2 А.
  5. Канал связи до 14.4 кбит/с.
  6. Диапазон температур от -30 °C до +80 °C без искажения, и от -40 °C до +85 °C, с незначительным отклонением радиочастотных характеристик, с сохранением работоспособности.
  7. Вес 6,2 г.
  8. Размеры 24 x 24 x 3 мм.

У компонента есть модификации: 900B, 900D, 900TE-C, 900R 900X. У каждой модификации своя специфика. SIM900D дополнен блоком заряда аккумулятора, а в SIM900X введены новые режимы энергосбережения, что позволяет использовать модули в современных системах трекинга автомобилей, охранной и промышленной автоматики. Все модификации компонентов можно найти в едином форм-факторе SMT, с торцевыми контактами под пайку. Но, не исключены варианты нахождения в других форм факторах.

SIM800L

Основа модуля – компонент SIM800L с реализацией обмена данными по каналам GSM и GPRS с помощью дуплексного режима. В модуль устанавливается SIM-карта, есть встроенная антенна и выход под еще одну антенну. Питание на плату подается через преобразователь напряжения DC-DC. Еще, есть возможность подключиться к другому источнику питания. Интерфейс подключения – UART.

Спецификация:

  1. Четырехдиапазонный сотовый терминал.
  2. Напряжение 3,8-4,2В.
  3. Ток в режиме ожидания – 0,7 мА. Предельный ток – 500 мА.
  4. Слот
  5. Поддержка 2G сети.
  6. Диапазон температур от -30 °C до +75 °C.

A6

Шилд A6 работает в сетях мобильной связи и позволяет принимать и передавать сигналы с помощью GSM и GPRS. Модуль, созданный компанией AI-THINKER несколько лет назад, успешно показал себя и пользуется популярностью в системах автоматики.

ТТХ А6:

  1. Четырехдиапазонный сотовый терминал.
  2. Напряжение питания 5 В.
  3. Ток в спящем режиме – 3 мА.
  4. Ток режима ожидания – 100 мА.
  5. Ток режима соединения – 500 мА.
  6. Ток пиковой нагрузки – 2А.
  7. Разъем
  8. Скорость GPRS во время передачи сигнала 42,8 Кбит/сек.
  9. Температура от -30 °C до +80 °C.

A7

Новый модуль А7 отличается от предшественника тем, что в него встроен GPS. Это решение позволило упростить конструкцию платы.

Основные параметры:

  1. Четырехдиапазонный сотовый терминал.
  2. Напряжение 3,3-4,6 В.
  3. Напряжение питания 5В.
  4. 10 Класс GPRS: канал передачи данных 85,6 кбит/с.
  5. Jammer эха и шумов.

Neoway M590

Модуль на основе компонента Neoway M590 позволяет принимать звонки, обмениваться данными и сообщениями. Имеет интерфейс подключения UART.

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

  1. Диапазон частот EGSM900, DCS1800.
  2. 10 Класс
  3. Напряжение 3,3-5 В.
  4. Пиковый ток 2 А.
  5. Рабочий ток 210 мА.
  6. Коммуникационный сигнал 3,3 В.
  7. Температура от -40 °C до +80 °C.

Подключая модуль к контроллеру, потребуется преобразователь 3,3 В -> 5 В.

GSM GPRS модуль SIM900

На базе модуля SIM900 разработали и успешно используют SIM900 GSM GPRS Shield, в качестве модуля для подключения к Arduino UNO. По сравнению с остальными платами, стоимость этой на порядок дороже, и она укомплектована множеством разъемов и контактов. Среди основных параметров:

  1. Подключается плата к Arduino Mega и UNO.
  2. Четыре рабочих частоты, как и в остальных платах.
  3. Низкое энергопотребление 1.5 А в спящем режиме.
  4. GPRS мульти-слот класса 10/8.
  5. Рабочие температуры от -40°C до +85 °C.

Программная часть

Когда система собрана, ее необходимо запрограммировать. Управление GSM выполняется специфическими функциями и АТ-командами. Устройство принимает их, интерпретирует и выдает определенный результат, отправляя/получая СМС или звонок. Команды задаются через программное обеспечение (такая возможность предусмотрена в IDE) или вводятся напрямую через утилиты работы с портами.

AT-команды

Как уже говорилось, GSM-модули управляются посредством передаваемых на них AT-команд. Это текстовые строки, обрабатываемые прошивкой и инициирующие те или иные действия.

Все команды начинаются с символов AT.

Обычно они генерируются управляющим ПО, но могут быть отправлены и с клавиатуры, например, через утилиту монитора порта из поставки Arduino IDE.

AT-команды

Команды делятся на три вида:

  • текстовые — на них контроллер дает ответ о поддержке введенной пользователем директивы или отсутствии таковой;
  • чтение — просмотр параметров;
  • запись — ввод и сохранение некоторых новых значений.

Набор команд может отличаться в зависимости от контроллера.

Получение и отправка СМС

Пример работы с короткими сообщениями для связки «Arduino + сотовый модуль»:

  • в IDE выполняется директива AT+CMGF=1. Она указывает перейти в формат передачи текстового сообщения;
  • далее вводится AT+CSCS=«GSM». Выбирается кодировка ASCII;
  • AT+CMGS=«номер», где номер указывается полностью (в формате «+7…»);
  • когда выполнена эта команда, вводится непосредственно текст сообщения, и по нажатию ctrl-Z отправляется на выбранный номер.

Если все сделано, интерфейс программы вернет ОК.

Для получения SMS:

  • AT + CNMI = 2,2,0,0,0 — переход в состояние чтения;
  • когда блок GSM получит сообщение, он отправит в порт строку +CMTI: «SM»,2. Цифра может отличаться, она обозначает номер СМС в очереди;
  • для прочтения следует дать директиву AT+CMGR=2.

Прием голового звонка

Для выполнения потребуется включить библиотеку разработчика GSM.h:

#include

Если SIM-карта защищена пин-кодом, его также следует определить в скетче:

#define PINNUMBER «»

При пустом коде значение этого поля просто остается пустым.

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

boolean notConnected=true;

Соединение выполняется посредством функции gsmAcess.begin(). Если процесс завершен успешно, функция возвращает строку GSM_READY.

Далее нужно указать, что сотовый модем переведен в режим приема звонка. За это отвечает функция vcs.hangCall(). Следующая важная функция — getvoiceCallStatus. При входящем звонке она вернет строку RECEIVINGCALL. А для определения номера звонящего следует воспользоваться retreiveCallingNumber.

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

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

Рейтинг
( 1 оценка, среднее 5 из 5 )
Понравилась статья? Поделиться с друзьями: