Прошу помощи закрыть, открыть воду через таймер

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

 

Прошу помощи, хочу переписать процедуру закрывания, открывания воды через таймер используется два реле чтоб менять полярность для сервопривода крана. Чтобы кран успел закрыться открыться нужно 10сек. примерно, до этого использовал delay();

Но понял что в моем проекте это большая дыра.

​было так

    digitalWrite(waterClose, LOW);// включити реле звкривання води
    digitalWrite(waterOpen, HIGH);// виключити реле відкривання води
    delay(10000);
    digitalWrite(waterClose, HIGH); // виключити реле звкривання води
    digitalWrite(greenLed, LOW);

полностью



// 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 pirPin = 2; //датчик руху
const byte gerkonPin = 3; //геркон
const byte waterOpen = 4; // пін відкривання води
const byte waterClose = 5; // пін перекривання води
const byte tonePin = 6; // пін для пищалки
const byte redLed = 10;  //червоний диод
const byte botton = 11; // кнопка
const byte iButtonPin = 12; //пин для ibutton
const byte greenLed = 13; //зелений диод
const byte waterPin = 16; // пін дитчика води

//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[] = {"380673185859", "380968366822"}; //Номера которым разрешено управлять охраной. На первый номер будут отправляться смс монитора порта (для отладки)
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();
//    gsmInit();
    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(10000);
    digitalWrite(waterClose, HIGH); // виключити реле звкривання води
    digitalWrite(greenLed, LOW);
    delay(200);
    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(10000);//затримка для закривання крану
    digitalWrite(waterClose, HIGH); // виключити реле звкривання води
    digitalWrite(greenLed, LOW);
    delay(2900);
    guardSound(2); //бібікаєм
    guardBlink(2); //моргаем лампочками
    waterValves = 0; //встановлюэм режим закрито
    Notify(12);
    readTime(); // виводимо час
    }
}
void waterON() // відкривання води
{
    if(waterValves == 0 && digitalRead(botton)==HIGH)
   {
    digitalWrite(waterClose, HIGH);// виключити реле звкривання води
    digitalWrite(waterOpen, LOW);// включити реле відкривання води
    delay(10000); //затримка для закривання крану
    digitalWrite(waterOpen, HIGH);// виключити реле відкривання води
    digitalWrite(greenLed, LOW);
    delay(200);
    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])
      {
       return 1;
      }
// звірка другого ключа
    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])
      {
       return 1;
      }   
// звірка третього ключа   
    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])
      {
       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(300);
          }
          else
            gsm.println("AT+CMGDA=\"DEL ALL\"");//Видаляєм всі СМС щоб не забивати память
            Serial.println("Ignor");  
            delay(300);        
        } 
      }
      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;
  }
}

Делаю для себя и попутно учусь так что за написание не пинайте.

 

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

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Yura_yg пишет:

Но понял что в моем проекте это большая дыра.

В вашем проекте дыра это отсутсвие классов. Это как вы пытаетесь строить небоскреб , пользуясь технологией строительства землянки. Ну или схрона, как кому нравится.

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

qwone пишет:

Yura_yg пишет:

Но понял что в моем проекте это большая дыра.

В вашем проекте дыра это отсутсвие классов. Это как вы пытаетесь строить небоскреб , пользуясь технологией строительства землянки. Ну или схрона, как кому нравится.

 

Вы видели чтоб я писал что то про классы?

Ви не в той теме.

Просил же не пинать.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

А вы знакомы , о переходе количества в качество. У вас очень большой длиный код.  И я не увидел у вас классов, но увидел избыток функций. Вот и указал на это.  Тем более я бы создал класс открывания и закрывания воды по времени и использовал бы. Но так как вам это не приемлимо, то мой рецепт вам не подойдет.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Вот это

Yura_yg пишет:

Прошу помощи, 

противоречит вот этому

Yura_yg пишет:

не пинайте.

Вы уж уж определитесь чего Вы хотите, помощи или "одобрямса/похвалямса", а потом обращайтесь к сообществу.

 

freeman86
Offline
Зарегистрирован: 07.09.2016

В Си есть классы? )

Клапауций 823
Клапауций 823 аватар
Offline
Зарегистрирован: 13.01.2017

freeman86 пишет:

В Си есть классы? )

я запретил.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

freeman86 пишет:

В Си есть классы? )

На 3 день Чунгачгук зоркий глаз начал подозревать, что в сарае, куда его посадили нет четвертой стены.

http://arduino.ru/Hacking/LibraryTutorial

В Си классов нет, они есть в С++ . Просто компилятор понимает и то и то.  

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

За это благодарен когда-нибудь попробую разобраться.

 

qwone пишет:

А вы знакомы , о переходе количества в качество. У вас очень большой длиный код.  И я не увидел у вас классов, но увидел избыток функций. Вот и указал на это.  Тем более я бы создал класс открывания и закрывания воды по времени и использовал бы. Но так как вам это не приемлимо, то мой рецепт вам не подойдет.

 

Но кто то может навести пример как включить светодиод на 10 сек. при нажатии на кнопку без использования задержки? Не МОРГАТЬ включить.

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Yura_yg пишет:

Но кто то может навести пример как включить светодиод на 10 сек. при нажатии на кнопку без использования задержки? Не МОРГАТЬ включить.

Ну может этот код вам религия не позволяет использовать https://yadi.sk/d/WKaKvxrX3APTwN

Ну и головной файл сюда 

/* class_Do_btn_deBounce.ino  https://yadi.sk/d/WKaKvxrX3APTwN
  #1 реле ->13
  #2 кнопка ->2
  Принцип кода:нажал 1 раз реле вкл на опред веремя. Замечение: вкл можно только когда выкл, иначе вкл будут не учтены.
*/
//#1 светодиод
#include "Cl_time_relay.h"
#define RELAY_PIN 13
Cl_time_relay T_Relay1(RELAY_PIN, 0, 1000); // (пин,логика,время relay ON) /создать по времени отключ реле на пине 13
void func() {
  T_Relay1.ON();
}
//#2 кнопка
#include "Cl_press_btn.h"
#define BTN_PIN 2
Cl_press_btn Btn(BTN_PIN); // создать кнопку на пине 2
void setup() {
  Serial.begin(9600);
  //#1 реле
  T_Relay1.setup();
  //#2 кнопка
  Btn.setup();
}
void loop() {
  //#1 реле
  T_Relay1.loop();
  //#2 кнопка
  Btn.loop(& func  );
}

В 9 строке  Cl_time_relay T_Relay1(RELAY_PIN, 0, 1000);Замените 1000 на 10000

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

Большое спасибо :)

Я знал что есть хорошие люди

Которые помогут мне не смотря на мои религиозные взгляды. )

 

 

 

 

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

Очень благодарю за готовый пример.

Извините за

 

Yura_yg пишет:

qwone пишет:

Yura_yg пишет:

Но понял что в моем проекте это большая дыра.

В вашем проекте дыра это отсутсвие классов. Это как вы пытаетесь строить небоскреб , пользуясь технологией строительства землянки. Ну или схрона, как кому нравится.

 

Вы видели чтоб я писал что то про классы?

Ви не в той теме.

Просил же не пинать.

 

 

 

Надо учить классы это просто класс .

Уже прикрутил под свои цели, это при том что я программирую всего неделю.

И при том он мне пригодится только тут ещё несколько раз

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Я рад что вам понравилось. Вот подброшу еще один скетч. Полностью здесь https://yadi.sk/d/UfwvGmLp3CsezS

а главный файл тут выложу 

/* Class_do_btn_dn_up_Servo.ino https://yadi.sk/d/UfwvGmLp3CsezS
  #1 серво 1->9
  #2 кнопка ->2
  Принцип кода:нажал на кнопку , серва повернулась на 15 градусов
               отпустил  кнопку , серва вернулась обратно
*/
//#1 серво 1
#include <Servo.h>
Servo servo;
const int servo_pin = 9;// нога сервы
void func_down() {// когда кнопка нажата
  servo.write(15);
}
void func_up() {// когда кнопка отпущена
  servo.write(0);
}
//#2 кнопка 1
#include "Cl_do_btn_dn_up.h"
const byte btn1_pin = 2;
Cl_do_btn_dn_up Do_btm1; // создать

void setup() {
  //#1 серво 1
  servo.attach(servo_pin);
  servo.write(0);
  //#2 кнопка 1
  Do_btm1.logic = 0; // когда 0 это нажатая кнопка
  Do_btm1.setup(btn1_pin);
}
void loop() {
  //#1 серво 1
  //#2 кнопка 1
  Do_btm1.loop(& func_down , & func_up );
}

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

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

пины через дефайны, пины на вход объвлять необязательно

с 618 строки через case swith

digitalWrite(waterClose, HIGH);// виключити реле звкривання води
digitalWrite(waterOpen, LOW);// включити реле відкривання води
delay(10000); //затримка для закривання крану
digitalWrite(waterOpen, HIGH);// виключити реле відкривання води
digitalWrite(greenLed, LOW);

оформить через функцию с параметром

в 232 строке и ниже можно через цикл оформить, а не писать кучу условий

кстати вместо если бла бла бла ==1 можно писать просто if бла бла бла. а вместо бла бла бла !=1 можно писать !бла бла бла. это одно и тоже

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

ОК учту спасибо за замечание.

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

для недели программируешь как то не похоже, может конкретно ардуину, хотя возможно конечно

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

jeka_tm пишет:

для недели программируешь как то не похоже, может конкретно ардуину, хотя возможно конечно

 

Программирую как то громко сказал. Луше подходит (копи паст) но идея давно била сделать что то подобное и при ремонте провода в стены заштукатурил. На газовую трубу клапан сразу поставил.

Потом все откладывал.

И тут месяц назад обчистили  квартиру. Окрыли и закрыли спокойно.

 Очень стимулировало.

С HTML ближе знаком, и только как хобби.

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

то есть боишься в следующий раз грабители откроют кран и не закроют? или спалить взлом квартиры и грабители решат помыть руки, а ты им воду перекроешь? 

не пойму как одно с другим связано

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

))

 

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

 

Просто места мало под сингалку отдельную и анти потоп.

 

И хочу сделать все в одном.

 

 

 

 

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

 

Мало какие совпадения бывают. И тут потоп и закрывается вода .

Тогда можно открывать дверь и делать что хочешь

 

Проверил на СМК и PIR не реагирует.

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

я понимаю тебя с одной стороны. ну допустим ты узнал что грабители пришли

1. что делать собираешься с грабителями?

2. что должна делать твоя система кроме перекрывания воды?

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

1. звони ментам

2. как узнал что мою дачу грабят

3. и можно к вам. дома скучно)))

забыл. это не я, это все виски пишет моими руками

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

 

Когда спалю взлом то будет ещё одно реле с

 

с активацией по смс

 

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

 

в процессе ещё допишу

 

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

 

Работает в двух режимах

первый контроль протекания и возгорания

второй протекание возгорание и охрана с сиреной, уведомлениями.

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

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

и асма это в лучше случае. не говори потом что тебя не предупреждали что твоей телек и ноут окажутся будут стоить жизни ребенка

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

это касается только охраны от грабежа и твоей псевдозащиты

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

jeka_tm пишет:

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

и асма это в лучше случае. не говори потом что тебя не предупреждали что твоей телек и ноут окажутся будут стоить жизни ребенка

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

Все правильно

 

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

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

дети есть? ты готов рискнуть ими? если родители идиоты...

двери с противосъемными штырями. хороший замок. это если через дверь. поставь датчики и за деньги на охрану в чоп. не ставь хим защиту, кстати по закону если с грабителями что то случится, а не дай бог помрут, изза твоей защиты, тебя посадят

Клапауций 823
Клапауций 823 аватар
Offline
Зарегистрирован: 13.01.2017

jeka_tm пишет:

дети есть? ты готов рискнуть ими? если родители идиоты...

я готов рискнуть его детьми - идиты не должны размножаться.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

ну да. специальный вирус будет который будет убивать только его детей

а согласие что код норм на форуме защитит его

клап это я сейчас пьяный преувеличиваю проблему?

bwn
Offline
Зарегистрирован: 25.08.2014

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