Домашняя сигнализация с оповещением на мобильный телефон
|
|
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"); } }
|
|
| |