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


Предисловие

Кражи автомобилей на протяжении последнего десятилетия занимают одно из значимых мест в структуре совершаемых в мире преступлений. Это обусловлено не столько удельным весом данной категории хищений относительно общего количества преступлений, сколько существенностью причиняемого ущерба ввиду большой стоимости автомобилей. Слабая эффективность принимаемых мер в области борьбы с кражами автотранспорта к концу 90-х годов привела к созданию устойчивых групп, специализирующихся на совершении данных преступлений и обладающих отличительными чертами организованной преступности; вы наверняка слышали термин «черный автобизнес». Автомобильный парк европейских государств ежегодно не досчитывается ≈ 2 % машин, которые становятся предметом преступных посягательств. Поэтому мне пришла идея сделать gsm-сигнализацию для своего автомобиля на базе Arduino Uno.

Начнём!

Из чего будем собирать

Надо выбрать сердце нашей системе. На мой взгляд, для подобной сигнализации нет ничего лучше, чем Arduino Uno. Основной критерий — достаточное количество «пинов» и цена.


Подходит!

Теперь необходимо выбрать gsm-модуль, ведь наша сигнализация должна уметь оповещать владельца автомобиля. Так, надо «погуглить»… Вот, отличный датчик — SIM800L, размер просто замечательный.

Подумал я и заказал его из Китая. Однако всё оказалось не так радужно. Датчик просто отказался регистрировать SIM-карту в сети. Было опробовано всё, что только возможно — результат нулевой.
Нашлись добрые люди, которые предоставили мне более крутую штуку — Sim900 Shield. Вот это уже серьёзный штучка. В Shield-е и разъём для микрофона и для наушников, полноценный телефон.

Подходит!

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

Думаю, что GY-521 MPU6050 точно подойдёт. Оказалось, что в нём есть и датчик температуры. Надо бы и его задействовать, будет такая «киллер фича». Предположим, что владелец автомобиля поставил его под домой и ушёл. Температура в салоне автомобиля будет изменяется «плавно». Что же будет, если злоумышленник попытается проникнуть в автомобиль? Например у него получится открыть дверь. Температура в автомобиле начнёт изменяться стремительно, так как воздух в салоне начнёт смешиваться с воздухом окружающей среды. Думаю, что будет работать.


Подходит!

Также пригодится датчик вибраций. Вдруг автомобиль попытаются вскрыть «грубой силой», ну или на парковке другой автомобиль заденет вашу машинку. Возьмём датчик вибраций SW-420 (регулируемый).

Подходит!

Прикрутим модуль SD карты памяти. Будем ещё писать лог-файл.

Подходит!

И добавим сервопривод, при срабатывании датчиков будет поворачиваться сервопривод с видеорегистратором и снимать видео происшествия. Возьмём сервопривод MG996R.

Подходит!

Собираем

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

  • Подключение GY-521 MPU6050 + скетч
  • Подключение SW-420 + скетч
  • Подключение модуля SD карты памяти + скетч
  • Подключение сервопривода MG996R + скетч
  • Подключение Sim900 Shield + скетч

В статьях приводится немного больше информации, чем нам надо, но знания ведь лишними не бывают). Фото собранного макета.

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

О, совсем забыл упомянуть о питании, от чего же будет питаться наша система. Питание будет от 12v автомобиля.

Тонкие моменты проекта

Фишки на Sim900 Shield должны быть установлены такие образом. Полезность SIM900 Shield.


Сигнализация для дома на ардуино
Положение тумблера питания Sim900 Shield.

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

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

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

→ AT-команды для Sim900 Shield

Итог

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

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

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

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

Источник: habr.com

Помогите скетч не работает.
Пишет ошибку:
Arduino: 1.8.0 (Windows 7), Плата:»Arduino/Genuino Uno»

sketch_dec28a:31: error: no matching function for call to ‘Button::Button(int, int)’

Button button1(BUTTON_1_PIN, 25); // создание объекта кнопка 1

^

C:Users27C6~1AppDataLocalTemparduino_modified_sketch_57337sketch_dec28a.ino:31:32: note: candidates are:


In file included from C:Users27C6~1AppDataLocalTemparduino_modified_sketch_57337sketch_dec28a.ino:4:0:

C:UsersРусланDocumentsArduinolibrariesButton/Button.h:14:3: note: Button::Button(uint8_t)

Button(uint8_t pin);

^

C:UsersРусланDocumentsArduinolibrariesButton/Button.h:14:3: note: candidate expects 1 argument, 2 provided

C:UsersРусланDocumentsArduinolibrariesButton/Button.h:11:7: note: constexpr Button::Button(const Button&)

class Button

^

C:UsersРусланDocumentsArduinolibrariesButton/Button.h:11:7: note: candidate expects 1 argument, 2 provided

C:UsersРусланDocumentsArduinolibrariesButton/Button.h:11:7: note: constexpr Button::Button(Button&&)

C:UsersРусланDocumentsArduinolibrariesButton/Button.h:11:7: note: candidate expects 1 argument, 2 provided

sketch_dec28a:32: error: no matching function for call to ‘Button::Button(int, int)’

Button button2(BUTTON_2_PIN, 25); // создание объекта кнопка 2

^

C:Users27C6~1AppDataLocalTemparduino_modified_sketch_57337sketch_dec28a.ino:32:32: note: candidates are:

In file included from C:Users27C6~1AppDataLocalTemparduino_modified_sketch_57337sketch_dec28a.ino:4:0:

C:UsersРусланDocumentsArduinolibrariesButton/Button.h:14:3: note: Button::Button(uint8_t)

Button(uint8_t pin);

^

C:UsersРусланDocumentsArduinolibrariesButton/Button.h:14:3: note: candidate expects 1 argument, 2 provided


C:UsersРусланDocumentsArduinolibrariesButton/Button.h:11:7: note: constexpr Button::Button(const Button&)

class Button

^

C:UsersРусланDocumentsArduinolibrariesButton/Button.h:11:7: note: candidate expects 1 argument, 2 provided

C:UsersРусланDocumentsArduinolibrariesButton/Button.h:11:7: note: constexpr Button::Button(Button&&)

C:UsersРусланDocumentsArduinolibrariesButton/Button.h:11:7: note: candidate expects 1 argument, 2 provided

C:Users27C6~1AppDataLocalTemparduino_modified_sketch_57337sketch_dec28a.ino: In function ‘void loop()’:

sketch_dec28a:70: error: ‘class Button’ has no member named ‘flagPress’

if ( (button1.flagPress == true) && (button2.flagPress == true) ) flagTwoButtons= true;

^

sketch_dec28a:70: error: ‘class Button’ has no member named ‘flagPress’

if ( (button1.flagPress == true) && (button2.flagPress == true) ) flagTwoButtons= true;

^

sketch_dec28a:71: error: ‘class Button’ has no member named ‘flagPress’

if ( (flagTwoButtons == true) && (button1.flagPress == false) && (button2.flagPress == false) ) {

^

sketch_dec28a:71: error: ‘class Button’ has no member named ‘flagPress’

if ( (flagTwoButtons == true) && (button1.flagPress == false) && (button2.flagPress == false) ) {


^

sketch_dec28a:74: error: ‘class Button’ has no member named ‘flagClick’

button1.flagClick= false;

^

sketch_dec28a:75: error: ‘class Button’ has no member named ‘flagClick’

button2.flagClick= false;

^

sketch_dec28a:82: error: ‘class Button’ has no member named ‘flagPress’

if ( (button1.flagPress == false) || (button2.flagPress == false) ) commonTimer= 0;

^

sketch_dec28a:82: error: ‘class Button’ has no member named ‘flagPress’

if ( (button1.flagPress == false) || (button2.flagPress == false) ) commonTimer= 0;

^

sketch_dec28a:86: error: ‘class Button’ has no member named ‘flagClick’

button1.flagClick= false;

^

sketch_dec28a:87: error: ‘class Button’ has no member named ‘flagClick’

button2.flagClick= false;

^

sketch_dec28a:109: error: ‘class Button’ has no member named ‘flagClick’

button1.flagClick= false;

^

sketch_dec28a:110: error: ‘class Button’ has no member named ‘flagClick’

button2.flagClick= false;

^

sketch_dec28a:117: error: ‘class Button’ has no member named ‘flagClick’

if ( (button1.flagClick == true) || (button2.flagClick == true) ) {


^

sketch_dec28a:117: error: ‘class Button’ has no member named ‘flagClick’

if ( (button1.flagClick == true) || (button2.flagClick == true) ) {

^

sketch_dec28a:120: error: ‘class Button’ has no member named ‘flagClick’

button1.flagClick= false;

^

sketch_dec28a:121: error: ‘class Button’ has no member named ‘flagClick’

button2.flagClick= false;

^

sketch_dec28a:143: error: ‘class Button’ has no member named ‘flagClick’

button1.flagClick= false;

^

sketch_dec28a:144: error: ‘class Button’ has no member named ‘flagClick’

button2.flagClick= false;

^

sketch_dec28a:169: error: ‘class Button’ has no member named ‘flagClick’

button1.flagClick= false;

^

sketch_dec28a:170: error: ‘class Button’ has no member named ‘flagClick’

button2.flagClick= false;

^

sketch_dec28a:195: error: ‘class Button’ has no member named ‘flagClick’

button1.flagClick= false;

^

sketch_dec28a:196: error: ‘class Button’ has no member named ‘flagClick’

button2.flagClick= false;

^

sketch_dec28a:212: error: ‘class Button’ has no member named ‘flagClick’

if ( (button1.flagClick == true) || (button2.flagClick == true) ) {


^

sketch_dec28a:212: error: ‘class Button’ has no member named ‘flagClick’

if ( (button1.flagClick == true) || (button2.flagClick == true) ) {

^

sketch_dec28a:217: error: ‘class Button’ has no member named ‘flagClick’

if ( button1.flagClick == true ) {

^

sketch_dec28a:218: error: ‘class Button’ has no member named ‘flagClick’

button1.flagClick= false;

^

sketch_dec28a:222: error: ‘class Button’ has no member named ‘flagClick’

if ( button2.flagClick == true ) {

^

sketch_dec28a:223: error: ‘class Button’ has no member named ‘flagClick’

button2.flagClick= false;

^

sketch_dec28a:236: error: ‘class Button’ has no member named ‘flagClick’

button1.flagClick= false;

^

sketch_dec28a:237: error: ‘class Button’ has no member named ‘flagClick’

button2.flagClick= false;

^

sketch_dec28a:253: error: ‘class Button’ has no member named ‘flagPress’

if ( button1.flagPress == true ) Serial.print(» Btn1 -_- «);

^

sketch_dec28a:255: error: ‘class Button’ has no member named ‘flagPress’

if ( button2.flagPress == true ) Serial.print(«Btn2 -_- «);


^

C:Users27C6~1AppDataLocalTemparduino_modified_sketch_57337sketch_dec28a.ino: In function ‘void timerInterrupt()’:

sketch_dec28a:273: error: ‘class Button’ has no member named ‘filterAvarage’

button1.filterAvarage(); // вызов метода фильтрации сигнала кнопки 1

^

sketch_dec28a:274: error: ‘class Button’ has no member named ‘filterAvarage’

button2.filterAvarage(); // вызов метода фильтрации сигнала кнопки 2

^

C:Users27C6~1AppDataLocalTemparduino_modified_sketch_57337sketch_dec28a.ino: In function ‘void secretCodCheck()’:

sketch_dec28a:302: error: ‘class Button’ has no member named ‘flagClick’

if ( (button1.flagClick == true) || (button2.flagClick == true) ) {

^

sketch_dec28a:302: error: ‘class Button’ has no member named ‘flagClick’

if ( (button1.flagClick == true) || (button2.flagClick == true) ) {

^

sketch_dec28a:306: error: ‘class Button’ has no member named ‘flagClick’

if ( button1.flagClick == true ) {

^

sketch_dec28a:307: error: ‘class Button’ has no member named ‘flagClick’

button1.flagClick= false;

^

sketch_dec28a:311: error: ‘class Button’ has no member named ‘flagClick’


if ( button2.flagClick == true ) {

^

sketch_dec28a:312: error: ‘class Button’ has no member named ‘flagClick’

button2.flagClick= false;

^

sketch_dec28a:326: error: ‘class Button’ has no member named ‘flagClick’

button1.flagClick= false;

^

sketch_dec28a:327: error: ‘class Button’ has no member named ‘flagClick’

button2.flagClick= false;

^

sketch_dec28a:336: error: ‘class Button’ has no member named ‘flagPress’

if ( (button1.flagPress == true) && (button2.flagPress == true) ) {

^

sketch_dec28a:336: error: ‘class Button’ has no member named ‘flagPress’

if ( (button1.flagPress == true) && (button2.flagPress == true) ) {

^

sketch_dec28a:337: error: ‘class Button’ has no member named ‘flagClick’

button1.flagClick= false;

^

sketch_dec28a:338: error: ‘class Button’ has no member named ‘flagClick’

button2.flagClick= false;

^

Несколько библиотек найдено для «Button.h»
Используется: C:UsersРусланDocumentsArduinolibrariesButton
Не используется: D:ПРОГРАММЫАрдуиноarduino-1.8.0-windowsarduino-1.8.0librariesButton
Несколько библиотек найдено для «MsTimer2.h»
Используется: C:UsersРусланDocumentsArduinolibrariesMsTimer2
Не используется: D:ПРОГРАММЫАрдуиноarduino-1.8.0-windowsarduino-1.8.0librariesMsTimer2
exit status 1
no matching function for call to ‘Button::Button(int, int)’

Этот отчёт будет иметь больше информации с
включенной опцией Файл -> Настройки ->
«Показать подробный вывод во время компиляции»

Источник: mypractic.ru

Вот поправленный исходник. В комментариях ссылки на необходимые библиотеки.

Компилируется. В железе не проверял.

 // GSM сигнализация на Arduino c использованием датчиков движения  // Original thread: http://arduino.ru/forum/proekty/gsm-signalizatsiya#comment-50135 // GSM Shield sources: https://github.com/MarcoMartines/GSM-GPRS-GPS-Shield // OneWire sources (OneWire-master.zip): http://www.pjrc.com/teensy/td_libs_OneWire.html / https://github.com/PaulStoffregen/OneWire // DHT sources (DHT-sensor-library-master.zip): https://github.com/adafruit/DHT-sensor-library  // Датчики движения - на аналоговых входах (можно выключать сразу не подключенные каналы) // Постановка и снятие ключем с информированием СМС. // Сирена и индикация работы // Контроль температуры и влажности в помещении где стоит блок сигнализации, и температуры во всех комнатах где стоят датчики движения. // Датчики рекомендую использовать профессиональные, например "G.S.N. PATROL-201 PET", внутри есть стабилизатор на 5 вольт, откуда запитаны температурные датчики ds18b20  // ??? Для работы GSM Shield надо соединить 0,1 или 2,3 (в зависимости от установленной перемычки) и пины 7,8 (8 - включение, 7 - сброс).  // Прописать нужные пины в GSM.h: // #define GSM_ON              8 // connect GSM Module turn ON to pin 8 (получается параллельно SW1)  // #define GSM_RESET           9 // connect GSM Module RESET to pin 9 // еще вроде как можно использовать выход RING, вроде как на пин D7. В документации или схеме что-то такое было.  // Прописать нужные пины в GSM.cpp: // #define _GSM_TXPIN_ 2 // #define _GSM_RXPIN_ 3  // 2,3 - Software Serial; 0,1 - Atmega USART  //   D0 - hardware USART //   D1 - hardware USART //   D2 - SIM900 SoftSerial TX //   D3 - SIM900 SoftSerial RX  //  *D4 - Светодиоды на контакторах I-button для удобства //   D5 - сирена //  *D6 - реле индикации работы сигнализации // а чо не D13 ??? //  *D7 - SIM900 Ring (not used) // ???  //   D8 - SIM900 On/Off switch //   D9 - SIM900 Reset switch //  D10 - ds1820 sensor //  D11 - DTH sensor //  D12 - ibutton // *D13 - встроенный светодиод   //   A0-A5 - датчики движения //  *A4 - SDA //  *A5 - SCL   // В строках типа sms.SendSMS(xxx,SMS_Buffer) заменить xxx на номер телефона  //#define DEBUGING #define SIM900  #include "SIM900.h" #include <SoftwareSerial.h> #include "sms.h" #include "DHT.h" #include <OneWire.h>  SMSGSM sms; DHT dht(11, DHT22); OneWire ibutton(12);  // пин ??? контекторы для снятия и постановки на сигнализацию брелком OneWire ds(10); //пин ??? Температурные датчики (расположены в датчиках движения)  boolean notConnected = true; //char senderNumber[20];   bool Alarm;//если тру - надо ехать и бить лицо синеносым String Message="";//Сообщение на выдачу в СМС String RecieverNumber="+7xxxxxxx"; //номер, на который слать СМС - какой формат - пока хз. char SMS_Buffer[160];//временный буфер для смс char Number_Buffer[20]; //временный буфер номера, на который слать СМС   int AnalogSensors[8]; byte PortNum[8]; byte PortQ; #define AlertPin 5 //пин - реле сирены #define LightPin 6 // пин - реле индикации работы сигнализации #define LedPin 4 // пин - Светодиоды на контакторах I-button для удобства #define TimeOutLenght 180000 //таймаут const byte Keys[5][8]={00000000, 00000000, 00000000, 00000000, 00000000}; //в каком виде ключи должны быть ??? 5 ключей по 8 байт ??? мои ключи забил жестко  boolean Led; boolean TimeOut=true; //признак недавней сработки сигнализации boolean Armed=true; //ставим сразу на сигнализацию unsigned long LedTime; //для мигания без задержки unsigned long time;//для проверки таймаута после сработки  void setup() {  dht.begin(); #if defined DEBUGING Serial.begin(9600); Serial.println("GSM Shield testing."); #endif    pinMode(AlertPin, OUTPUT);      digitalWrite(AlertPin, HIGH);   pinMode(LightPin, OUTPUT);         digitalWrite(LightPin, HIGH);     pinMode(LedPin, OUTPUT);        pinMode(13, OUTPUT); // ???   TestAnalog(); //проверка подключенных сенсоров   Message+="Setup->Armed."; #if defined SIM900      if (gsm.begin(2400)){//включает шилд корректно //    Serial.println("nstatus=READY");   }   //else Serial.println("nstatus=IDLE");    while (sms.IsSMSPresent(SMS_ALL)) sms.DeleteSMS(sms.IsSMSPresent(SMS_ALL));//удаляем СМС #endif #if !defined DEBUGING         RecieverNumber.toCharArray(Number_Buffer,160);  Message.toCharArray(SMS_Buffer,160);  sms.SendSMS(Number_Buffer,SMS_Buffer);//Send SMS #endif  #if defined DEBUGING   Serial.print(Message); #endif        TimeOut=false;   digitalWrite(13,HIGH); // ???   time = millis()+20000;  }   void loop() {   if ((LedTime<millis())&&Armed){      digitalWrite(LedPin, Led);        if (TimeOut) digitalWrite(13, Led);  // ???      Led=!Led;      LedTime=millis()+500;//задержка мигания светодиода   } #if defined DEBUGING   //Serial.print("1"); #endif         if (Armed && TimeOut) //проверка датчиков движения  {   Message="Security system:Alarm!Sensors port:";   for (int k=0;k<PortQ;++k) {    AnalogSensors[k] = analogRead(PortNum[k]);    if (AnalogSensors[k]>100)     {     Alarm=true;//ура поймаем бомжей     Message+=(PortNum[k]+1);     Message+=",";    }   }   if (Alarm) Alarming();  }   CheckKey(); #if defined DEBUGING   //Serial.print("2"); #endif             if (!TimeOut) //проверка истечения задержки  {   if (time<millis())    {    TimeOut=true;    Disalarming();   }     } #if defined SIM900   while (sms.IsSMSPresent(SMS_ALL))   //читаем входящую СМС       {         char position;     char sms_text[10];         position = sms.IsSMSPresent(SMS_ALL);   char phone_number[20]; // array for the phone number          if (position)    {    sms.GetSMS(position, phone_number, sms_text, 10);    sms.DeleteSMS(position);    if (((sms_text[0]=='o')||(sms_text[0]=='O'))&&(sms_text[1]=='n')) Arming(0);    if (((sms_text[0]=='o')||(sms_text[0]=='O'))&&(sms_text[1]=='f')&&(sms_text[2]=='f')) Disarming(0);   }  } #endif         } void TestAnalog() { PortQ=0; int portValue; String GoodPort="",CndPort="",DataPort=""; Message ="Ports:"; for (byte k=0;k<8;++k) {   portValue= analogRead(k);   Message+=portValue;   Message+=",";  // Serial.println(portValue);    if ((portValue<100)||(portValue>1000)) {     GoodPort+=(k+1);     GoodPort+=",";     PortNum[PortQ]=k;     PortQ++;   } else               {                     CndPort+=(k+1);                     CndPort+=",";               } } if (GoodPort!=""){   Message+=" conn=";   Message+=GoodPort; } if (CndPort!=""){   Message+=" NC=";   Message+=CndPort; } if (GoodPort!=""){   Message+=" control ";   Message+=PortQ;   Message+=" pcs.";   }   else Message+=" idle.";    Message+=" Hum=";   Message+= (int)dht.readHumidity();   Message+="% Temp=";   Message+= dht.readTemperature();   Message+="C";   ReadDS(); #if defined DEBUGING Serial.println(Message); #endif        } void Disarming(byte KeyNum) {  Disalarming();  digitalWrite(LightPin, HIGH);//выключили индикацию  digitalWrite(LedPin, LOW);   //потушили индикатор на контакторах  TestAnalog();  if (Armed) Message+=" disarmed "; else Message+=" Been disarmed.";  if (KeyNum) {    Message+="by KEY no";    KeyNum++;    Message+=KeyNum;  } else Message+="by SMS";  char SMS_Buffer[160];  Message.toCharArray(SMS_Buffer,160);  Armed=false;  sms.SendSMS(Number_Buffer,SMS_Buffer);//Send SMS } void Arming(byte KeyNum) {  TimeOut=false;  time = millis()+20000;  digitalWrite(13,HIGH);  // ???  digitalWrite(LightPin, LOW);//включили индикацию  digitalWrite(AlertPin, LOW);//включили сирену  digitalWrite(LedPin, LOW);   //потушили индикатор на контакторах  delay(30);  digitalWrite(AlertPin, HIGH);//выключили сирену  TestAnalog();  if (!Armed) Message+=" armed "; else Message+=" Been armed.";  Armed=true;  if (KeyNum)   {    Message+="by key no";    KeyNum++;    Message+=KeyNum;   } else Message+="by SMS";  Message.toCharArray(SMS_Buffer,160);  Armed=true;  sms.SendSMS(Number_Buffer,SMS_Buffer);//Send SMS } void Disalarming() {  Alarm=false;  digitalWrite(AlertPin, HIGH);//выключили сирену  digitalWrite(13,LOW); // ??? } void Alarming() {  TimeOut=false;  digitalWrite(13,HIGH); // ???     digitalWrite(AlertPin, LOW);//Включаем сирену     time = millis()+TimeOutLenght;//000;//таймаут что б смс не сыпались пачками.  Message.toCharArray(SMS_Buffer,160);  Alarm=true;  sms.SendSMS(Number_Buffer,SMS_Buffer);//Send SMS } void CheckKey() {   byte addr[8];   ibutton.reset_search();   if ( ibutton.search(addr)) {       ibutton.reset();     boolean KeyMatch=false;     byte Key=255;     for(byte m=0;m<5;m++)  {       KeyMatch=true;       for( byte i = 0; i < 8; i++) if (addr[i]!=Keys[m][i]){     KeyMatch=false;     break;    }       if (KeyMatch) {     Key=m+1;     break;    }  }  if (Key!=255)  {   Disalarming();     #if defined DEBUGING        Serial.print("Key connected ");      Serial.println(Key);     #endif      for( byte l = 0; l < 10; l++) {        delay(30);        digitalWrite(LedPin, HIGH);        delay(30);        digitalWrite(LedPin, LOW);               }    for( byte i = 0; i < Key; i++)     {     delay(300);     digitalWrite(LedPin, HIGH);     delay(100);     digitalWrite(LedPin, LOW);               }    if (Armed) Disarming(Key);else Arming(Key);  }  if (!KeyMatch)  {   Message="Wrong key connected!";   Alarming();   #if defined DEBUGING      Serial.print("Wrong Key ");//тревога    Serial.print(" ");    Serial.print(addr[0],HEX);    Serial.print(" ");    Serial.print(addr[1],HEX);    Serial.print(" ");    Serial.print(addr[2],HEX);    Serial.print(" ");    Serial.print(addr[3],HEX);    Serial.print(" ");    Serial.print(addr[4],HEX);    Serial.print(" ");    Serial.print(addr[5],HEX);    Serial.print(" ");    Serial.print(addr[6],HEX);    Serial.print(" ");    Serial.println(addr[7],HEX);   #endif       }              } } void ReadDS() {   byte i;   byte present = 0;   byte type_s;   byte data[12];   byte addr[8];   float celsius;   Message+= " DS temp:";   while( ds.search(addr)) { #if defined DEBUGING     Serial.print("ROM =");   for( i = 0; i < 8; i++) {     Serial.write(' ');     Serial.print(addr[i], HEX);   }   if (OneWire::crc8(addr, 7) != addr[7]) {       Serial.println("CRC is not valid!");       return;   } #endif   Message+= String(addr[0], HEX);    ds.reset();   ds.select(addr);   ds.write(0x44, 1);        // start conversion, with parasite power on at the end   delay(1000);     // maybe 750ms is enough, maybe not   // we might do a ds.depower() here, but the reset will take care of it.   present = ds.reset();   ds.select(addr);       ds.write(0xBE);         // Read Scratchpad    #if defined DEBUGING     Serial.print("  Data = "); #endif   for ( i = 0; i < 9; i++) {           // we need 9 bytes     data[i] = ds.read(); #if defined DEBUGING       Serial.print(data[i], HEX);     Serial.print(" "); #endif   } #if defined DEBUGING     Serial.print(" CRC=");   Serial.print(OneWire::crc8(data, 8), HEX); #endif    // Convert the data to actual temperature   // because the result is a 16 bit signed integer, it should   // be stored to an "int16_t" type, which is always 16 bits   // even when compiled on a 32 bit processor.   int16_t raw = (data[1] << 8) | data[0];     byte cfg = (data[4] & 0x60);     // at lower res, the low bits are undefined, so let's zero them     if (cfg == 0x00) raw = raw & ~7;  // 9 bit resolution, 93.75 ms     else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms     else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms     //// default is 12 bit resolution, 750 ms conversion time  raw = raw / 16.0*10;  celsius = (float)raw / 10;  //Message+= data[0];  Message+="=";  Message+=celsius; #if defined DEBUGING     Serial.print("  Temperature = ");   Serial.print(celsius);   Serial.println(" Celsius"); #endif   } }     

 

 

Источник: arduino.ru

В этом уроке нам понадобится:

  1. Модуль из 4 реле: http://ali.ski/vGIlhm
  2. Датчик газа MQ-2: http://ali.ski/6JRA_
  3. Датчик звука: http://ali.ski/9xeBwK
  4. Пьезоизлучатель: http://ali.ski/9mNnRi
  5. Датчик HC-SR501: http://ali.ski/EPkJs
  6. Контактные провода: http://ali.ski/Exjr3
  7. Макетная плата: http://ali.ski/rq8wz8
  8. Arduino uno: http://ali.ski/gC_mOa

Проект “Универсальная сигнализация” призван помочь вам защитить свой дом от разных напастей: несанкционированного проникновения в квартиру или дом и высокой концентрации углекислого газа.

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

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

  #define pirPin 9 // Объявляем переменную для датчика движения и указываем пин  int SoundPin = A4; //Объявляем переменную для датчика звука и указываем пин  int Count = 0;  int relay1 = 6; // Объявляем переменную для реле 1 и указываем пин  int relay2 = 5; // Объявляем переменную для реле 2 и указываем пин  int relay3 = 4; // Объявляем переменную для реле 3 и указываем пин  int relay4 = 3; // Объявляем переменную для реле 4 и указываем пин  const int gassensorpin = A5; //Объявляем переменную для сенсора газа, указываем пин  int gassensorvalue = 0; //Объявляем переменную для хранения значения с датчика газа и приравниваем ее к 0  int buzzer = 8; //Обявляем переменную для пьезоизлучателя, указываем пин  void setup() {   pinMode(SoundPin, INPUT); //Назначаем пин для датчика звука как вход   pinMode(pirPin, INPUT); // Назначаем пин датчика движения как вход   pinMode(relay1, OUTPUT); //назначаем пин как реле как выход   pinMode(relay2, OUTPUT); //назначаем пин как реле как выход   pinMode(relay3, OUTPUT); //назначаем пин как реле как выход   pinMode(relay4, OUTPUT); //назначаем пин как реле как выход  }     void loop() {   gassensorvalue = analogRead(gassensorpin);//Считываем значение с датчика газа   if (gassensorvalue >= 600) // задаем порог уровня загазованности    {   digitalWrite(relay1, LOW); // Включаем реле, к которому подключен вентилятор   tone(buzzer, 1915); //Подаем сигнал пьезоизлучателем   delay(3000);   }   else   {   digitalWrite(relay1, HIGH); //Выключаем реле с вентилятором   noTone(buzzer); //Выключаем сигнал пьезоизлучателя   }   int pirVal = digitalRead(pirPin);   if(pirVal == HIGH) // Если происходит движение    {   digitalWrite(relay2, LOW); //то Включаем реле, к которому подключено освещение   digitalWrite(relay3, LOW); // включаем реле, к которому подключено освещение   digitalWrite(relay4, LOW); // включаем реле, к которому подключено освещение   tone(buzzer, 1700); //Подаем сигнал пьезоизлучателем   delay (3000);   }   else   {   digitalWrite(relay2, HIGH); //Выключаем реле   digitalWrite(relay3, HIGH); //Выключаем реле   digitalWrite(relay4, HIGH); //Выключаем реле   noTone(buzzer); //Выключаем сигнал   }      Count=analogRead(A4);   if (Count>800)   {   digitalWrite(relay2, LOW); //Включаем реле, к которому подключено освещение   digitalWrite(relay3, LOW); //Включаем реле, к которому подключено освещение   digitalWrite(relay4, LOW); //Включаем реле, к которому подключено освещение   tone(buzzer, 1014); //Подаем сигнал пьезоизлучателем   delay(1000);   }   else   {   digitalWrite(relay2, HIGH); //Выключаем реле   digitalWrite(relay3, HIGH); //Выключаем реле   digitalWrite(relay4, HIGH); //Выключаем реле   noTone(buzzer); //Выключаем сигнал         }     }  

 

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

Я постарался прокомментировать каждую строчку кода, чтоб можно было изменять под себя и пины подключения и задержку между срабатываниями.

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

Источник: psenyukov.ru


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

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

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.