Домашняя сигнализация с оповещением на мобильный телефон - ФОРУМ ДВ Робот dvrobot.ru
Пятница, 01.11.2024, 09:06
Главная Мой профиль Регистрация Выход
  • НАШ МАГАЗИН
  • Вы вошли как Гость | Группа "Гости"Приветствую Вас, Гость
    [ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
    • Страница 1 из 1
    • 1
    Модератор форума: GRACH, Serg  
    Домашняя сигнализация с оповещением на мобильный телефон
    SergДата: Воскресенье, 07.10.2012, 23:53 | Сообщение # 1
    Ампер
    Группа: Модераторы
    Сообщений: 510
    Репутация: 28
    Статус: Offline
    Возможности:
    -контролирует входную дверь
    -обнаруживает движение в комнатах
    -обнаруживает протечку воду
    -прием/снятие на охрану/ с охраны ключом от домофона
    -отсылает SMS о событиях на телефон владельца
    -возможно подключения датчиков огня, влажности, давления,газа....
    прогрмма расчитана на подключение мобильного телефона Сименс (просто его не жалко было)
    возможно подключение такого шилда из нашего магазина

    текст программы разделен на 8 сообщений в связи с ограничением форума
     
    SergДата: Воскресенье, 07.10.2012, 23:58 | Сообщение # 2
    Ампер
    Группа: Модераторы
    Сообщений: 510
    Репутация: 28
    Статус: Offline
    Code

    //R=1 C FF 96 0 0 0 61 HEX - 1 12 255 0 0 0 97 ДЕСЯТИЧНЫЙ КОДЫ КОЮЧЕЙ
    //1 72 97 B1 C 0 0 88  
    //1 30 AA E 0 0 0 4B
    //1 C4 72 22 B 0 0 26

    #include <OneWire.h>
    #include "pitches.h"

    const byte iButtonPin = 3; //пин для ibutton
    const byte waterPin = 4; // пин датчика воды
    const byte pirPin = 5; // пин для СЕНСОРА ДВИЖЕНИЯ
    const byte yelowLed = 6; // лампочка индикатор движения
    const byte tonePin = 7; // пин для пищалки
    const byte gerkonPin = 8; //gerkon
    const byte greenLed = 9; //зеленая лампочка
    const byte redLed = 12;  //красная лампочка
    const byte calibrationTime = 3; // Время калибровки датчика (10-60 сек. по даташиту)

    const byte alarmTime = 10; // время, чтобы поднести ключ при разблокировке(ЧИСЛО МИГАНИЙ)
    const byte startTime = 5; // время на закрытие двери при постановке на сигнализацию(ЧИСЛО МИГАНИЙ)

    OneWire  ds(iButtonPin); //ibutton
    byte code1[8] = {0x01, 0x0C, 0xFF, 0x96, 0x00, 0x00, 0x00, 0x61};  //первый ключ
    byte code2[8] = {0x01, 0x72, 0x97, 0xB1, 0x0C, 0x00, 0x00, 0x88};  // второй ключ
    byte code3[8] = {0x01, 0x30, 0xAA, 0x0E, 0x00, 0x00, 0x00, 0x4B};  //ЧЕТВЕРТЫй ключ
    byte code4[8] = {0x01, 0xC4, 0x72, 0x22, 0x0B, 0x00, 0x00, 0x26};  // третийй ключ

    boolean waterAlarmed = 0; //флаг сработавшего оповещения о воде
    boolean alarmState = 0; //флаг работающей сигнализации
    boolean gerkonState = 0; //первично закрытая дверь (1 - закрыто, 0 - открыто), пока на кнопке.
    boolean Hacked = 0;
    // стандартные коды: 1- включение, 2- выключение, 3- тревога
    boolean lockLow = true; // ИЗНАЧАЛЬНО ПРАВДА
    boolean takeLowTime;  
    long unsigned int pause = 30000; //30 секунд паузы между срабатываниями датчика движения
    long unsigned int lowIn;

     
    SergДата: Понедельник, 08.10.2012, 00:00 | Сообщение # 3
    Ампер
    Группа: Модераторы
    Сообщений: 510
    Репутация: 28
    Статус: Offline
    продолжение
    Code

    void setup()
    {
      Serial.begin(9600);
      delay(2000); //задержка включения
      pinMode(greenLed, OUTPUT); //задаем режим работы пинов
      pinMode(redLed, OUTPUT);
             pinMode(yelowLed, OUTPUT);
      pinMode(waterPin, INPUT);
      pinMode(gerkonPin, INPUT);
             digitalWrite(pirPin, LOW);
             pinMode(pirPin, INPUT);
             ////
              
             ////
             //attachInterrupt(0, water, CHANGE); // привязываем 0-е прерывание к функции water
             //дадим датчику время на калибровку
       Serial.print("calibrating sensor ");
         for(int i = 0; i < calibrationTime; i++){// 30 СЕКУНД КАЛИБРУЕТСЯ
           Serial.print(".");
           delay(1000);
           }
         Serial.println(" done");
         Serial.println("SENSOR ACTIVE");
         delay(50);
         Serial.println("DHT11 test!");
      Notify(98); // оповещение о включении ардуино (напр. после перезагрузки)

    }

     
    SergДата: Понедельник, 08.10.2012, 00:04 | Сообщение # 4
    Ампер
    Группа: Модераторы
    Сообщений: 510
    Репутация: 28
    Статус: Offline
    продолжение
    Code

    void loop()
    {
      byte returnedValue = 0; // обнуляем значение
      if(alarmState==0) { //Сигнализация выключена, ждем пока поднесут ключ для ВКЛЮЧЕНИЯ
       returnedValue = findKey();
       if (returnedValue == 1)  { // нашли известный ключ
        guardON(); //вкл статус сигнализации
         Serial.println("on");
       }
      }
      if(alarmState==1) { // если включена сигнализация, то
       gerkonState = digitalRead(gerkonPin); //смотрим геркон
       //Serial.println(gerkonState, HEX);
       if (gerkonState == 1 && Hacked != 1) { //открылась дверь и квартира не взломана <img src="http://s70.ucoz.net/sm/1/wink.gif" border="0" align="absmiddle" alt="wink" />
        Notify(1); // сообщаем компьютеру об открытии двери
        alarmON(); //включаем сигналку
       }
       returnedValue = findKey(); //нужно выключить изнутри квартиры
       if (returnedValue == 1)  { // нашли известный ключ и
        alarmState=0;
        guardOFF();
       }
      }
     
    SergДата: Понедельник, 08.10.2012, 00:05 | Сообщение # 5
    Ампер
    Группа: Модераторы
    Сообщений: 510
    Репутация: 28
    Статус: Offline
    Code
    returnedValue = 0; //обнуляем для обработки датчиков воды
      returnedValue = checkWater();
      if (returnedValue==1) { // запускаем оповещение о срабатывании датчика воды
       Notify(10); //сообщаем о срабатывании датчика воды
                  
      }
       if(digitalRead(pirPin) == HIGH){ //СРАВНИВАЕМ ВЫХОД ДАТЧИКА С ВЫСОКИМ
            digitalWrite(yelowLed, HIGH);   //СВЕТИК ПОКАЗЫВАЕТ СОСТОЯНие  датчико ДВИЖЕНИЯ-сработал или нет
            if(lockLow&& alarmState==1){  // если уровень датчика движения высокий и сигналка включена  
              //гарантирует, что мы ждем перехода к низкому уровню до того, как дальнейший вывод сделан:
              lockLow = false ;   
                        
              /*Serial.println("---");
              Serial.print("motion detected at ");// ОБНАРУЖЕНО ДВИЖЕНИЕ В ,, СЕКУНД
              Serial.print(millis()/1000);
              Serial.println(" sec");  
              delay(50);*/
              Notify(4); // сообщаем компьютеру о движении в квартире
              }          
              takeLowTime = true;// БЕРЕМ НИЗКОЕ ВРЕМЯ РАНВНО ПРАВДА
            }
       
          if(digitalRead(pirPin) == LOW){ //сравниваем выход датчика снизким уровнем       
            digitalWrite(yelowLed, LOW);  // светик ПОКАЗЫВАЕТ СОСТОЯНИЕ  датчика
       
            if(takeLowTime){
             lowIn = millis();          //сэкономить время перехода от высокого до низкого
             takeLowTime = false;       //убедитесь, что это делается только в начале фазы LOW
             }
            //если датчик низкого за более чем данная пауза,
            //Мы считаем, что движение больше не произойдет И НЕ  
            if(!lockLow && millis() - lowIn > pause){   
                //гарантирует, что этот блок кода выполняется только раз после
                //Новая последовательность движений была обнаружена
                lockLow = true;                         
                 //Serial.print("motion eted at ");
                delay(50);
                }
                 
            }
      delay (500);

    }
     
    SergДата: Понедельник, 08.10.2012, 00:06 | Сообщение # 6
    Ампер
    Группа: Модераторы
    Сообщений: 510
    Репутация: 28
    Статус: Offline
    Code
    int checkWater() //функция проверки датчика воды
    {
      int WsensorState = digitalRead(waterPin);
      //Serial.println(WsensorState);
      if (WsensorState == 1 && waterAlarmed ==0 ){
       waterAlarmed =1;
                     guardSound(5); // бибикаем  
                   //Serial.println("VODA");
       return 1;
                     
      }
      return 0;
    }
    int findKey() // функция поиска ключа
    {
      byte i;
      byte addr[5];
      byte checkOK = 0; //счетчик совпадений массива с эталоном
      //Serial.println("searching key...");
      if ( !ds.search(addr)) {  // тут надо сделать нормально сделатЬ!!!
       ds.reset_search();
       for( i = 0; i < 5; i++) { // КРИВОКОД
        if (addr[i]==code1[i] || addr[i]==code2[i] || addr[i]==code3[i] || addr[i]==code4[i]) {
         checkOK++;
        }
       }
       if (checkOK == 5 )
       return 1;
      }
    return 0;
    }
     
    SergДата: Понедельник, 08.10.2012, 00:06 | Сообщение # 7
    Ампер
    Группа: Модераторы
    Сообщений: 510
    Репутация: 28
    Статус: Offline
    Code
    void guardON() // выполнение действие при на сигнализацию
    {
      int j;
      alarmState=1; //включаем статус сигнализации
      guardSound(1); //бибикаем
      for (j=0; j < startTime; j++) {
       guardBlink(1); //моргаем лампочками и ждем время для закрытия двери
      }
      Notify(0);
    }
    void guardOFF() // выполнение действие при снятии с сигнализации
    {
      alarmState=0; // выключаем статус сигнализации
      Hacked = 0; // отменям статус "взломано"
      digitalWrite(greenLed, LOW);
      guardSound(2); //бибикаем
      guardBlink(2); //моргаем лампочками
      Notify(3);
    }
    int alarmON() // выполнение действий при срабатывании сигнализации
    {
      int checkcount=0;
      while (checkcount < alarmTime) { // даем alarmTime секунд для поднесения ключа
       int alarmCancel = findKey(); //ищем ключик
       if (alarmCancel == 1) { // нашли ключ
        guardOFF(); //отключаем сигналку,
        break; // выходим из цикла
       }
       checkcount++;
       guardBlink(3); //пищим о том, что ищем ключ
       guardSound(3); //светим о том, что ищем ключ
      }
      if (checkcount==alarmTime) { // если не нашли, то включаем оповещение
       Notify(2);
       guardBlink(4); //пищим о том, что УСЁ ПРОПАЛО
       guardSound(4); //светим о том, что УСЁ ПРОПАЛО
       Hacked = 1;
      }
    }
     
    SergДата: Понедельник, 08.10.2012, 00:07 | Сообщение # 8
    Ампер
    Группа: Модераторы
    Сообщений: 510
    Репутация: 28
    Статус: Offline
    Code
    int guardBlink (int x) //функция светового оповещения
    {
      if (x==1) { // первое ожидание для закрытия двери.
       digitalWrite(redLed, HIGH);
       digitalWrite(greenLed, LOW);
       delay(500);
       digitalWrite(redLed, LOW);
       digitalWrite(greenLed, HIGH);
       delay(500);
      }
      if (x==2) { // выключаем сигнализацию и диоды
       digitalWrite(redLed, LOW);
       digitalWrite(greenLed, LOW);
      }
      if (x==3) { // во время ожидания ключа при открытой двери
       digitalWrite(redLed, HIGH);
       delay (250);
       digitalWrite(redLed, LOW);
       delay (250);
      }
      if (x==4) { // просрочено, ахтунг
       digitalWrite(redLed, HIGH);
      }
    }
    int guardSound (int x)  //функция звукового оповещения
    {
      if (x==1) {
       int melody[] = { // музыка при включении сигнализацию
        NOTE_B6, NOTE_C6, NOTE_D6, NOTE_G6,  
       };
       int noteDurations[] = {
        8, 8, 8, 4, // ДЛИТЕЛЬНОСТЬ НОТ 4 = четверть ноты, 8 = восьмая часть,  
       };
       for (int thisNote = 0; thisNote < 4; thisNote++) {        // ПЕРЕБОР ВСЕХ ВОСЬМИ НОТ
        int noteDuration = 1000/noteDurations[thisNote];
        tone(tonePin, melody[thisNote],noteDuration);
        int pauseBetweenNotes = noteDuration * 1.30;
        delay(pauseBetweenNotes);
        noTone(tonePin);
       }
      }
      if (x==2) { // выключаем сигнализацию
       int melody[] = {
        NOTE_C4, NOTE_G3,NOTE_G4, NOTE_A3, NOTE_G3,2, NOTE_B4, NOTE_C5
       };
       int noteDurations[] = {
        4, 8, 8, 4,4,4,4,4
       };
       for (int thisNote = 0; thisNote < 8; thisNote++) {
        int noteDuration = 1000/noteDurations[thisNote];
        tone(tonePin, melody[thisNote],noteDuration);
        int pauseBetweenNotes = noteDuration * 1.30;
        delay(pauseBetweenNotes);
        noTone(tonePin);
       }
      }
      if (x==3) { //тон ожидания ключа
       tone(tonePin,NOTE_C4, 100);
      }
      if (x==4) { //тон просроченного ключа
       tone(tonePin,NOTE_E4, 500);
      }
             if (x==5) { //тон просроченного ключа
       tone(tonePin,NOTE_F6, 500);
      }
    }
     
    SergДата: Понедельник, 08.10.2012, 00:07 | Сообщение # 9
    Ампер
    Группа: Модераторы
    Сообщений: 510
    Репутация: 28
    Статус: Offline
    Code
    int Notify(int x) //функция оповещения  в мобильный телефон
    {
      if (x==0) { // оповещение о постановке на сигнализацию
       Serial.println("0x00-ohrana-on");// здесь пишем код под конкретный GSM модем
      }
      if (x==1) { // оповещение о открытии двери
       Serial.println("0x01-otkrytye _dveri"); //здесь пишем код под конкретный GSM модем
      }
      }
      if (x==2) { // оповещение о взломе квартиры!
       Serial.println("0x02-vzlom");
      }
      if (x==3) { // оповещение о выключении сигнализации
       Serial.println("0x03-ohrana-off");
      }
             if (x==4) { // оповещение о движухе
       Serial.println("0x03-dvizgenie d kvartire");
      }
      if (x==98) { // оповещение о включении ardunio
       Serial.println("9x98");
      }
      if (x==99) { // оповещение о ОШИБКЕ
       Serial.println("9x99");
      }
             if (x==10) { // оповещение о затоплении  
       Serial.println("9x-VODA");
      }
    }
     
    • Страница 1 из 1
    • 1
    Поиск:

    ДВ Робот - Чат