Звукавая сигнализация
- Войдите на сайт для отправки комментариев
народ имееться магнит на дверь и сам контакт типо такого:

нужна помощь в реализации скетча.
(при поднисении магнита контакт замкнут)
что должно уметь:
имееться это(назовем кнопка 1)
ibutton reader
2 светодиода
при открытии двери (размыкании кнопки 1) начал инициализироваться звон
int p = 3; //объявляем переменную с номером пина, на который мы
//подключили пьезоэлемент
void setup() //процедура setup
{
pinMode(p, OUTPUT); //объявляем пин как выход
}
void loop() //процедура loop
{
tone (p, 500); //включаем на 500 Гц
delay(100); //ждем 100 Мс
tone(p, 1000); //включаем на 1000 Гц
delay(100); //ждем 100 Мс
}
и не важно в каком положении кнопка 1 после запуска кода сирены, отключить можно только ibuttonom
для отключения "сирены" использовался бы ibutton (на основе этого кода)
// Based on <a href="https://danman.eu/blog/cloning-ibutton-using-rw1990-and-avr/" title="https://danman.eu/blog/cloning-ibutton-using-rw1990-and-avr/" rel="nofollow">https://danman.eu/blog/cloning-ibutton-using-rw1990-and-avr/</a> // and: <a href="http://elimelecsarduinoprojects.blogspot.com/2013/06/read-dallas-ibutton-arduino.html" title="http://elimelecsarduinoprojects.blogspot.com/2013/06/read-dallas-ibutton-arduino.html" rel="nofollow">http://elimelecsarduinoprojects.blogspot.com/2013/06/read-dallas-ibutton...</a> // By Swift Geek 28-08-2015 // TODO: danger to atmega328! Use OpenCollector logic! // Used 4.8kΩ Pull-up and 3.1 Vcc for arduino/pull-up #include <OneWire.h> #define pin 5 OneWire ibutton (pin); // I button connected on PIN 2. byte addr[8]; //array to store the Ibutton ID. void setup(){ Serial.begin(115200); } void loop(){ if (!ibutton.search (addr)){//read attached ibutton and asign value to buffer ibutton.reset_search(); delay(200); return; } Serial.print(millis()/1000); Serial.print("> "); for (byte x = 0; x<8; x++){ Serial.print(addr[x],HEX); //print the buffer content in LSB. For MSB: for (int x = 8; x>0; x--) Serial.print(" "); } //compute crc// byte crc; crc = ibutton.crc8(addr, 7); Serial.print("CRC: "); Serial.println(crc,HEX); if ( Serial.read() == 'w' ){ ibutton.skip();ibutton.reset();ibutton.write(0x33); Serial.print(" ID before write:"); for (byte x=0; x<8; x++){ Serial.print(' '); Serial.print(ibutton.read(), HEX); } // send reset ibutton.skip(); ibutton.reset(); // send 0xD1 ibutton.write(0xD1); // send logical 0 digitalWrite(pin, LOW); pinMode(pin, OUTPUT); delayMicroseconds(60); pinMode(pin, INPUT); digitalWrite(pin, HIGH); delay(10); Serial.print('\n'); Serial.print(" Writing iButton ID:\n "); // Hardcode here your desired ID // // 01 D5 9F DC 02 00 00 96 byte newID[8] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; ibutton.skip(); ibutton.reset(); ibutton.write(0xD5); for (byte x = 0; x<8; x++){ writeByte(newID[x]); Serial.print('*'); } Serial.print('\n'); ibutton.reset(); // send 0xD1 ibutton.write(0xD1); //send logical 1 digitalWrite(pin, LOW); pinMode(pin, OUTPUT); delayMicroseconds(10); pinMode(pin, INPUT); digitalWrite(pin, HIGH); delay(10); } } int writeByte(byte data){ int data_bit; for(data_bit=0; data_bit<8; data_bit++){ if (data & 1){ digitalWrite(pin, LOW); pinMode(pin, OUTPUT); delayMicroseconds(60); pinMode(pin, INPUT); digitalWrite(pin, HIGH); delay(10); } else { digitalWrite(pin, LOW); pinMode(pin, OUTPUT); pinMode(pin, INPUT); digitalWrite(pin, HIGH); delay(10); } data = data >> 1; } return 0; }
код ibuttona { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; - отключаеи звук
код ibuttona2 { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; - прислонил отключил любые дествия на кнопку1 (сигнализация назоем ее так выключеном состоянии) прислонил второй раз включает сигнализацию
нужно уместить как то все в один скетч( я в написании не селен по этому и прошу помощи форумчан и знатаков)
да, вот нашел вариант
#include <OneWire.h> #include "pitches.h" const byte greenLed = 10; //зеленая лампочка const byte redLed = 11; //красная лампочка const byte gerkonPin = 8; //gerkon const byte iButtonPin = 12; //пин для ibutton const byte tonePin = 7; // пин для пищалки const byte waterPin = 9; // пин датчика воды const byte alarmTime = 15; // время, чтобы поднести ключ при разблокировке const byte startTime = 10; // время на закрытие двери при постановке на сигнализацию OneWire ds(iButtonPin); //ibutton byte code1[5] = {0x01, 0x58, 0x3E, 0xD8, 0x11}; //первый ключ byte code2[5] = {0x01, 0x90, 0xBA, 0xAB, 0x00}; // второй ключ boolean waterAlarmed = 0; //флаг сработавшего оповещения о воде boolean alarmState = 0; //флаг работающей сигнализации boolean gerkonState = 0; //первично закрытая дверь (1 - закрыто, 0 - открыто), пока на кнопке. boolean Hacked = 0; // стандартные коды: 1- включение, 2- выключение, 3- тревога void setup() { Serial.begin(9600); delay(2000); //задержка включения pinMode(greenLed, OUTPUT); //задаем режим работы пинов pinMode(redLed, OUTPUT); pinMode(waterPin, INPUT); pinMode(gerkonPin, INPUT); Notify(98); // оповещение о включении ардуино (напр. после перезагрузки) } void loop() { byte returnedValue = 0; if(alarmState==0) { //Сигнализация выключена, ждем пока поднесут ключ для ВКЛЮЧЕНИЯ returnedValue = findKey(); if (returnedValue == 1) { // нашли известный ключ guardON(); //вкл статус сигнализации } } if(alarmState==1) { // если включена сигнализация, то gerkonState = digitalRead(gerkonPin); //смотрим геркон //Serial.println(gerkonState, HEX); if (gerkonState == 1 && Hacked != 1) { //открылась дверь и квартира не взломана ;) Notify(1); // сообщаем компьютеру об открытии двери alarmON(); //включаем сигналку } returnedValue = findKey(); //нужно выключить изнутри квартиры if (returnedValue == 1) { // нашли известный ключ и alarmState=0; guardOFF(); } } returnedValue = 0; //обнуляем для обработки датчиков воды //returnedValue = checkWater(); //if (returnedValue==1) { // запускаем оповещение о срабатывании датчика воды // Notify(10); //сообщаем о срабатывании датчика воды //} delay (500); } int checkWater() //функция проверки датчика воды { int WsensorState = analogRead(waterPin); //Serial.println(WsensorState); if (WsensorState == 1 && waterAlarmed == 0){ waterAlarmed =1; 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]) { checkOK++; } } if (checkOK == 5 ) return 1; } return 0; } 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; } } 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_G3, NOTE_G3, NOTE_G3 }; int noteDurations[] = { 4,4,4 }; for (int thisNote = 0; thisNote < 3; 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_C2, NOTE_G1,NOTE_G2, NOTE_A1, NOTE_G1,0, NOTE_B2, NOTE_C3 }; 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); } } int Notify(int x) //функция оповещения в последователньый порт { if (x==0) { // оповещение о постановке на сигнализацию Serial.println("0x00"); } if (x==1) { // оповещение о открытии двери Serial.println("0x01"); } if (x==2) { // оповещение о взломе квартиры! Serial.println("0x02"); } if (x==3) { // оповещение о выключении сигнализации Serial.println("0x03"); } if (x==98) { // оповещение о включении ardunio Serial.println("9x98"); } if (x==99) { // оповещение о ОШИБКЕ Serial.println("9x99"); } }но вместо геркона надо прописать "кнопку"
Это как? Чем должна отличаться в коде кнопка от геркона?
при размыкании включалась б да и код сам частино нерабочий(
ни ключ не читает не моргает светодиодами и не играеться сирена
но вместо геркона надо прописать "кнопку"
А кнопка круглая или квадратная?
"кнопка" по схеме такая вот так работает при поднисение магнита контакт появляеться при убирание магнита контакт размыкаеться тоесть вместо механического нажатие идет нажатие от магнитного поля по сути это кнопка
при размыкании включалась б
ОК, чем должно отличаться в коде размыкание кнопки от размыкания геркона?
"кнопка" по схеме такая вот так работает при поднисение магнита контакт появляеться при убирание магнита контакт размыкаеться тоесть вместо механического нажатие идет нажатие от магнитного поля по сути это кнопка
Это всё понятно, так и должен работать геркон. Непонятно, что Вы хотели сказать фразой "но вместо геркона надо прописать "кнопку"" ? Как в коде можно изменить геркон на кнопку (или наоборот), если электрически они работают абсолютно одинаково - контакты либо замкнуты, либо разомкнуты. Каким образом контакты замыкаются - магнитным полем или нажатем пальца руки не имеет никакого значения.
щас данный скетч частично не работает и есть 2 варианта чтения ключа. тот что в скетче не подходит к rw1990/
сперва скетч надо привести в работоспособность а потом заменить структуру чтения на ibutton rw1990
рабочий код сигнализации (с датчиком воды не возился)
char* RUS(char* StrIn){char* StrOut=StrIn; uint8_t i[4]={0,0,StrIn[0],StrIn[1]}; while(i[2]>0&&i[0]<255){if(i[2]==0xd0&&i[3]>0x8F&&i[3]<0xC0){StrOut[i[1]]=i[3]+0x30;i[0]++;}else if(i[2]==0xd0&&i[3]==0x81){StrOut[i[1]]=0xA8;i[0]++;}else if(i[2]==0xd1&&i[3]>0x7F&&i[3]<0x90){StrOut[i[1]]=i[3]+0x70;i[0]++;}else if(i[2]==0xd1&&i[3]==0x91){StrOut[i[1]]=0xB8;i[0]++;}else{StrOut[i[1]]=i[2];} i[0]++; i[1]++; i[2]=StrIn[i[0]]; i[3]=StrIn[i[0]+1];} StrOut[i[1]]='\0'; return StrOut;} #include <OneWire.h> #include "pitches.h" const byte greenLed = 10; //зеленая лампочка const byte redLed = 11; //красная лампочка const byte gerkonPin = 8; //gerkon const byte iButtonPin = 12; //пин для ibutton const byte tonePin = 7; // пин для пищалки const byte waterPin = 9; // пин датчика воды const byte alarmTime = 15; // время, чтобы поднести ключ при разблокировке const byte startTime = 10; // время на закрытие двери при постановке на сигнализацию OneWire ds(iButtonPin); //ibutton byte code1[8] = {0x01, 0xF0, 0x30, 0xB5, 0x00, 0x00, 0x00, 0xDB}; //первый ключ byte code2[8] = {0x01, 0xCA, 0x4E, 0xA5, 0x00, 0x00, 0x00, 0x0E}; // второй ключ boolean waterAlarmed = 0; //флаг сработавшего оповещения о воде boolean alarmState = 0; //флаг работающей сигнализации boolean gerkonState = 0; //первично закрытая дверь (1 - закрыто, 0 - открыто), пока на кнопке. boolean Hacked = 0; // стандартные коды: 1- включение, 2- выключение, 3- тревога void setup() { Serial.begin(9600); delay(2000); //задержка включения pinMode(greenLed, OUTPUT); //задаем режим работы пинов pinMode(redLed, OUTPUT); pinMode(waterPin, INPUT); pinMode(gerkonPin, INPUT); Notify(98); // оповещение о включении ардуино (напр. после перезагрузки) } void loop() { byte returnedValue = 0; if(alarmState==0) { //Сигнализация выключена, ждем пока поднесут ключ для ВКЛЮЧЕНИЯ returnedValue = findKey(); if (returnedValue == 1) { // нашли известный ключ guardON(); //вкл статус сигнализации } } if(alarmState==1) { // если включена сигнализация, то gerkonState = digitalRead(gerkonPin); //смотрим геркон // Serial.println(gerkonState, HEX); if (gerkonState == 1 && Hacked != 1) { //открылась дверь и квартира не взломана ;) Notify(1); // сообщаем компьютеру об открытии двери alarmON(); //включаем сигналку } returnedValue = findKey(); //нужно выключить изнутри квартиры if (returnedValue == 1) { // нашли известный ключ и alarmState=0; guardOFF(); } } returnedValue = 0; //обнуляем для обработки датчиков воды //returnedValue = checkWater(); //if (returnedValue==1) { // запускаем оповещение о срабатывании датчика воды // Notify(10); //сообщаем о срабатывании датчика воды //} delay (500); } int checkWater() //функция проверки датчика воды { int WsensorState = analogRead(waterPin); Serial.println(WsensorState); if (WsensorState == 1 && waterAlarmed == 0){ waterAlarmed =1; return 1; } return 0; } int findKey() // функция поиска ключа { byte i; byte addr[8]; byte checkOK = 0; //счетчик совпадений массива с эталоном // Serial.println("searching key..."); if ( !ds.search(addr)) { // тут надо сделать нормально сделатЬ!!! // Serial.println("No key connected..."); // сообщаем об этом return; // и прерываем программу for(int i = 0; i < 8; i++) ds.reset_search(); // сброс ключа if (addr[i]==code1[i] || addr[i]==code2[i]) { checkOK++; } if (checkOK == 5 ) return 1; } return 0; } 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; } } 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_G3, NOTE_G3, NOTE_G3 }; int noteDurations[] = { 4,4,4 }; for (int thisNote = 0; thisNote < 3; 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_C2, NOTE_G1,NOTE_G2, NOTE_A1, NOTE_G1,0, NOTE_B2, NOTE_C3 }; 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, 500); //включаем на 500 Гц delay(100); //ждем 100 Мс tone(tonePin, 1000); //включаем на 1000 Гц delay(100); //ждем 100 Мс } } int Notify(int x) //функция оповещения в последователньый порт { if (x==0) { // оповещение о постановке на сигнализацию Serial.println(RUS("Сигнализация включена")); } if (x==1) { // оповещение о открытии двери Serial.println(RUS("Дверь открыта")); } if (x==2) { // оповещение о взломе квартиры! Serial.println(RUS("Тревога, проникновение")); } if (x==3) { // оповещение о выключении сигнализации Serial.println(RUS("Сигнализация отключена")); } if (x==98) { // оповещение о включении ardunio Serial.println(RUS("Arduino готово к работе")); } if (x==99) { // оповещение о ОШИБКЕ Serial.println(RUS("Error")); } }в верхнем скетче сигналка реагировала на любой ключ в этом же скетче эта проблема устранена
char* RUS(char* StrIn){char* StrOut=StrIn; uint8_t i[4]={0,0,StrIn[0],StrIn[1]}; while(i[2]>0&&i[0]<255){if(i[2]==0xd0&&i[3]>0x8F&&i[3]<0xC0){StrOut[i[1]]=i[3]+0x30;i[0]++;}else if(i[2]==0xd0&&i[3]==0x81){StrOut[i[1]]=0xA8;i[0]++;}else if(i[2]==0xd1&&i[3]>0x7F&&i[3]<0x90){StrOut[i[1]]=i[3]+0x70;i[0]++;}else if(i[2]==0xd1&&i[3]==0x91){StrOut[i[1]]=0xB8;i[0]++;}else{StrOut[i[1]]=i[2];} i[0]++; i[1]++; i[2]=StrIn[i[0]]; i[3]=StrIn[i[0]+1];} StrOut[i[1]]='\0'; return StrOut;} #include <OneWire.h> #include "pitches.h" const byte greenLed = 10; //зеленая лампочка const byte redLed = 11; //красная лампочка const byte gerkonPin = 8; //gerkon const byte iButtonPin = 12; //пин для ibutton const byte tonePin = 7; // пин для пищалки const byte waterPin = 9; // пин датчика воды const byte alarmTime = 3; // время, чтобы поднести ключ при разблокировке const byte startTime = 5; // время на закрытие двери при постановке на сигнализацию OneWire ds(iButtonPin); //ibutton byte code1[8] = {0x01, 0x9F, 0xDC, 0x02, 0x00, 0x00, 0x96, 0x1C}; //первый ключ boolean waterAlarmed = 0; //флаг сработавшего оповещения о воде boolean alarmState = 0; //флаг работающей сигнализации boolean gerkonState = 0; //первично закрытая дверь (1 - закрыто, 0 - открыто), пока на кнопке. boolean Hacked = 0; // стандартные коды: 1- включение, 2- выключение, 3- тревога void setup() { Serial.begin(115200); delay(2000); //задержка включения pinMode(greenLed, OUTPUT); //задаем режим работы пинов pinMode(redLed, OUTPUT); pinMode(waterPin, INPUT); pinMode(gerkonPin, INPUT); Notify(98); // оповещение о включении ардуино (напр. после перезагрузки) } void loop() { byte returnedValue = 0; if(alarmState==0) { //Сигнализация выключена, ждем пока поднесут ключ для ВКЛЮЧЕНИЯ returnedValue = findKey(); if (returnedValue == 1) { // нашли известный ключ guardON(); //вкл статус сигнализации } } if(alarmState==1) { // если включена сигнализация, то gerkonState = digitalRead(gerkonPin); //смотрим геркон // Serial.println(gerkonState, HEX); if (gerkonState == 1 && Hacked != 1) { //открылась дверь и квартира не взломана ;) Notify(1); // сообщаем компьютеру об открытии двери alarmON(); //включаем сигналку } returnedValue = findKey(); //нужно выключить изнутри квартиры if (returnedValue == 1) { // нашли известный ключ и alarmState=0; guardOFF(); } } returnedValue = 0; //обнуляем для обработки датчиков воды //returnedValue = checkWater(); //if (returnedValue==1) { // запускаем оповещение о срабатывании датчика воды // Notify(10); //сообщаем о срабатывании датчика воды //} delay (500); } int checkWater() //функция проверки датчика воды { int WsensorState = analogRead(waterPin); Serial.println(WsensorState); if (WsensorState == 1 && waterAlarmed == 0){ waterAlarmed =1; return 1; } return 0; } int findKey() // функция поиска ключа { byte i; byte addr[8]; byte checkOK = 0; //счетчик совпадений массива с эталоном //Serial.println("searching key..."); if (!ds.search(addr)) { // тут надо сделать нормально сделатЬ!!! //Serial.println("No key connected..."); // сообщаем об этом ds.reset_search(); delay(200); return; // и прерываем программу for(int i = 0; i<8; i++) Serial.print(addr[i],HEX); Serial.print(" "); } Serial.println("\n"); for (int i=0; i<8; i++) if (addr[i]==code1[i]) { checkOK++; } if (checkOK == 8 ){ return 1; } return 0; } 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; } } 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_G3, NOTE_G3, NOTE_G3 }; int noteDurations[] = { 4,4,4 }; for (int thisNote = 0; thisNote < 3; 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_C2, NOTE_G1,NOTE_G2, NOTE_A1, NOTE_G1,0, NOTE_B2, NOTE_C3 }; 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, 500); //включаем на 500 Гц delay(100); //ждем 100 Мс tone(tonePin, 1000); //включаем на 1000 Гц delay(100); //ждем 100 Мс } } int Notify(int x) //функция оповещения в последователньый порт { if (x==0) { // оповещение о постановке на сигнализацию Serial.println(RUS("Сигнализация включена")); } if (x==1) { // оповещение о открытии двери Serial.println(RUS("Дверь открыта")); } if (x==2) { // оповещение о взломе квартиры! Serial.println(RUS("Тревога, проникновение")); } if (x==3) { // оповещение о выключении сигнализации Serial.println(RUS("Сигнализация отключена")); } if (x==98) { // оповещение о включении ardunio Serial.println(RUS("Устройство готово к работе")); } if (x==99) { // оповещение о ОШИБКЕ Serial.println(RUS("Ошибка")); } }..."спасибо ".. что помоги... ждал от форума поддержки, а в результате ее нет. не понятно существования данного форума тогда
и так народ решил оптимизировать данный скетч для связки ардуино esp8266
а именно:
1) если приложен ключ 1 {0x01, 0x9F, 0xDC, 0x02, 0x00, 0x00, 0x96, 0x1C}, выполняется первая команда записанная в скетче.
2) если приложен ключ 2 {0x01, 0xF0, 0x30, 0xB5, 0x00, 0x00, 0x00, 0xDB}, начинается инициализация передачи кода {0x01, 0xF0, 0x30, 0xB5, 0x00, 0x00, 0x00, 0xDB} на пин 6, который идет на esp8266.
код оправки данных ibutton http://robocraft.ru/blog/arduino/302.html
мой нынешний вид кода:
#include <OneWire.h> #include "pitches.h" const byte greenLed = 10; //зеленая лампочка const byte redLed = 11; //красная лампочка const byte gerkonPin = 8; //gerkon const byte iButtonPin = 12; //пин для ibutton const byte tonePin = 7; // пин для пищалки const byte waterPin = 9; // пин датчика воды const byte alarmTime = 3; // время, чтобы поднести ключ при разблокировке const byte startTime = 5; // время на закрытие двери при постановке на сигнализацию OneWire ds(iButtonPin); //ibutton byte code1[8] = {0x01, 0x9F, 0xDC, 0x02, 0x00, 0x00, 0x96, 0x1C}; //первый ключ byte code2[8] = {0x01, 0xF0, 0x30, 0xB5, 0x00, 0x00, 0x00, 0xDB}; //второй ключ (он же и для boolean waterAlarmed = 0; //флаг сработавшего оповещения о воде boolean alarmState = 0; //флаг работающей сигнализации boolean gerkonState = 0; //первично закрытая дверь (1 - закрыто, 0 - открыто), пока на кнопке. boolean Hacked = 0; // стандартные коды: 1- включение, 2- выключение, 3- тревога void setup() { Serial.begin(115200); delay(2000); //задержка включения pinMode(greenLed, OUTPUT); //задаем режим работы пинов pinMode(redLed, OUTPUT); pinMode(waterPin, INPUT); pinMode(gerkonPin, INPUT); Notify(98); // оповещение о включении ардуино (напр. после перезагрузки) } void loop() { byte returnedValue = 0; if(alarmState==0) { //Сигнализация выключена, ждем пока поднесут ключ для ВКЛЮЧЕНИЯ returnedValue = findKey(); if (returnedValue == 1) { // нашли известный ключ guardON(); //вкл статус сигнализации } } if(alarmState==1) { // если включена сигнализация, то gerkonState = digitalRead(gerkonPin); //смотрим геркон // Serial.println(gerkonState, HEX); if (gerkonState == 1 && Hacked != 1) { //открылась дверь и квартира не взломана ;) Notify(1); // сообщаем компьютеру об открытии двери alarmON(); //включаем сигналку } returnedValue = findKey(); //нужно выключить изнутри квартиры if (returnedValue == 1) { // нашли известный ключ и alarmState=0; guardOFF(); } } returnedValue = 0; //обнуляем для обработки датчиков воды //returnedValue = checkWater(); //if (returnedValue==1) { // запускаем оповещение о срабатывании датчика воды // Notify(10); //сообщаем о срабатывании датчика воды //} delay (500); } int checkWater() //функция проверки датчика воды { int WsensorState = analogRead(waterPin); Serial.println(WsensorState); if (WsensorState == 1 && waterAlarmed == 0){ waterAlarmed =1; return 1; } return 0; } int findKey() // функция поиска ключа { byte i; byte addr[8]; byte checkOK = 0; //счетчик совпадений массива с эталоном //Serial.println("searching key..."); if (!ds.search(addr)) { // тут надо сделать нормально сделатЬ!!! //Serial.println("No key connected..."); // сообщаем об этом ds.reset_search(); delay(200); return; // и прерываем программу for(int i = 0; i<8; i++) Serial.print(addr[i],HEX); Serial.print(" "); } Serial.println("\n"); for (int i=0; i<8; i++) if (addr[i]==code1[i]) { checkOK++; } if (addr[i]==code2[i]) { //сюда надо добавить начало отправки и через 2 секунды остановить } if (checkOK == 8 ){ return 1; } return 0; } 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; } } 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_G3, NOTE_G3, NOTE_G3 }; int noteDurations[] = { 4,4,4 }; for (int thisNote = 0; thisNote < 3; 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_C2, NOTE_G1,NOTE_G2, NOTE_A1, NOTE_G1,0, NOTE_B2, NOTE_C3 }; 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, 500); //включаем на 500 Гц delay(100); //ждем 100 Мс tone(tonePin, 1000); //включаем на 1000 Гц delay(100); //ждем 100 Мс } } int Notify(int x) //функция оповещения в последователньый порт { if (x==0) { // оповещение о постановке на сигнализацию Serial.println("Сигнализация включена"); } if (x==1) { // оповещение о открытии двери Serial.println("Дверь открыта"); } if (x==2) { // оповещение о взломе квартиры! Serial.println("Тревога, проникновение"); } if (x==3) { // оповещение о выключении сигнализации Serial.println("Сигнализация отключена"); } if (x==98) { // оповещение о включении ardunio Serial.println("Устройство готово к работе"); } if (x==99) { // оповещение о ОШИБКЕ Serial.println("Ошибка"); } }прошу помощи а не просто просмотреть тему и закрыть.
Здраствуйте интересная тема. хочу реализовать что то подобное. В програмировании для ардуино есче не силен. Думаю если выстввили скетч то не против его использования. Не могу загрузить на Arduino куча ошибок. Интересует вариант 01/12/2016 - 18:17
Обновил Arduino IDE и удалось скомпилировать и зарузить. Пока есть проблеми как бить с перезагрузкой устройства поставленного на охрану. загружается оно снятим с охраны.
как сохранить текущее состояние переменной
boolean alarmState = 0;
//флаг работающей сигнализациидля использования в следующей загрузке
может я не все понимаю ИЗВИНИТЕ
Для сохранени я информации, которая меняется при работе программы, но должна сохраняться после перезагрузки, предназначена EEPROM.
Понял что ето но решил не заморачиватся и поставил статус при перезагрузке сразу на сигнализации.
// char* RUS( char* StrIn){ char* StrOut=StrIn; uint8_t i[4]={0,0,StrIn[0],StrIn[1]}; while(i[2]>0&&i[0]<255){if(i[2]==0xd0&&i[3]>0x8F&&i[3]<0xC0){StrOut[i[1]]=i[3]+0x30;i[0]++;}else if(i[2]==0xd0&&i[3]==0x81){StrOut[i[1]]=0xA8;i[0]++;}else if(i[2]==0xd1&&i[3]>0x7F&&i[3]<0x90){StrOut[i[1]]=i[3]+0x70;i[0]++;}else if(i[2]==0xd1&&i[3]==0x91){StrOut[i[1]]=0xB8;i[0]++;}else{StrOut[i[1]]=i[2];} i[0]++; i[1]++; i[2]=StrIn[i[0]]; i[3]=StrIn[i[0]+1];} StrOut[i[1]]='\0'; return StrOut;} #include <OneWire.h> #include "pitches.h" #include <Wire.h> #include "Sodaq_DS3231.h" const byte greenLed = 11; //зелений диод const byte redLed = 10; //червоний диод const byte gerkonPin = 8; //геркон const byte iButtonPin = 12; //пин для ibutton const byte tonePin = 7; // пін для пищалки const byte botton = 13; // кнопка const byte waterPin = 16; // пін дитчика води const byte waterClose = 6; // пін перекривання води const byte waterOpen = 4; // пін відкривання води const byte alarmTime = 8; // час , щоб піднести ключ при знятті з сигналізації const byte startTime = 20; // час , на закривання дверей при постановці на сигналізацію OneWire ds(iButtonPin); //ibutton byte code1[8] = {0x01, 0xE4, 0xF4, 0x84, 0x01, 0x00, 0x00, 0x0D}; //перший ключ //byte code2[8] = {0x01, 0xF4, 0xF4, 0x84, 0x01, 0x00, 0x00, 0x0D}; //перший ключ boolean waterValves = 0; //флаг стану крана води boolean waterAlarmed = 0; //флаг спрацювання оповіщення про воду boolean alarmState = 1; //флаг працюючої сигналізації boolean gerkonState = 1; //першочергово закриті двері (1 - закрито, 0 - відкрито) boolean Hacked = 0; // стандартні коди: 1- тревога, 0- тревоги нема void setup() { Serial.begin(115200); delay(2000); //затримка включення while (!Serial) ; // чекаєм на серійний порт delay(200); pinMode(greenLed, OUTPUT); //задаємо режим роботи пінв pinMode(redLed, OUTPUT); pinMode(waterPin, INPUT); pinMode(botton, INPUT); pinMode(gerkonPin, INPUT); pinMode(waterClose, OUTPUT); pinMode(waterOpen, OUTPUT); digitalWrite(waterClose, HIGH); digitalWrite(waterOpen, HIGH); Wire.begin(); rtc.begin(); Notify(98); // оповіщення про включення Ардуіно (наприклад при перезагрузці) readTime(); // виводимо час } uint32_t old_ts; void loop() { byte returnedValue = 0; if(alarmState==0) { //Сигналізація виключена чекаєм коли піднесуть ключ для АКТИВАЦІЇ returnedValue = findKey(); if (returnedValue == 1) { // знайшли відомий ключ guardON(); //вкл статус сигналізації } } if(alarmState==1) { // якщо включена сигналізація то gerkonState = digitalRead(gerkonPin); //дивимось геркон // Serial.println(gerkonState, HEX); if (gerkonState == 0 && Hacked != 1) { //открылась дверь и квартира не взломана якщо прописати gerkonState == 0 && Hacked != 1 то смк ;) Notify(1); // повідомлення про відкривання дверей alarmON(); //включаєм сигналку } returnedValue = findKey(); //потрібно виключити з середини квартири if (returnedValue == 1) { //знайшли відомий ключ alarmState=0; guardOFF(); } } returnedValue = 1; //скидаєм для обробки датчика води returnedValue = checkWater(); if (returnedValue==1) { // запускаем оповіщення про спрацювання датчика води Notify(10); //оповіщення про спрацювання датчика води } if (waterValves == 1 && Hacked != 1 && digitalRead(botton)==HIGH) { waterOFF();// перекриваєм воду } delay (500); } int checkWater() //функція провірки датчика води { int WsensorState = digitalRead(waterPin); // Serial.println(WsensorState); if (WsensorState == 0) // якщо затоплення { Notify(10);//оповіщення про спрацювання датчика води readTime(); // виводимо час waterOFF();// перекриваєм воду waterAlarmed = 1; // включаєм статус потопу } if (Hacked != 1 && alarmState !=1)// zякщо не тривога і не на сигналізації то диаимся кнопку для можливості відкривання води { waterON(); waterAlarmed = 0;// виключаєм статус потопу } } void waterOFF() // перекривання води { if (Hacked == 1)// якщо взламано то перекрити воду і продовжити тревогу { digitalWrite(waterClose, LOW);// включити реле звкривання води digitalWrite(waterOpen, HIGH);// виключити реле відкривання води delay(9000); digitalWrite(waterClose, HIGH); // виключити реле звкривання води digitalWrite(greenLed, LOW); delay(900); guardSound(5); //бібікаєм guardBlink(3); //моргаем лампочками waterValves = 0; //встановлюэм режим закрито Notify(12); readTime(); // виводимо час Notify(2);// продовженя тревоги guardBlink(4); //пищим о том, что УСЁ ПРОПАЛО guardSound(4); //светим о том, что УСЁ ПРОПАЛО Hacked = 1; } else { digitalWrite(waterClose, LOW);// включити реле звкривання води digitalWrite(waterOpen, HIGH);// виключити реле відкривання води delay(9000); digitalWrite(waterClose, HIGH); // виключити реле звкривання води digitalWrite(greenLed, LOW); delay(900); guardSound(2); //бібікаєм guardBlink(2); //моргаем лампочками waterValves = 0; //встановлюэм режим закрито Notify(12); readTime(); // виводимо час } } void waterON() // відкривання води { if(waterValves == 0 && digitalRead(botton)==HIGH) { digitalWrite(waterClose, HIGH);// виключити реле звкривання води digitalWrite(waterOpen, LOW);// включити реле відкривання води delay(9000); digitalWrite(waterOpen, HIGH);// виключити реле відкривання води digitalWrite(greenLed, LOW); delay(900); guardSound(2); //бібікаєм guardBlink(2); //моргаем лампочками waterValves = 1; //встановлюэм режим відкрито Notify(11); readTime(); // виводимо час } } int findKey() // функция пошуку ключа { byte i; byte addr[8]; byte checkOK = 0; //счетчик совпадений массива с эталоном //Serial.println("searching key..."); if (!ds.search(addr)) { // тут надо сделать нормально сделатЬ!!! //Serial.println("No key connected..."); // сообщаем об этом ds.reset_search(); delay(200); return; // и прерываем программу for(int i = 0; i<8; i++) Serial.print(addr[i],HEX); Serial.print(" "); } Serial.println("\n"); for (int i=0; i<8; i++) if (addr[i]==code1[i]) { // if (addr[i]==code1[i] || addr[i]==code2[i]) { checkOK++; } if (checkOK == 8 ){ return 1; } return 0; } void guardON() // выполнение действие при на сигнализацию { int j; alarmState=1; //включаем статус сигнализации guardSound(1); //бибикаем for (j=0; j < startTime; j++) { guardBlink(1); //моргаем лампочками и ждем время для закрытия двери } Notify(0); readTime(); // виводимо час } void guardOFF() // выполнение действие при снятии с сигнализации { alarmState=0; // выключаем статус сигнализации Hacked = 0; // отменям статус "взломано" digitalWrite(greenLed, LOW); guardSound(2); //бибикаем guardBlink(2); //моргаем лампочками Notify(3); readTime(); // виводимо час } void readTime () { DateTime now = rtc.now(); //get the current date-time uint32_t ts = now.getEpoch(); if (old_ts == 0 || old_ts != ts) { old_ts = ts; Serial.print(now.year(), DEC); Serial.print('/'); Serial.print(now.month(), DEC); Serial.print('/'); Serial.print(now.date(), DEC); Serial.println(); Serial.print(now.hour(), DEC); Serial.print(':'); Serial.print(now.minute(), DEC); Serial.print(':'); Serial.print(now.second(), DEC); Serial.println(); readTemperature (); } delay(1000); } void print2digits(int number) { if (number >= 0 && number < 10) { Serial.write('0'); } Serial.print(number); } void readTemperature () // считування температури { rtc.convertTemperature(); //конвертування температути в гр Ц Serial.print(rtc.getTemperature()); //читання датчика температури Serial.println(" C"); delay(1000); } 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; readTime(); // виводимо час } } 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_G3, NOTE_G3, NOTE_G3 }; int noteDurations[] = { 4,4,4 }; for (int thisNote = 0; thisNote < 3; 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_C2, NOTE_G1,NOTE_G2, NOTE_A1, NOTE_G1,0, NOTE_B2, NOTE_C3 }; 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, 500); //включаем на 500 Гц delay(100); //ждем 100 Мс tone(tonePin, 1000); //включаем на 1000 Гц delay(100); //ждем 100 Мс } if (x==5) { //тон потопу tone(tonePin, 500); //включаем на 500 Гц delay(250); //ждем 100 Мс tone(tonePin, 1000); //включаем на 1000 Гц delay(250); //ждем 100 Мс tone(tonePin, 800); //включаем на 500 Гц delay(250); //ждем 100 Мс tone(tonePin, 400); //включаем на 500 Гц delay(150); //ждем 100 Мс tone(tonePin, 1000); //включаем на 1000 Гц delay(350); //ждем 100 Мс } } int Notify(int x) //функція оповіщення в послідовний порт { if (x==0) { // оповіщення поставлено на сигналізацію Serial.println("Alarm ON"); } if (x==1) { // оповіщення відкрито двері Serial.println("Dor OPEN"); } if (x==2) { // оповіщення взлом Serial.println("VZLOM AHTUNG"); } if (x==3) { //оповіщення знято з сигналізації Serial.println("Alarm OFF"); } if (x==10) { // оповіщення затоплення Serial.println("Potop"); } if (x==11) { // оповіщення про вікравання води Serial.println("Water Open"); } if (x==12) { // оповіщення про закриття води Serial.println("Water Closed"); } if (x==98) { // оповіщення про включення ardunio Serial.println("READY GOO"); } if (x==99) { // оповіщення помилки Serial.println("ERROR"); } }Отличный вариант мне очень подошел.
добавил датчик воды и сервопривод крана, кнопку перекрывания и открывания крана часы реального времени (градусник пока так как игрушка). Скоро прийдет GSM SIM900 и PIR датчик буду его прикручивать. Ну и серену серйозную .
в планах Еще ETHERNET, датчик дыма, газа, клапа перекрытия газа . хорошо что все провода пробросил при ремонте
есть проблема с добавлением второго ключа пока не пойму.
// char* RUS( char* StrIn){ char* StrOut=StrIn; uint8_t i[4]={0,0,StrIn[0],StrIn[1]}; while(i[2]>0&&i[0]<255){if(i[2]==0xd0&&i[3]>0x8F&&i[3]<0xC0){StrOut[i[1]]=i[3]+0x30;i[0]++;}else if(i[2]==0xd0&&i[3]==0x81){StrOut[i[1]]=0xA8;i[0]++;}else if(i[2]==0xd1&&i[3]>0x7F&&i[3]<0x90){StrOut[i[1]]=i[3]+0x70;i[0]++;}else if(i[2]==0xd1&&i[3]==0x91){StrOut[i[1]]=0xB8;i[0]++;}else{StrOut[i[1]]=i[2];} i[0]++; i[1]++; i[2]=StrIn[i[0]]; i[3]=StrIn[i[0]+1];} StrOut[i[1]]='\0'; return StrOut;} #include <OneWire.h> #include "pitches.h" #include <Wire.h> #include "Sodaq_DS3231.h" const byte greenLed = 11; //зелений диод const byte redLed = 10; //червоний диод const byte gerkonPin = 8; //геркон const byte iButtonPin = 12; //пин для ibutton const byte tonePin = 7; // пін для пищалки const byte botton = 13; // кнопка const byte waterPin = 16; // пін дитчика води const byte waterClose = 6; // пін перекривання води const byte waterOpen = 4; // пін відкривання води const byte alarmTime = 8; // час , щоб піднести ключ при знятті з сигналізації const byte startTime = 20; // час , на закривання дверей при постановці на сигналізацію OneWire ds(iButtonPin); //ibutton byte code2[8] = {0x01, 0xE4, 0xD4, 0x84, 0x01, 0x00, 0x00, 0x0D}; //другий ключ byte code3[8] = {0x01, 0xE4, 0xF4, 0x84, 0x01, 0x00, 0x00, 0x0D}; //третий ключ byte code1[8] = {0x01, 0xF4, 0xF4, 0x84, 0x01, 0x00, 0x00, 0x0D}; //перший ключ boolean waterValves = 0; //флаг стану крана води boolean waterAlarmed = 0; //флаг спрацювання оповіщення про воду boolean alarmState = 1; //флаг працюючої сигналізації boolean gerkonState = 1; //першочергово закриті двері (1 - закрито, 0 - відкрито) boolean Hacked = 0; // стандартні коди: 1- тревога, 0- тревоги нема void setup() { Serial.begin(115200); delay(2000); //затримка включення while (!Serial) ; // чекаєм на серійний порт delay(200); pinMode(greenLed, OUTPUT); //задаємо режим роботи пінв pinMode(redLed, OUTPUT); pinMode(waterPin, INPUT); pinMode(botton, INPUT); pinMode(gerkonPin, INPUT); pinMode(waterClose, OUTPUT); pinMode(waterOpen, OUTPUT); digitalWrite(waterClose, HIGH); digitalWrite(waterOpen, HIGH); Wire.begin(); rtc.begin(); Notify(98); // оповіщення про включення Ардуіно (наприклад при перезагрузці) readTime(); // виводимо час } uint32_t old_ts; void loop() { byte returnedValue = 0; if(alarmState==0) { //Сигналізація виключена чекаєм коли піднесуть ключ для АКТИВАЦІЇ returnedValue = findKey(); if (returnedValue == 1) { // знайшли відомий ключ guardON(); //вкл статус сигналізації } } if(alarmState==1) { // якщо включена сигналізація то gerkonState = digitalRead(gerkonPin); //дивимось геркон // Serial.println(gerkonState, HEX); if (gerkonState == 0 && Hacked != 1) { //открылась дверь и квартира не взломана якщо прописати gerkonState == 0 && Hacked != 1 то смк ;) Notify(1); // повідомлення про відкривання дверей alarmON(); //включаєм сигналку } returnedValue = findKey(); //потрібно виключити з середини квартири if (returnedValue == 1) { //знайшли відомий ключ alarmState=0; guardOFF(); } } returnedValue = 1; //скидаєм для обробки датчика води returnedValue = checkWater(); if (returnedValue==1) { // запускаем оповіщення про спрацювання датчика води Notify(10); //оповіщення про спрацювання датчика води } if (waterValves == 1 && Hacked != 1 && digitalRead(botton)==HIGH) { waterOFF();// перекриваєм воду } delay (500); } int checkWater() //функція провірки датчика води { int WsensorState = digitalRead(waterPin); // Serial.println(WsensorState); if (WsensorState == 0) // якщо затоплення { Notify(10);//оповіщення про спрацювання датчика води readTime(); // виводимо час waterOFF();// перекриваєм воду waterAlarmed = 1; // включаєм статус потопу } if (Hacked != 1 && alarmState !=1)// zякщо не тривога і не на сигналізації то диаимся кнопку для можливості відкривання води { waterON(); waterAlarmed = 0;// виключаєм статус потопу } } void waterOFF() // перекривання води { if (Hacked == 1)// якщо взламано то перекрити воду і продовжити тревогу { digitalWrite(waterClose, LOW);// включити реле звкривання води digitalWrite(waterOpen, HIGH);// виключити реле відкривання води delay(9000); digitalWrite(waterClose, HIGH); // виключити реле звкривання води digitalWrite(greenLed, LOW); delay(900); guardSound(5); //бібікаєм guardBlink(3); //моргаем лампочками waterValves = 0; //встановлюэм режим закрито Notify(12); readTime(); // виводимо час Notify(2);// продовженя тревоги guardBlink(4); //пищим о том, что УСЁ ПРОПАЛО guardSound(4); //светим о том, что УСЁ ПРОПАЛО Hacked = 1; } else { digitalWrite(waterClose, LOW);// включити реле звкривання води digitalWrite(waterOpen, HIGH);// виключити реле відкривання води delay(9000); digitalWrite(waterClose, HIGH); // виключити реле звкривання води digitalWrite(greenLed, LOW); delay(900); guardSound(2); //бібікаєм guardBlink(2); //моргаем лампочками waterValves = 0; //встановлюэм режим закрито Notify(12); readTime(); // виводимо час } } void waterON() // відкривання води { if(waterValves == 0 && digitalRead(botton)==HIGH) { digitalWrite(waterClose, HIGH);// виключити реле звкривання води digitalWrite(waterOpen, LOW);// включити реле відкривання води delay(9000); digitalWrite(waterOpen, HIGH);// виключити реле відкривання води digitalWrite(greenLed, LOW); delay(900); guardSound(2); //бібікаєм guardBlink(2); //моргаем лампочками waterValves = 1; //встановлюэм режим відкрито Notify(11); readTime(); // виводимо час } } int findKey() // функция пошуку ключа { byte i; byte addr[8]; byte checkOK = 0; //счетчик совпадений массива с эталоном //Serial.println("searching key..."); if (!ds.search(addr)) { // тут надо сделать нормально сделатЬ!!! //Serial.println("No key connected..."); // сообщаем об этом ds.reset_search(); // если не нашли, сбрасываем поиск в начало delay(200); return; // і повертаємся на початок циклу пошуку ключа for(int i = 0; i<8; i++) Serial.print(addr[i],HEX); Serial.print(" "); } Serial.println("\n"); // звірка першого ключа if (addr[1]==code1[1] && addr[2]==code1[2] && addr[3]==code1[3] && addr[4]==code1[4] && addr[5]==code1[5] && addr[6]==code1[6] && addr[7]==code1[7] && addr[8]==code1[8]) { checkOK = 8; } // звірка другого ключа if (addr[1]==code2[1] && addr[2]==code2[2] && addr[3]==code2[3] && addr[4]==code2[4] && addr[5]==code2[5] && addr[6]==code2[6] && addr[7]==code2[7] && addr[8]==code2[8]) { checkOK = 8; } // звірка третього ключа if (addr[1]==code3[1] && addr[2]==code3[2] && addr[3]==code3[3] && addr[4]==code3[4] && addr[5]==code3[5] && addr[6]==code3[6] && addr[7]==code3[7] && addr[8]==code3[8]) { checkOK = 8; } if (checkOK == 8 ) { return 1; } return 0; } void guardON() // выполнение действие при на сигнализацию { int j; alarmState=1; //включаем статус сигнализации guardSound(1); //бибикаем for (j=0; j < startTime; j++) { guardBlink(1); //моргаем лампочками и ждем время для закрытия двери } Notify(0); readTime(); // виводимо час } void guardOFF() // выполнение действие при снятии с сигнализации { alarmState=0; // выключаем статус сигнализации Hacked = 0; // отменям статус "взломано" digitalWrite(greenLed, LOW); guardSound(2); //бибикаем guardBlink(2); //моргаем лампочками Notify(3); readTime(); // виводимо час } void readTime () { DateTime now = rtc.now(); //get the current date-time uint32_t ts = now.getEpoch(); if (old_ts == 0 || old_ts != ts) { old_ts = ts; Serial.print(now.year(), DEC); Serial.print('/'); Serial.print(now.month(), DEC); Serial.print('/'); Serial.print(now.date(), DEC); Serial.println(); Serial.print(now.hour(), DEC); Serial.print(':'); Serial.print(now.minute(), DEC); Serial.print(':'); Serial.print(now.second(), DEC); Serial.println(); readTemperature (); } delay(1000); } void print2digits(int number) { if (number >= 0 && number < 10) { Serial.write('0'); } Serial.print(number); } void readTemperature () // считування температури { rtc.convertTemperature(); //конвертування температути в гр Ц Serial.print(rtc.getTemperature()); //читання датчика температури Serial.println(" C"); delay(1000); } 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; readTime(); // виводимо час } } 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_G3, NOTE_G3, NOTE_G3 }; int noteDurations[] = { 4,4,4 }; for (int thisNote = 0; thisNote < 3; 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_C2, NOTE_G1,NOTE_G2, NOTE_A1, NOTE_G1,0, NOTE_B2, NOTE_C3 }; 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, 500); //включаем на 500 Гц delay(100); //ждем 100 Мс tone(tonePin, 1000); //включаем на 1000 Гц delay(100); //ждем 100 Мс } if (x==5) { //тон потопу tone(tonePin, 500); //включаем на 500 Гц delay(250); //ждем 100 Мс tone(tonePin, 1000); //включаем на 1000 Гц delay(250); //ждем 100 Мс tone(tonePin, 800); //включаем на 500 Гц delay(250); //ждем 100 Мс tone(tonePin, 400); //включаем на 500 Гц delay(150); //ждем 100 Мс tone(tonePin, 1000); //включаем на 1000 Гц delay(350); //ждем 100 Мс } } int Notify(int x) //функція оповіщення в послідовний порт { if (x==0) { // оповіщення поставлено на сигналізацію Serial.println("Alarm ON"); } if (x==1) { // оповіщення відкрито двері Serial.println("Dor OPEN"); } if (x==2) { // оповіщення взлом Serial.println("VZLOM AHTUNG"); } if (x==3) { //оповіщення знято з сигналізації Serial.println("Alarm OFF"); } if (x==10) { // оповіщення затоплення Serial.println("Potop"); } if (x==11) { // оповіщення про вікравання води Serial.println("Water Open"); } if (x==12) { // оповіщення про закриття води Serial.println("Water Closed"); } if (x==98) { // оповіщення про включення ardunio Serial.println("READY GOO"); } if (x==99) { // оповіщення помилки Serial.println("ERROR"); } }Переписал проверку ключей (может и коряво, несколько недель всего знаком с платформой ) но работает, с возможностью добавления ключей .
И к стати тут возможен вариант для отправки который требовался Rossolomo.
понял почему открывало любым ключем вариант
085if(addr[i]==code1[i] || addr[i]==code2[i]) {086checkOK++;087}088089if(checkOK == 8Потому что в каждом ключе первый и последние пять байт одинаковы и вместе checkOK == 8 наберал 8
Думаю есть решение
Если вы хотите хорошего совета, то хотя бы пишите грамотно. Те, у кого вы просите помощи, перестают читать ваш пост после увиденного. Не умеете- напишите сначала в ворде. Он вас поправит (например : датчик дИма, еСЧе)- кошмар!!
Да, я старый зануда. Как и многие, к кому вы обращаетесь.
// char* RUS( char* StrIn){ char* StrOut=StrIn; uint8_t i[4]={0,0,StrIn[0],StrIn[1]}; while(i[2]>0&&i[0]<255){if(i[2]==0xd0&&i[3]>0x8F&&i[3]<0xC0){StrOut[i[1]]=i[3]+0x30;i[0]++;}else if(i[2]==0xd0&&i[3]==0x81){StrOut[i[1]]=0xA8;i[0]++;}else if(i[2]==0xd1&&i[3]>0x7F&&i[3]<0x90){StrOut[i[1]]=i[3]+0x70;i[0]++;}else if(i[2]==0xd1&&i[3]==0x91){StrOut[i[1]]=0xB8;i[0]++;}else{StrOut[i[1]]=i[2];} i[0]++; i[1]++; i[2]=StrIn[i[0]]; i[3]=StrIn[i[0]+1];} StrOut[i[1]]='\0'; return StrOut;} #include <OneWire.h> #include "pitches.h" #include <Wire.h> #include "Sodaq_DS3231.h" #include <SoftwareSerial.h> SoftwareSerial gsm(2, 3); // встановлюєм порт лоя GSM RX, TX const byte greenLed = 11; //зелений диод const byte redLed = 10; //червоний диод const byte gerkonPin = 8; //геркон const byte iButtonPin = 12; //пин для ibutton const byte tonePin = 7; // пін для пищалки const byte botton = 13; // кнопка const byte waterPin = 16; // пін дитчика води const byte waterClose = 6; // пін перекривання води const byte waterOpen = 4; // пін відкривання води const byte alarmTime = 8; // час , щоб піднести ключ при знятті з сигналізації const byte startTime = 20; // час , на закривання дверей при постановці на сигналізацію char data; // перемінна для обробки повідомлень з GSM String nomberPhone0 = "380670000000"; //телефон без + String nomberPhone1 = "380900000000"; //телефон без + String currStr = ""; // перемінна для обробки повідомлень з GSM String balance = ""; //перемінна для балансу long previousMillis = 0;// перемінна для таймера long interval = 30000;// перемінна інтервалу провірки зєднання GSM // додати перемінну для збереження темперетари OneWire ds(iButtonPin); //ibutton byte code2[8] = {0x01, 0xE4, 0xD4, 0x84, 0x01, 0x00, 0x00, 0x0D}; //другий ключ byte code3[8] = {0x01, 0xE4, 0xF4, 0x84, 0x01, 0x00, 0x00, 0x0D}; //третий ключ byte code1[8] = {0x01, 0xF4, 0xF4, 0x84, 0x01, 0x00, 0x00, 0x0D}; //перший ключ boolean waterSms = 0; //флаг стану відправки смс про затоплення boolean waterValves = 1; //флаг стану крана води boolean waterAlarmed = 0; //флаг спрацювання оповіщення про воду boolean alarmState = 1; //флаг працюючої сигналізації boolean gerkonState = 1; //першочергово закриті двері (1 - закрито, 0 - відкрито) boolean Hacked = 0; // стандартні коди: 1- тревога, 0- тревоги нема void setup() { onGsm(); Serial.begin(9600); delay(2000); //затримка включення while (!Serial) ; // чекаєм на серійний порт delay(200); pinMode(9, OUTPUT);//пин керування GSM pinMode(greenLed, OUTPUT); //задаємо режим роботи пінв pinMode(redLed, OUTPUT); pinMode(waterPin, INPUT); pinMode(botton, INPUT); pinMode(gerkonPin, INPUT); pinMode(waterClose, OUTPUT); pinMode(waterOpen, OUTPUT); digitalWrite(waterClose, HIGH); digitalWrite(waterOpen, HIGH); Wire.begin(); rtc.begin(); Notify(98); // оповіщення про включення Ардуіно (наприклад при перезагрузці) readTime(); // виводимо час initGsm(); //ініціалізація GSM if (testGsmOn()==1){//Если модем выключен, то включаем его. onGsm(); } } uint32_t old_ts; void loop() { byte returnedValue = 0; unsigned long currentMillis = millis(); if(currentMillis - previousMillis > interval) { //Каждые пол минуты проверяем состояние модема. previousMillis = currentMillis; if (testGsmOn()==1){ // Если связи с модемом нет пробуем сначало перезагрузить его, если это не помогло то пытаемся включить его. onGsm(); delay(500); initGsm(); //ініціалізація GSM delay(3000); } } if(gsm.available()>0){//если GSM модуль что-то послал нам, то readGsm(); } if(alarmState==0) { //Сигналізація виключена чекаєм коли піднесуть ключ для АКТИВАЦІЇ returnedValue = findKey(); if (returnedValue == 1) { // знайшли відомий ключ guardON(); //вкл статус сигналізації } } if(alarmState==1) { // якщо включена сигналізація то gerkonState = digitalRead(gerkonPin); //дивимось геркон // Serial.println(gerkonState, HEX); if (gerkonState == 0 && Hacked != 1) { //открылась дверь и квартира не взломана якщо прописати gerkonState == 0 && Hacked != 1 то смк ;) Notify(1); // повідомлення про відкривання дверей alarmON(); //включаєм сигналку } returnedValue = findKey(); //потрібно виключити з середини квартири if (returnedValue == 1) { //знайшли відомий ключ alarmState=0; guardOFF(); } } returnedValue = 1; //скидаєм для обробки датчика води returnedValue = checkWater(); if (returnedValue==1) { // запускаем оповіщення про спрацювання датчика води Notify(10); //оповіщення про спрацювання датчика води } if (waterValves == 1 && Hacked != 1 && digitalRead(botton)==HIGH) { waterOFF();// перекриваєм воду } delay (500); } void readGsm() { // currStr = ""; while(gsm.available()>0) { data = gsm.read(); delay(10); Serial.println(currStr); // рзкомент щоб дивитись відповіді if ('\r' == data) { if(!currStr.compareTo("RING"))//Если текущая строка RING, значит едёт входящий звонок. { ringGsm(); } else { delay(100); if(currStr.startsWith("+CUSD: 0,")) { int zzz = currStr.indexOf('grn'); balance=currStr.substring(30,zzz+4); //баланс на сим карте Serial.print(balance); // потім закоментувати // delay(500); // Serial.println("AT+CMGDA=\"bal\""); // currStr = currStr.substring(currStr.indexOf("Balance"),currStr.indexOf("r")); // // currStr = currStr.substring(currStr.indexOf("rahunku "),currStr.indexOf(".")); // delay(2000); // gsm.println("AT + CMGS = \"+38067000000\""); // укажите свой номер! // delay(100); // gsm.println(currStr); // delay(100); // gsm.println((char)26); // delay(100); // gsm.println(); // gsm.println("AT+CMGDA=\"DEL ALL\"");//Удоляем всё SMS чтоб не накапливать их. } if(currStr.startsWith("+CMT")) //Или если строка начинаеться c +CMT, значит пришло SMS { readSms(); // поки відключим видалення смс gsm.println("AT+CMGDA=\"DEL ALL\"");//Удоляем всё SMS чтоб не накапливать их. delay(300); gsm.println("ATD*111#;\r"); // gsm.println("ATA"); } } currStr = ""; } else if ('\n' != data) { currStr += data; } } } void ringGsm() { boolean ring = true; currStr = ""; delay(10); while(ring) { data = gsm.read(); if (data == '"') { data = gsm.read(); while (data != '"') { currStr += data; data = gsm.read(); } if (currStr == ("+"+nomberPhone0) || currStr == ("+"+nomberPhone1))//додаємо плюс і порівнюєм номери { delay(1000); gsm.println("ATA");// Тогда сбрасываем звонок delay(100); // nomberPhone0 = plus - nomberPhone0; // nomberPhone1 = plus - nomberPhone1; return; } else //Если номер не совподает { gsm.println("ATHO");// Просто сбрасываем звонок. return; } } } } void readSms() { currStr = ""; while(gsm.available()>0) { data = gsm.read(); delay(10); Serial.println(currStr); if ('\r' == data) { if(!currStr.compareTo("Infa"))//Запрос и отправка баланса сим карты { Serial.println("Information"); // delay(5000); sendSms(97); // поки відключим відсилку смс delay(5000); // gsm.println("ATD*111#;\r"); return; } else if(!currStr.compareTo("Woff"))//Запрос и отправка баланса сим карты { waterOFF(); return; } else if(!currStr.compareTo("Guard"))//Запрос и отправка баланса сим карты { alarmState=1; //включаєм статус сигнализации без затримки // guardSound(1); //бибикаем Notify(0); readTime(); // виводимо час sendSms(0); // guardON(); return; } } else if ('\n' != data) { currStr += data; } } } void informationGuard() { if(alarmState == 1){ Serial.println("Guarn ON"); gsm.println("Guarn ON"); } if(alarmState == 0){ Serial.println("Guarn OFF"); gsm.println("Guarn OFF"); } } void informationWater() { if(waterValves == 1){ Serial.println("Water Open"); gsm.println("Water Open"); } if(waterValves == 0){ Serial.println("Water Close"); gsm.println("Water Close"); } } int checkWater() //функція провірки датчика води { int WsensorState = digitalRead(waterPin); // Serial.println(WsensorState); if (WsensorState == 0) // якщо затоплення { Notify(10);//оповіщення про спрацювання датчика води sendSms(10);// смс про затоплення readTime(); // виводимо час waterOFF();// перекриваєм воду waterAlarmed = 1; // включаєм статус потопу } if (Hacked != 1 && alarmState !=1)// zякщо не тривога і не на сигналізації то диаимся кнопку для можливості відкривання води { waterON(); waterAlarmed = 0;// виключаєм статус потопу } } void waterOFF() // перекривання води { if (Hacked == 1)// якщо взламано то перекрити воду і продовжити тревогу { digitalWrite(waterClose, LOW);// включити реле звкривання води digitalWrite(waterOpen, HIGH);// виключити реле відкривання води delay(9000); digitalWrite(waterClose, HIGH); // виключити реле звкривання води digitalWrite(greenLed, LOW); delay(900); guardSound(5); //бібікаєм guardBlink(3); //моргаем лампочками waterValves = 0; //встановлюэм режим закрито Notify(12); readTime(); // виводимо час Notify(2);// продовженя тревоги guardBlink(4); //пищим о том, что УСЁ ПРОПАЛО guardSound(4); //светим о том, что УСЁ ПРОПАЛО Hacked = 1; } else { digitalWrite(waterClose, LOW);// включити реле звкривання води digitalWrite(waterOpen, HIGH);// виключити реле відкривання води delay(9000); digitalWrite(waterClose, HIGH); // виключити реле звкривання води digitalWrite(greenLed, LOW); delay(900); guardSound(2); //бібікаєм guardBlink(2); //моргаем лампочками waterValves = 0; //встановлюэм режим закрито Notify(12); readTime(); // виводимо час } } void waterON() // відкривання води { if(waterValves == 0 && digitalRead(botton)==HIGH) { digitalWrite(waterClose, HIGH);// виключити реле звкривання води digitalWrite(waterOpen, LOW);// включити реле відкривання води delay(9000); digitalWrite(waterOpen, HIGH);// виключити реле відкривання води digitalWrite(greenLed, LOW); delay(900); guardSound(2); //бібікаєм guardBlink(2); //моргаем лампочками waterValves = 1; //встановлюэм режим відкрито Notify(11); readTime(); // виводимо час waterSms = 0; //скидаєм стан відправки смс про потоп } } int findKey() // функция пошуку ключа { byte i; byte addr[8]; byte checkOK = 0; //счетчик совпадений массива с эталоном //Serial.println("searching key..."); if (!ds.search(addr)) { // тут надо сделать нормально сделатЬ!!! //Serial.println("No key connected..."); // сообщаем об этом ds.reset_search(); // если не нашли, сбрасываем поиск в начало delay(200); return; // і повертаємся на початок циклу пошуку ключа for(int i = 0; i<8; i++) Serial.print(addr[i],HEX); Serial.print(" "); } Serial.println("\n"); // звірка першого ключа if (addr[1]==code1[1] && addr[2]==code1[2] && addr[3]==code1[3] && addr[4]==code1[4] && addr[5]==code1[5] && addr[6]==code1[6] && addr[7]==code1[7] && addr[8]==code1[8]) { checkOK = 8; } // звірка другого ключа if (addr[1]==code2[1] && addr[2]==code2[2] && addr[3]==code2[3] && addr[4]==code2[4] && addr[5]==code2[5] && addr[6]==code2[6] && addr[7]==code2[7] && addr[8]==code2[8]) { checkOK = 8; } // звірка третього ключа if (addr[1]==code3[1] && addr[2]==code3[2] && addr[3]==code3[3] && addr[4]==code3[4] && addr[5]==code3[5] && addr[6]==code3[6] && addr[7]==code3[7] && addr[8]==code3[8]) { checkOK = 8; } if (checkOK == 8 ) { return 1; } return 0; } void guardON() // выполнение действие при на сигнализацию { int j; alarmState=1; //включаем статус сигнализации guardSound(1); //бибикаем for (j=0; j < startTime; j++) { guardBlink(1); //моргаем лампочками и ждем время для закрытия двери } Notify(0); readTime(); // виводимо час sendSms(0); } void guardOFF() // выполнение действие при снятии с сигнализации { alarmState=0; // выключаем статус сигнализации Hacked = 0; // отменям статус "взломано" digitalWrite(greenLed, LOW); guardSound(2); //бибикаем guardBlink(2); //моргаем лампочками Notify(3); sendSms(3); readTime(); // виводимо час } void readTime () { DateTime now = rtc.now(); //get the current date-time uint32_t ts = now.getEpoch(); if (old_ts == 0 || old_ts != ts) { old_ts = ts; Serial.print(now.year(), DEC); Serial.print('/'); Serial.print(now.month(), DEC); Serial.print('/'); Serial.print(now.date(), DEC); Serial.println(); Serial.print(now.hour(), DEC); Serial.print(':'); Serial.print(now.minute(), DEC); Serial.print(':'); Serial.print(now.second(), DEC); Serial.println(); readTemperature (); } delay(1000); } void print2digits(int number) { if (number >= 0 && number < 10) { Serial.write('0'); } Serial.print(number); } void readTemperature () // считування температури { rtc.convertTemperature(); //конвертування температути в гр Ц Serial.print(rtc.getTemperature()); //читання датчика температури Serial.println(" C"); delay(1000); } void readTimeGsm () //зчитування часу для СМС { DateTime now = rtc.now(); //get the current date-time uint32_t ts = now.getEpoch(); if (old_ts == 0 || old_ts != ts) { old_ts = ts; gsm.print(now.year(), DEC); gsm.print('/'); gsm.print(now.month(), DEC); gsm.print('/'); gsm.print(now.date(), DEC); gsm.println(); gsm.print(now.hour(), DEC); gsm.print(':'); gsm.print(now.minute(), DEC); gsm.print(':'); gsm.print(now.second(), DEC); gsm.println(); readTemperatureGsm (); } delay(1000); } void readTemperatureGsm () // зчитування температури для СМС { rtc.convertTemperature(); //конвертування температути в гр Ц gsm.print(rtc.getTemperature()); //читання датчика температури gsm.println(" C"); delay(1000); } 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; readTime(); // виводимо час sendSms(2);// оповіщення СМС } } void onGsm() //старт GSM модуля { digitalWrite(9, LOW); delay(1000); digitalWrite(9, HIGH); // Подаем High на пин 9 delay(2000); // на 3 секунды digitalWrite(9, LOW); // и отпускаем в Low. delay(1000); // Ждём 5 секунд для старта шилда } void initGsm()//Инициализация GSM модуля { gsm.begin(9600); gsm.print("AT+CMGF=1\r");// устанавливает текстовый режим смс-сообщения delay(300); gsm.print("AT+IFC=1, 1\r");// устанавливает программный контроль потоком передачи данных delay(300); gsm.print("AT+CNMI=1,2,2,1,0\r");// Настройка вывода смс в консоль. У вас может отличатся! delay(300); gsm.print("AT+CPBS=\"SM\"\r");// открывает доступ к данным телефонной книги SIM-карты. delay(500); gsm.println("ATD*111#;\r"); } int testGsmOn(){//Функция опроса модема. Возвращает "0" если связь с модемом есть или "1" если нет. gsm.println("AT"); delay(100); gsm.println("AT"); delay(500); //gsm.println("ATD*111#;\r"); if(gsm.available()>0){ return 0; } else { return 1; } } 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_G3, NOTE_G3, NOTE_G3 }; int noteDurations[] = { 4,4,4 }; for (int thisNote = 0; thisNote < 3; 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_C2, NOTE_G1,NOTE_G2, NOTE_A1, NOTE_G1,0, NOTE_B2, NOTE_C3 }; 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, 500); //включаем на 500 Гц delay(100); //ждем 100 Мс tone(tonePin, 1000); //включаем на 1000 Гц delay(100); //ждем 100 Мс } if (x==5) { //тон потопу tone(tonePin, 500); //включаем на 500 Гц delay(250); //ждем 100 Мс tone(tonePin, 1000); //включаем на 1000 Гц delay(250); //ждем 100 Мс tone(tonePin, 800); //включаем на 500 Гц delay(250); //ждем 100 Мс tone(tonePin, 400); //включаем на 500 Гц delay(150); //ждем 100 Мс tone(tonePin, 1000); //включаем на 1000 Гц delay(350); //ждем 100 Мс } } int sendSms(int x) //функція оповіщення смс { if (x==0){ // СМС поставлено на сигналізацію initSendSms(0); while(1){//гтовність модему провірка gsm.println("AT+CPAS"); if (gsm.find("0")) break; delay(200); } initSendSms(1); delay(200); gsm.print("Guard ON");// текст смс gsm.print((char)26); // символ завершуючий передачу Notify(96); // повідомлення в серыйний порт про выдправку смс gsm.println("ATD*111#;\r"); //провіряєм баланс } while (gsm.available()>0){ //зупиняэмся і читаэм відповідь Serial.write(gsm.read()); } if (x==1){ // СМС відкрито двері initSendSms(0); while(1){//гтовність модему провірка gsm.println("AT+CPAS"); if (gsm.find("0")) break; delay(200); } initSendSms(1); delay(200); gsm.print("Dor OPEN");// текст смс gsm.print((char)26); // символ завершуючий передачу Notify(96); // повідомлення в серыйний порт про выдправку смс // gsm.println("ATD*111#;\r"); //провіряєм баланс } while (gsm.available()>0){ //зупиняэмся і читаэм відповідь Serial.write(gsm.read()); } if (x==2){ // СМС Взлом квартири initSendSms(0); while(1){//гтовність модему провірка gsm.println("AT+CPAS"); if (gsm.find("0")) break; delay(200); } initSendSms(1); delay(200); gsm.print("!!! VZLOM !!!");// текст смс gsm.print((char)26); // символ завершуючий передачу Notify(96); // повідомлення в серыйний порт про выдправку смс } while (gsm.available()>0){ //зупиняэмся і читаэм відповідь Serial.write(gsm.read()); } if (x==3){ // СМС сигналку виключени initSendSms(0); while(1){//гтовність модему провірка gsm.println("AT+CPAS"); if (gsm.find("0")) break; delay(200); } initSendSms(1); delay(200); gsm.print("Alarm OFF");// текст смс gsm.print((char)26); // символ завершуючий передачу Notify(96); // повідомлення в серыйний порт про выдправку смс gsm.println("ATD*111#;\r"); //провіряєм баланс } while (gsm.available()>0){ //зупиняэмся і читаэм відповідь Serial.write(gsm.read()); } if (x==10 && waterSms == 0){ // СМС потоп відправляється тільки одне до відкривання крану з кнопки initSendSms(0); while(1){//гтовність модему провірка gsm.println("AT+CPAS"); if (gsm.find("0")) break; delay(200); } initSendSms(1); delay(200); gsm.print("! POTOP !");// текст смс gsm.print((char)26); // символ завершуючий передачу waterSms = 1; //враховуєм що смс вже відправлено Notify(96); // повідомлення в серыйний порт про выдправку смс } while (gsm.available()>0){ //зупиняэмся і читаэм відповідь Serial.write(gsm.read()); } if (x==97){ // СМС стан initSendSms(0); while(1){//гтовність модему провірка gsm.println("AT+CPAS"); if (gsm.find("0")) break; delay(200); } initSendSms(1); informationGuard(); informationWater();// текст смс readTimeGsm(); gsm.print("Balans "); gsm.print(balance); gsm.print((char)26); // символ завершуючий передачу Notify(96); // повідомлення в серыйний порт про выдправку смс gsm.println("ATD*111#;\r"); //провіряєм баланс } while (gsm.available()>0){ //зупиняэмся і читаэм відповідь Serial.write(gsm.read()); } } int initSendSms(int x) { if (x==0){ // Активація текстовий режим смс повідомленнь gsm.println("AT+CMGF=1\r");// встановлюєм текстовий режим смс повідомленнь delay(200); gsm.println("ATCSCS=\"GSM\"");//встановлення кодувань delay(200); } if (x==1){ gsm.print("AT+CMGS=\"+"); // даэм команду на відправку смс з номером gsm.print(nomberPhone0); gsm.println("\""); delay(200); } } int Notify(int x) //функція оповіщення в послідовний порт { if (x==0) { // оповіщення поставлено на сигналізацію Serial.println("Alarm ON"); } if (x==1) { // оповіщення відкрито двері Serial.println("Dor OPEN"); } if (x==2) { // оповіщення взлом Serial.println("VZLOM AHTUNG"); } if (x==3) { //оповіщення знято з сигналізації Serial.println("Alarm OFF"); } if (x==10) { // оповіщення затоплення Serial.println("Potop"); } if (x==11) { // оповіщення про вікравання води Serial.println("Water Open"); } if (x==12) { // оповіщення про закриття води Serial.println("Water Closed"); } if (x==20) { // оповіщення про вхідний дзвінок господаря Serial.println("Master RING Detected"); } if (x==96) { // оповіщення про відправку смс Serial.println("SMS Send"); } if (x==97) { //оповіщення про стан informationGuard(); informationWater(); } if (x==98) { // оповіщення про включення ardunio Serial.println("READY GOO"); } if (x==99) { // оповіщення помилки Serial.println("ERROR"); } }Как и планировал прикрутил GSM.
Учту на счет ошибок спешил просто .
Извиняюсь.
pitches.h
Пока не все сообщения СМС активировал ещё наладка
Может кто подскажет как защитить входы, линия датчиков потопа около 10 м. возможны наводки
Сразу если можно с номиналами сопротивлений либо RC фильтров.
// char* RUS( char* StrIn){ char* StrOut=StrIn; uint8_t i[4]={0,0,StrIn[0],StrIn[1]}; while(i[2]>0&&i[0]<255){if(i[2]==0xd0&&i[3]>0x8F&&i[3]<0xC0){StrOut[i[1]]=i[3]+0x30;i[0]++;}else if(i[2]==0xd0&&i[3]==0x81){StrOut[i[1]]=0xA8;i[0]++;}else if(i[2]==0xd1&&i[3]>0x7F&&i[3]<0x90){StrOut[i[1]]=i[3]+0x70;i[0]++;}else if(i[2]==0xd1&&i[3]==0x91){StrOut[i[1]]=0xB8;i[0]++;}else{StrOut[i[1]]=i[2];} i[0]++; i[1]++; i[2]=StrIn[i[0]]; i[3]=StrIn[i[0]+1];} StrOut[i[1]]='\0'; return StrOut;} #include <OneWire.h> #include <Bounce2.h> #include "pitches.h" #include <Wire.h> #include "Sodaq_DS3231.h" #include <SoftwareSerial.h> SoftwareSerial gsm(7, 8); // встановлюєм порт лоя GSM RX, TX const byte greenLed = 11; //зелений диод const byte redLed = 10; //червоний диод const byte gerkonPin = 3; //геркон const byte pirPin = 2; //датчик руху const byte iButtonPin = 12; //пин для ibutton const byte tonePin = 6; // пін для пищалки const byte botton = 13; // кнопка const byte waterPin = 16; // пін дитчика води const byte waterClose = 5; // пін перекривання води const byte waterOpen = 4; // пін відкривання води //const byte gsmPower = 9; // пін вкл GSM const byte alarmTime = 8; // час , щоб піднести ключ при знятті з сигналізації const byte startTime = 20; // час , на закривання дверей при постановці на сигналізацію //GSM int readyGsm = 0; //флаг статусу GSM 0 - виключено 1-включено 2-ініціалізовано 3 немає зєднання const char* AllowPhone[] = {"380670000000", "380960000000"}; //Номера которым разрешено управлять охраной. На первый номер будут отправляться смс монитора порта (для отладки) int8_t CountPhone = sizeof(AllowPhone) / sizeof(AllowPhone[0]); String currStr = ""; // перемінна для обробки повідомлень з GSM String balance = ""; //перемінна для балансу int notSendSms = 0; // перемінна зберігає номер не відправленого смс int attemptsSend = 0;//спроби відправити char data; // перемінна для обробки повідомлень з GSM long previousMillis = 0;// перемінна для таймера long interval = 60000;// перемінна інтервалу провірки зєднання GSM //оброюка помилкового спрацювання Bounce debouncer = Bounce(); OneWire ds(iButtonPin); //ibutton byte code2[8] = {0x01, 0xE4, 0xD4, 0x84, 0x01, 0x00, 0x00, 0x0D}; //другий ключ byte code3[8] = {0x01, 0xE4, 0xF4, 0x84, 0x01, 0x00, 0x00, 0x0D}; //третий ключ byte code1[8] = {0x01, 0xF4, 0xF4, 0x84, 0x01, 0x00, 0x00, 0x0D}; //перший ключ boolean waterValves = 0; //флаг стану крана води boolean waterAlarmed = 0; //флаг спрацювання оповіщення про воду boolean alarmState = 1; //флаг працюючої сигналізації boolean gerkonState = 1; //першочергово закриті двері (1 - закрито, 0 - відкрито) boolean pirState = 0; //першочергово руху нема (0 - нема, 1 - рух) boolean Hacked = 0; // стандартні коди: 1- тревога, 0- тревоги нема void setup() { Serial.begin(9600); gsm.begin(9600); delay(2000); //затримка включення while (!Serial) ; // чекаєм на серійний порт delay(200); pinMode(9, OUTPUT);//пин керування GSM pinMode(greenLed, OUTPUT); //задаємо режим роботи пінв pinMode(redLed, OUTPUT); pinMode(waterPin, INPUT); pinMode(botton, INPUT); pinMode(gerkonPin, INPUT); pinMode(pirPin, INPUT); pinMode(waterClose, OUTPUT); pinMode(waterOpen, OUTPUT); digitalWrite(waterClose, HIGH); digitalWrite(waterOpen, HIGH); debouncer.attach(gerkonPin); debouncer.interval(50); // интервал в миллисекундах Wire.begin(); // gsmON(); rtc.begin(); Notify(98); // оповіщення про включення Ардуіно (наприклад при перезагрузці) readTime(); // виводимо час } uint32_t old_ts; void loop() { // int i=0; unsigned long currentMillis = millis(); byte returnedValue = 0; if(alarmState==0) { //Сигналізація виключена чекаєм коли піднесуть ключ для АКТИВАЦІЇ returnedValue = findKey(); if (returnedValue == 1) { // знайшли відомий ключ guardON(); //вкл статус сигналізації } } if(alarmState==1) { // якщо включена сигналізація то debouncer.update(); // оновлюєм помилкове спрацювання gerkonState = debouncer.read(); //дивимось геркон від помилкового спрацювання // Serial.println(gerkonState, HEX); if (gerkonState == 0 && Hacked != 1) { //открылась дверь и квартира не взломана якщо прописати gerkonState == 0 && Hacked != 1 то смк ;) Notify(1); // повідомлення про відкривання дверей alarmON(); //включаєм сигналку } pirState = digitalRead(pirPin); // дивимось датчик руху if (pirState == 1 && Hacked != 1) { //засікли рух Notify(4); // повідомлення про відкривання дверей alarmON(); //включаєм сигналку } returnedValue = findKey(); //потрібно виключити з середини квартири if (returnedValue == 1) { //знайшли відомий ключ alarmState=0; guardOFF(); } } returnedValue = 1; //скидаєм для обробки датчика води returnedValue = checkWater(); if (returnedValue==1) { // запускаем оповіщення про спрацювання датчика води Notify(10); //оповіщення про спрацювання датчика води } if (waterValves == 1 && Hacked != 1 && digitalRead(botton)==HIGH) { waterOFF();// перекриваєм воду } // gsm.println("AT"); if(gsm.available()>0){//если GSM модуль что-то послал нам, то readGsm(); } gsmInit(); if(currentMillis - previousMillis > interval) { //Каждые пол минуты проверяем состояние модема. previousMillis = currentMillis; if (testGsmOn()==1){ // Если связи с модемом нет пробуем сначало перезагрузить его, если это не помогло то пытаемся включить его. delay(900); if (testGsmOn()==1){ gsmON(); readyGsm=0; } } } while(attemptsSend<3){// пробуєм три рази вдправити треба не забути скидати цей параметр при зняттіз охорониі при повторному спацюванні if(notSendSms>0){//якщо є не відправлені смс пробуєм їх відправити sendSms(notSendSms); attemptsSend++; } else{ return; } } delay (500); } int checkWater() //функція провірки датчика води { int WsensorState = digitalRead(waterPin); // Serial.println(WsensorState); if (WsensorState == 0) // якщо затоплення { Notify(10);//оповіщення про спрацювання датчика води readTime(); // виводимо час waterOFF();// перекриваєм воду waterAlarmed = 1; // включаєм статус потопу } if (Hacked != 1 && alarmState !=1)// zякщо не тривога і не на сигналізації то диаимся кнопку для можливості відкривання води { waterON(); waterAlarmed = 0;// виключаєм статус потопу } } void waterOFF() // перекривання води { if (Hacked == 1)// якщо взламано то перекрити воду і продовжити тревогу { digitalWrite(waterClose, LOW);// включити реле звкривання води digitalWrite(waterOpen, HIGH);// виключити реле відкривання води delay(9000); digitalWrite(waterClose, HIGH); // виключити реле звкривання води digitalWrite(greenLed, LOW); delay(900); guardSound(5); //бібікаєм guardBlink(3); //моргаем лампочками waterValves = 0; //встановлюэм режим закрито Notify(12); readTime(); // виводимо час Notify(2);// продовженя тревоги guardBlink(4); //пищим о том, что УСЁ ПРОПАЛО guardSound(4); //светим о том, что УСЁ ПРОПАЛО Hacked = 1; } else { digitalWrite(waterClose, LOW);// включити реле звкривання води digitalWrite(waterOpen, HIGH);// виключити реле відкривання води delay(9000); digitalWrite(waterClose, HIGH); // виключити реле звкривання води digitalWrite(greenLed, LOW); delay(900); guardSound(2); //бібікаєм guardBlink(2); //моргаем лампочками waterValves = 0; //встановлюэм режим закрито Notify(12); readTime(); // виводимо час } } void waterON() // відкривання води { if(waterValves == 0 && digitalRead(botton)==HIGH) { digitalWrite(waterClose, HIGH);// виключити реле звкривання води digitalWrite(waterOpen, LOW);// включити реле відкривання води delay(9000); digitalWrite(waterOpen, HIGH);// виключити реле відкривання води digitalWrite(greenLed, LOW); delay(900); guardSound(2); //бібікаєм guardBlink(2); //моргаем лампочками waterValves = 1; //встановлюэм режим відкрито Notify(11); readTime(); // виводимо час } } int findKey() // функция пошуку ключа { byte i; byte addr[8]; byte checkOK = 0; //счетчик совпадений массива с эталоном //Serial.println("searching key..."); if (!ds.search(addr)) { // тут надо сделать нормально сделатЬ!!! //Serial.println("No key connected..."); // сообщаем об этом ds.reset_search(); // если не нашли, сбрасываем поиск в начало delay(200); return; // і повертаємся на початок циклу пошуку ключа for(int i = 0; i<8; i++) Serial.print(addr[i],HEX); Serial.print(" "); } Serial.println("\n"); // звірка першого ключа if (addr[1]==code1[1] && addr[2]==code1[2] && addr[3]==code1[3] && addr[4]==code1[4] && addr[5]==code1[5] && addr[6]==code1[6] && addr[7]==code1[7] && addr[8]==code1[8]) { checkOK = 8; } // звірка другого ключа if (addr[1]==code2[1] && addr[2]==code2[2] && addr[3]==code2[3] && addr[4]==code2[4] && addr[5]==code2[5] && addr[6]==code2[6] && addr[7]==code2[7] && addr[8]==code2[8]) { checkOK = 8; } // звірка третього ключа if (addr[1]==code3[1] && addr[2]==code3[2] && addr[3]==code3[3] && addr[4]==code3[4] && addr[5]==code3[5] && addr[6]==code3[6] && addr[7]==code3[7] && addr[8]==code3[8]) { checkOK = 8; } if (checkOK == 8 ) { return 1; } return 0; } void guardON() // выполнение действие при на сигнализацию { int j; alarmState=1; //включаем статус сигнализации guardSound(1); //бибикаем for (j=0; j < startTime; j++) { guardBlink(1); //моргаем лампочками и ждем время для закрытия двери } Notify(0); readTime(); // виводимо час } void guardOFF() // выполнение действие при снятии с сигнализации { alarmState=0; // выключаем статус сигнализации Hacked = 0; // отменям статус "взломано" digitalWrite(greenLed, LOW); guardSound(2); //бибикаем guardBlink(2); //моргаем лампочками Notify(3); readTime(); // виводимо час } void readGsm () { while(gsm.available()>0) { data = gsm.read(); delay(10); Serial.println(currStr); // рзкомент щоб дивитись відповіді if ('\r' == data) { if(!currStr.compareTo("RING"))//Если текущая строка RING, значит едёт входящий звонок. { boolean ring = true; currStr = ""; delay(10); while(ring) { data = gsm.read(); if (data == '"') { data = gsm.read(); while (data != '"') { currStr += data; data = gsm.read(); } if (CheckPhone() == 1){ // Звіряєм номер телефону // delay(1000); Notify(20); gsm.println("ATA");// Тогда сбрасываем звонок delay(100); return; } else{ //Если номер не совподает gsm.println("ATHO");// Просто сбрасываем звонок. return; } } } // ringGsm(); } else { delay(100); if(currStr.startsWith("+CUSD: 0,")) { int zzz = currStr.indexOf('grn'); balance=currStr.substring(30,zzz+4); //баланс на сим карте Serial.print(balance); // потім закоментувати sendSms(97); // поки відключим відсилку смс } if(currStr.startsWith("+CMT")) //Или если строка начинаеться c +CMT, значит пришло SMS { if (CheckPhone() == 1)// Звіряєм номер телефону { currStr = ""; while(gsm.available()>0) { data = gsm.read(); delay(10); Serial.println(currStr); if ('\r' == data){ if(!currStr.compareTo("Infa")){//Запрос и отправка баланса сим карты gsm.println("ATD*111#;\r"); Serial.println("Information"); return; } else if(!currStr.compareTo("Woff")){//Запрос и отправка баланса сим карты waterOFF(); return; } else if(!currStr.compareTo("Guard")){//Запрос и отправка баланса сим карты alarmState=1; //включаєм статус сигнализации без затримки Notify(0); readTime(); // виводимо час // sendSms(0); return; } } else if ('\n' != data){ currStr += data; } } // readSms(); gsm.println("AT+CMGDA=\"DEL ALL\"");//Видаляєм всі СМС щоб не забивати память delay(500); } else gsm.println("AT+CMGDA=\"DEL ALL\"");//Видаляєм всі СМС щоб не забивати память Serial.println("Ignor"); } } currStr = ""; } else if ('\n' != data) { currStr += data; } } } int CheckPhone() { for (int i = 0; i < CountPhone; i++) { if (currStr.indexOf(AllowPhone[i]) > -1) { // RingPhone = AllowPhone[i]; // Serial.println("Event: +" + RingPhone); return 1; } } return 0; } int sendSms(int x) //функція оповіщення смс { if(readyGsm == 2){ if (x==0){ // СМС поставлено на сигналізацію initSendSms(); delay(200); gsm.print("Guard ON");// текст смс gsm.print((char)26); // символ завершуючий передачу Notify(96); // повідомлення в серыйний порт про выдправку смс } if (x==1){ // СМС відкрито двері initSendSms(); delay(200); gsm.print("Dor OPEN");// текст смс gsm.print((char)26); // символ завершуючий передачу Notify(96); // повідомлення в серыйний порт про выдправку смс } if (x==2){ // СМС Взлом квартири // while(user<2){ //відправляєм по смс на кожен номер (2 СМС) initSendSms(); delay(200); gsm.print("!!! VZLOM !!!");// текст смс gsm.print((char)26); // символ завершуючий передачу if (gsm.find("OK")){ Notify(96); // повідомлення в серыйний порт про выдправку смс } else{ notSendSms=2; Serial.println("SMS Send Error"); } } if (x==3){ // СМС сигналку виключени initSendSms(); delay(200); gsm.print("Alarm OFF");// текст смс gsm.print((char)26); // символ завершуючий передачу Notify(96); // повідомлення в серыйний порт про выдправку смс } if (x==10/* && waterSms < 2*/){ // СМС потоп відправляється тільки одне до відкривання крану з кнопки initSendSms(); delay(200); gsm.print("! POTOP !");// текст смс gsm.print((char)26); // символ завершуючий передачу // waterSms++; //враховуєм що смс вже відправлено Notify(96); // повідомлення в серыйний порт про выдправку смс // user++; } if (x==97){ // СМС стан initSendSms(); // informationGuard(); // informationWater();// текст смс // readTimeGsm(); gsm.print("Balans "); gsm.print(balance); gsm.print((char)26); // символ завершуючий передачу if (gsm.find("OK")){ Notify(96); // повідомлення в серыйний порт про выдправку смс } else{ notSendSms=97; Serial.println("SMS Send Error"); return; } } } if(readyGsm < 2 || readyGsm == 3){ if (x==0){ // СМС поставлено на сигналізацію Serial.println("SMS Send Error"); return; } if (x==1){ // СМС відкрито двері Serial.println("SMS Send Error"); notSendSms=1; return; } if (x==2){ // СМС Взлом квартири Serial.println("SMS Send Error"); notSendSms=2; return; } if (x==3){ // СМС сигналку виключени Serial.println("SMS Send Error"); notSendSms=3; return; } if (x==10/* && waterSms < 2*/){ // СМС потоп відправляється тільки одне до відкривання крану з кнопки Serial.println("SMS Send Error"); notSendSms=10; return; } if (x==97){ // СМС стан Serial.println("SMS Send Error"); notSendSms=97; return; } // Serial.println("SMS Send Error"); // // дописати можливість відправити смс після інічіалізаціїї // notSendSms= // return; } } int initSendSms(){ gsm.print("AT+CMGS=\"+"); // даэм команду на відправку смс з номером gsm.print(AllowPhone[0]); gsm.println("\""); delay(300); } void readTime () { DateTime now = rtc.now(); //get the current date-time uint32_t ts = now.getEpoch(); if (old_ts == 0 || old_ts != ts) { old_ts = ts; Serial.print(now.year(), DEC); Serial.print('/'); Serial.print(now.month(), DEC); Serial.print('/'); Serial.print(now.date(), DEC); Serial.println(); Serial.print(now.hour(), DEC); Serial.print(':'); Serial.print(now.minute(), DEC); Serial.print(':'); Serial.print(now.second(), DEC); Serial.println(); readTemperature (); } delay(1000); } void readTemperature () // считування температури { rtc.convertTemperature(); //конвертування температути в гр Ц Serial.print(rtc.getTemperature()); //читання датчика температури Serial.println(" C"); delay(1000); } 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; readTime(); // виводимо час sendSms(2);// оповіщення СМС } } 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_G3, NOTE_G3, NOTE_G3 }; int noteDurations[] = { 4,4,4 }; for (int thisNote = 0; thisNote < 3; 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_C2, NOTE_G1,NOTE_G2, NOTE_A1, NOTE_G1,0, NOTE_B2, NOTE_C3 }; 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, 500); //включаем на 500 Гц delay(100); //ждем 100 Мс tone(tonePin, 1000); //включаем на 1000 Гц delay(100); //ждем 100 Мс } if (x==5) { //тон потопу tone(tonePin, 500); //включаем на 500 Гц delay(250); //ждем 100 Мс tone(tonePin, 1000); //включаем на 1000 Гц delay(250); //ждем 100 Мс tone(tonePin, 800); //включаем на 500 Гц delay(250); //ждем 100 Мс tone(tonePin, 400); //включаем на 500 Гц delay(150); //ждем 100 Мс tone(tonePin, 1000); //включаем на 1000 Гц delay(350); //ждем 100 Мс } } int Notify(int x) //функція оповіщення в послідовний порт { if (x==0) { // оповіщення поставлено на сигналізацію Serial.println("Alarm ON"); } if (x==1) { // оповіщення відкрито двері Serial.println("Dor OPEN"); } if (x==2) { // оповіщення взлом Serial.println("VZLOM AHTUNG"); } if (x==3) { //оповіщення знято з сигналізації Serial.println("Alarm OFF"); } if (x==4) { // оповіщення відкрито двері Serial.println("Motion detected"); } if (x==10) { // оповіщення затоплення Serial.println("Potop"); } if (x==11) { // оповіщення про вікравання води Serial.println("Water Open"); } if (x==12) { // оповіщення про закриття води Serial.println("Water Closed"); } if (x==20) { // оповіщення про вхідний дзвінок господаря Serial.println("Master RING Detected"); } if (x==96) { // оповіщення про відправку смс Serial.println("SMS Send"); } if (x==97) { //оповіщення про стан // informationGuard(); // informationWater(); } if (x==98) { // оповіщення про включення ardunio Serial.println("READY GOO"); } if (x==99) { // оповіщення помилки Serial.println("ERROR"); } } void gsmInit() { while (readyGsm<2){ gsm.println("AT"); if (gsm.find("OK")){ Serial.println("GSM ON"); readyGsm++; while(readyGsm<2){ gsm.print("AT+CMGF=1\r");// устанавливает текстовый режим смс-сообщения delay(300); gsm.print("AT+IFC=1, 1\r");// устанавливает программный контроль потоком передачи данных delay(300); gsm.print("AT+CNMI=1,2,2,1,0\r");// Настройка вывода смс в консоль. У вас может отличатся! delay(300); gsm.print("AT+CPBS=\"SM\"\r");// открывает доступ к данным телефонной книги SIM-карты. delay(300); gsm.println("AT+COPS?"); if (gsm.find("0")){ Serial.println("GSM INIT"); readyGsm++; attemptsSend = 0; // break; } } break; } while (readyGsm<1){ gsmON(); readyGsm++; } // readyGsm++; gsmON(); readyGsm=3; // break; Serial.println("GSM FAILED"); break; } } void gsmON() //старт GSM модуля { digitalWrite(9, LOW); delay(300); digitalWrite(9, HIGH); // Подаем High на пин 9 delay(2000); // на 3 секунды digitalWrite(9, LOW); // и отпускаем в Low. } int testGsmOn(){//Функция опроса модема. Возвращает "0" если связь с модемом есть или "1" если нет. gsm.println("AT"); if (gsm.find("OK")){ return 0; } else{ return 1; } }Полностью переделал процедуру watchdog и подготовку модема
Добавил несколько попыток отправки смс. Раньше при невозможности отправки все подвешивалось.
Защитить входы - да хотя бы так.
Защитить входы - да хотя бы так.
Спасибо