Звукавая сигнализация

rossolimo
Offline
Зарегистрирован: 24.10.2016

народ имееться магнит на дверь и сам контакт типо такого:

нужна помощь в реализации скетча.

(при поднисении магнита контакт замкнут)

что должно уметь:

имееться это(назовем  кнопка 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 (сигнализация назоем ее так выключеном состоянии) прислонил второй раз включает сигнализацию

rossolimo
Offline
Зарегистрирован: 24.10.2016

нужно уместить как то все в один скетч( я в написании не селен по этому и прошу помощи форумчан и знатаков)

rossolimo
Offline
Зарегистрирован: 24.10.2016

да, вот нашел вариант 


#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");
    }
}

но вместо геркона надо прописать "кнопку" а так же убрать w1 w2 w3 и лишнию обвязку оставив 2 лампы кнопку и ibutton и колонку

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

rossolimo пишет:

но вместо геркона надо прописать "кнопку"

Это как? Чем должна отличаться в коде кнопка от геркона?

rossolimo
Offline
Зарегистрирован: 24.10.2016

при размыкании включалась б да и код сам частино нерабочий(

ни ключ не читает не моргает светодиодами и не играеться сирена

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

rossolimo пишет:

но вместо геркона надо прописать "кнопку"

А кнопка круглая или квадратная?

rossolimo
Offline
Зарегистрирован: 24.10.2016

"кнопка" по схеме такая вот так работает при поднисение магнита контакт появляеться при убирание магнита контакт размыкаеться тоесть вместо механического нажатие идет нажатие от магнитного поля по сути это кнопка

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

rossolimo пишет:

при размыкании включалась б

ОК, чем должно отличаться в коде размыкание кнопки от размыкания геркона?

rossolimo пишет:

"кнопка" по схеме такая вот так работает при поднисение магнита контакт появляеться при убирание магнита контакт размыкаеться тоесть вместо механического нажатие идет нажатие от магнитного поля по сути это кнопка

Это всё понятно, так и должен работать геркон. Непонятно, что Вы хотели сказать фразой "но вместо геркона надо прописать "кнопку"" ? Как в коде можно изменить геркон на кнопку (или наоборот), если электрически они работают абсолютно одинаково - контакты либо замкнуты, либо разомкнуты. Каким образом контакты замыкаются - магнитным полем или нажатем пальца руки не имеет никакого значения.

rossolimo
Offline
Зарегистрирован: 24.10.2016

щас данный скетч частично не работает и есть 2 варианта чтения ключа. тот что в скетче не подходит к rw1990/

сперва скетч надо привести в работоспособность а потом заменить структуру чтения на ibutton rw1990

rossolimo
Offline
Зарегистрирован: 24.10.2016

рабочий код сигнализации (с датчиком воды не возился)

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"));
    }
}

 

rossolimo
Offline
Зарегистрирован: 24.10.2016

в верхнем скетче сигналка реагировала на любой ключ в этом же скетче эта проблема устранена

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("Ошибка"));
    }
}

..."спасибо ".. что помоги... ждал от форума поддержки, а в результате ее нет. не понятно существования данного форума тогда

rossolimo
Offline
Зарегистрирован: 24.10.2016

и так народ решил оптимизировать данный скетч для связки ардуино 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("Ошибка");
    }
}

прошу помощи а не просто просмотреть тему и закрыть.

Yura_yg
Offline
Зарегистрирован: 02.01.2017

Здраствуйте интересная тема. хочу реализовать что то подобное. В програмировании для ардуино есче не силен. Думаю если выстввили скетч то не против его использования. Не могу загрузить на Arduino куча ошибок. Интересует вариант 01/12/2016 - 18:17

Yura_yg
Offline
Зарегистрирован: 02.01.2017

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

как сохранить текущее состояние переменной

boolean alarmState = 0; //флаг работающей сигнализации

для использования в следующей загрузке

может я не все понимаю ИЗВИНИТЕ

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Для сохранени я информации, которая меняется при работе программы, но должна сохраняться после перезагрузки, предназначена EEPROM.

Yura_yg
Offline
Зарегистрирован: 02.01.2017

Понял что ето но решил не заморачиватся и поставил статус при перезагрузке сразу на сигнализации.

 

Yura_yg
Offline
Зарегистрирован: 02.01.2017
// 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, датчик дыма, газа, клапа перекрытия газа . хорошо что все провода пробросил при ремонте
есть проблема с добавлением второго ключа пока не пойму. 

Yura_yg
Offline
Зарегистрирован: 02.01.2017

Yura_yg
Offline
Зарегистрирован: 02.01.2017
// 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.

понял почему открывало любым ключем вариант

085             if (addr[i]==code1[i] || addr[i]==code2[i]) {
086                 checkOK++;
087             }
088         
089         if (checkOK == 8

Потому что в каждом ключе первый и последние пять байт одинаковы и вместе checkOK == 8 наберал 8

Yura_yg
Offline
Зарегистрирован: 02.01.2017

Думаю есть решение

bizzon
Offline
Зарегистрирован: 29.03.2016

Если вы хотите хорошего совета, то хотя бы пишите грамотно. Те, у кого вы просите помощи, перестают читать ваш пост после увиденного. Не умеете- напишите сначала в ворде. Он вас поправит (например : датчик дИма, еСЧе)- кошмар!! 

Да, я старый зануда. Как и многие, к кому вы обращаетесь.

Yura_yg
Offline
Зарегистрирован: 02.01.2017

Yura_yg
Offline
Зарегистрирован: 02.01.2017
// 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

#define NOTE_B0  31

#define NOTE_C1  33

#define NOTE_CS1 35

#define NOTE_D1  37

#define NOTE_DS1 39

#define NOTE_E1  41

#define NOTE_F1  44

#define NOTE_FS1 46

#define NOTE_G1  49

#define NOTE_GS1 52

#define NOTE_A1  55

#define NOTE_AS1 58

#define NOTE_B1  62

#define NOTE_C2  65

#define NOTE_CS2 69

#define NOTE_D2  73

#define NOTE_DS2 78

#define NOTE_E2  82

#define NOTE_F2  87

#define NOTE_FS2 93

#define NOTE_G2  98

#define NOTE_GS2 104

#define NOTE_A2  110

#define NOTE_AS2 117

#define NOTE_B2  123

#define NOTE_C3  131

#define NOTE_CS3 139

#define NOTE_D3  147

#define NOTE_DS3 156

#define NOTE_E3  165

#define NOTE_F3  175

#define NOTE_FS3 185

#define NOTE_G3  196

#define NOTE_GS3 208

#define NOTE_A3  220

#define NOTE_AS3 233

#define NOTE_B3  247

#define NOTE_C4  262

#define NOTE_CS4 277

#define NOTE_D4  294

#define NOTE_DS4 311

#define NOTE_E4  330

#define NOTE_F4  349

#define NOTE_FS4 370

#define NOTE_G4  392

#define NOTE_GS4 415

#define NOTE_A4  440

#define NOTE_AS4 466

#define NOTE_B4  494

#define NOTE_C5  523

#define NOTE_CS5 554

#define NOTE_D5  587

#define NOTE_DS5 622

#define NOTE_E5  659

#define NOTE_F5  698

#define NOTE_FS5 740

#define NOTE_G5  784

#define NOTE_GS5 831

#define NOTE_A5  880

#define NOTE_AS5 932

#define NOTE_B5  988

#define NOTE_C6  1047

#define NOTE_CS6 1109

#define NOTE_D6  1175

#define NOTE_DS6 1245

#define NOTE_E6  1319

#define NOTE_F6  1397

#define NOTE_FS6 1480

#define NOTE_G6  1568

#define NOTE_GS6 1661

#define NOTE_A6  1760

#define NOTE_AS6 1865

#define NOTE_B6  1976

#define NOTE_C7  2093

#define NOTE_CS7 2217

#define NOTE_D7  2349

#define NOTE_DS7 2489

#define NOTE_E7  2637

#define NOTE_F7  2794

#define NOTE_FS7 2960

#define NOTE_G7  3136

#define NOTE_GS7 3322

#define NOTE_A7  3520

#define NOTE_AS7 3729

#define NOTE_B7  3951

#define NOTE_C8  4186

#define NOTE_CS8 4435

#define NOTE_D8  4699

#define NOTE_DS8 4978

pitches

 

Yura_yg
Offline
Зарегистрирован: 02.01.2017
#define NOTE_B0  31

#define NOTE_C1  33

#define NOTE_CS1 35

#define NOTE_D1  37

#define NOTE_DS1 39

#define NOTE_E1  41

#define NOTE_F1  44

#define NOTE_FS1 46

#define NOTE_G1  49

#define NOTE_GS1 52

#define NOTE_A1  55

#define NOTE_AS1 58

#define NOTE_B1  62

#define NOTE_C2  65

#define NOTE_CS2 69

#define NOTE_D2  73

#define NOTE_DS2 78

#define NOTE_E2  82

#define NOTE_F2  87

#define NOTE_FS2 93

#define NOTE_G2  98

#define NOTE_GS2 104

#define NOTE_A2  110

#define NOTE_AS2 117

#define NOTE_B2  123

#define NOTE_C3  131

#define NOTE_CS3 139

#define NOTE_D3  147

#define NOTE_DS3 156

#define NOTE_E3  165

#define NOTE_F3  175

#define NOTE_FS3 185

#define NOTE_G3  196

#define NOTE_GS3 208

#define NOTE_A3  220

#define NOTE_AS3 233

#define NOTE_B3  247

#define NOTE_C4  262

#define NOTE_CS4 277

#define NOTE_D4  294

#define NOTE_DS4 311

#define NOTE_E4  330

#define NOTE_F4  349

#define NOTE_FS4 370

#define NOTE_G4  392

#define NOTE_GS4 415

#define NOTE_A4  440

#define NOTE_AS4 466

#define NOTE_B4  494

#define NOTE_C5  523

#define NOTE_CS5 554

#define NOTE_D5  587

#define NOTE_DS5 622

#define NOTE_E5  659

#define NOTE_F5  698

#define NOTE_FS5 740

#define NOTE_G5  784

#define NOTE_GS5 831

#define NOTE_A5  880

#define NOTE_AS5 932

#define NOTE_B5  988

#define NOTE_C6  1047

#define NOTE_CS6 1109

#define NOTE_D6  1175

#define NOTE_DS6 1245

#define NOTE_E6  1319

#define NOTE_F6  1397

#define NOTE_FS6 1480

#define NOTE_G6  1568

#define NOTE_GS6 1661

#define NOTE_A6  1760

#define NOTE_AS6 1865

#define NOTE_B6  1976

#define NOTE_C7  2093

#define NOTE_CS7 2217

#define NOTE_D7  2349

#define NOTE_DS7 2489

#define NOTE_E7  2637

#define NOTE_F7  2794

#define NOTE_FS7 2960

#define NOTE_G7  3136

#define NOTE_GS7 3322

#define NOTE_A7  3520

#define NOTE_AS7 3729

#define NOTE_B7  3951

#define NOTE_C8  4186

#define NOTE_CS8 4435

#define NOTE_D8  4699

#define NOTE_DS8 4978

pitches

 

Yura_yg
Offline
Зарегистрирован: 02.01.2017

 

Пока не все сообщения СМС активировал ещё наладка

Может кто подскажет как защитить входы, линия датчиков потопа около 10 м. возможны наводки

Сразу если можно с номиналами сопротивлений либо RC фильтров.  

 

Yura_yg
Offline
Зарегистрирован: 02.01.2017



// 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 и подготовку модема

Добавил несколько попыток отправки смс. Раньше при невозможности отправки все подвешивалось.

 

bizzon
Offline
Зарегистрирован: 29.03.2016

Защитить входы - да хотя бы так.

Yura_yg
Offline
Зарегистрирован: 02.01.2017

bizzon пишет:

Защитить входы - да хотя бы так.

Спасибо