Прошу помощи закрыть, открыть воду через таймер
- Войдите на сайт для отправки комментариев
Пт, 03/02/2017 - 21:38
Прошу помощи, хочу переписать процедуру закрывания, открывания воды через таймер используется два реле чтоб менять полярность для сервопривода крана. Чтобы кран успел закрыться открыться нужно 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; } }
Делаю для себя и попутно учусь так что за написание не пинайте.
Но понял что в моем проекте это большая дыра.
В вашем проекте дыра это отсутсвие классов. Это как вы пытаетесь строить небоскреб , пользуясь технологией строительства землянки. Ну или схрона, как кому нравится.
Но понял что в моем проекте это большая дыра.
В вашем проекте дыра это отсутсвие классов. Это как вы пытаетесь строить небоскреб , пользуясь технологией строительства землянки. Ну или схрона, как кому нравится.
Вы видели чтоб я писал что то про классы?
Ви не в той теме.
Просил же не пинать.
А вы знакомы , о переходе количества в качество. У вас очень большой длиный код. И я не увидел у вас классов, но увидел избыток функций. Вот и указал на это. Тем более я бы создал класс открывания и закрывания воды по времени и использовал бы. Но так как вам это не приемлимо, то мой рецепт вам не подойдет.
Вот это
Прошу помощи,
противоречит вот этому
не пинайте.
Вы уж уж определитесь чего Вы хотите, помощи или "одобрямса/похвалямса", а потом обращайтесь к сообществу.
В Си есть классы? )
В Си есть классы? )
я запретил.
В Си есть классы? )
На 3 день Чунгачгук зоркий глаз начал подозревать, что в сарае, куда его посадили нет четвертой стены.
http://arduino.ru/Hacking/LibraryTutorial
В Си классов нет, они есть в С++ . Просто компилятор понимает и то и то.
За это благодарен когда-нибудь попробую разобраться.
А вы знакомы , о переходе количества в качество. У вас очень большой длиный код. И я не увидел у вас классов, но увидел избыток функций. Вот и указал на это. Тем более я бы создал класс открывания и закрывания воды по времени и использовал бы. Но так как вам это не приемлимо, то мой рецепт вам не подойдет.
Но кто то может навести пример как включить светодиод на 10 сек. при нажатии на кнопку без использования задержки? Не МОРГАТЬ включить.
Но кто то может навести пример как включить светодиод на 10 сек. при нажатии на кнопку без использования задержки? Не МОРГАТЬ включить.
Ну может этот код вам религия не позволяет использовать https://yadi.sk/d/WKaKvxrX3APTwN
Ну и головной файл сюда
В 9 строке Cl_time_relay T_Relay1(RELAY_PIN, 0, 1000);Замените 1000 на 10000
Большое спасибо :)
Я знал что есть хорошие люди
Которые помогут мне не смотря на мои религиозные взгляды. )
Очень благодарю за готовый пример.
Извините за
Но понял что в моем проекте это большая дыра.
В вашем проекте дыра это отсутсвие классов. Это как вы пытаетесь строить небоскреб , пользуясь технологией строительства землянки. Ну или схрона, как кому нравится.
Вы видели чтоб я писал что то про классы?
Ви не в той теме.
Просил же не пинать.
Надо учить классы это просто класс .
Уже прикрутил под свои цели, это при том что я программирую всего неделю.
И при том он мне пригодится только тут ещё несколько раз
Я рад что вам понравилось. Вот подброшу еще один скетч. Полностью здесь https://yadi.sk/d/UfwvGmLp3CsezS
а главный файл тут выложу
а зачем классы сразу? а можно я тоже добавлю, мелочь которая ничего не значит по большому счету. правда комменты не все смог прочитать так как на украинском. половину наверно
пины через дефайны, пины на вход объвлять необязательно
с 618 строки через case swith
в 232 строке и ниже можно через цикл оформить, а не писать кучу условий
кстати вместо если бла бла бла ==1 можно писать просто if бла бла бла. а вместо бла бла бла !=1 можно писать !бла бла бла. это одно и тоже
ОК учту спасибо за замечание.
для недели программируешь как то не похоже, может конкретно ардуину, хотя возможно конечно
для недели программируешь как то не похоже, может конкретно ардуину, хотя возможно конечно
Программирую как то громко сказал. Луше подходит (копи паст) но идея давно била сделать что то подобное и при ремонте провода в стены заштукатурил. На газовую трубу клапан сразу поставил.
Потом все откладывал.
И тут месяц назад обчистили квартиру. Окрыли и закрыли спокойно.
Очень стимулировало.
С HTML ближе знаком, и только как хобби.
то есть боишься в следующий раз грабители откроют кран и не закроют? или спалить взлом квартиры и грабители решат помыть руки, а ты им воду перекроешь?
не пойму как одно с другим связано
))
Просто места мало под сингалку отдельную и анти потоп.
И хочу сделать все в одном.
Мало какие совпадения бывают. И тут потоп и закрывается вода .
Тогда можно открывать дверь и делать что хочешь
Проверил на СМК и PIR не реагирует.
я понимаю тебя с одной стороны. ну допустим ты узнал что грабители пришли
1. что делать собираешься с грабителями?
2. что должна делать твоя система кроме перекрывания воды?
3. ну не могу. защита от грабителей и воду перекрыть. блин только мне смешно. тс не обижайся, но это как если бы мне друг сообщил мою дачу грабят, а я ему
1. звони ментам
2. как узнал что мою дачу грабят
3. и можно к вам. дома скучно)))
забыл. это не я, это все виски пишет моими руками
Когда спалю взлом то будет ещё одно реле с
с активацией по смс
в процессе ещё допишу
Работает в двух режимах
первый контроль протекания и возгорания
второй протекание возгорание и охрана с сиреной, уведомлениями.
красава, есть одна ненастоящая инфа, тут недавно изза одной иностранной компании, не буду говорить какой, их контроллеры, сработала пожарка, и залила пеной одно место очень важное причем нахрен все. конечно ничего такого не произошло. короче если у этой очень крупной компании возникают проблемы я бы на твоем месте тестировал датчик и все остально в греметичном боксе, а то спишь ты, а тут твой ребенок задыхается и зарабатывает асму или аллергию изза китайской ардуины или датчика, или хуже твоего косяка: плохой изоляции или ошибки програмирования. то что с тобой случится или с твоей женой не берем в расчет, вы уже пожили свое
и асма это в лучше случае. не говори потом что тебя не предупреждали что твоей телек и ноут окажутся будут стоить жизни ребенка
скажу честно ты идиот тупоголовый, ты не знаешь чем рискуешь пока не произойдет беда. когда придет время ты ничем не сможешь это скомпенсировать. ты сотни отдашь телеков лишь бы исправить, но будет поздно
это касается только охраны от грабежа и твоей псевдозащиты
красава, есть одна ненастоящая инфа, тут недавно изза одной иностранной компании, не буду говорить какой, их контроллеры, сработала пожарка, и залила пеной одно место очень важное причем нахрен все. конечно ничего такого не произошло. короче если у этой очень крупной компании возникают проблемы я бы на твоем месте тестировал датчик и все остально в греметичном боксе, а то спишь ты, а тут твой ребенок задыхается и зарабатывает асму или аллергию изза китайской ардуины или датчика, или хуже твоего косяка: плохой изоляции или ошибки програмирования. то что с тобой случится или с твоей женой не берем в расчет, вы уже пожили свое
и асма это в лучше случае. не говори потом что тебя не предупреждали что твоей телек и ноут окажутся будут стоить жизни ребенка
скажу честно ты идиот тупоголовый, ты не знаешь чем рискуешь пока не произойдет беда. когда придет время ты ничем не сможешь это скомпенсировать. ты сотни отдашь телеков лишь бы исправить, но будет поздно
Все правильно
Планирую механически включать хим. патрон при выходе всех из дома каждый раз. Для возможности активации только через смс.
дети есть? ты готов рискнуть ими? если родители идиоты...
двери с противосъемными штырями. хороший замок. это если через дверь. поставь датчики и за деньги на охрану в чоп. не ставь хим защиту, кстати по закону если с грабителями что то случится, а не дай бог помрут, изза твоей защиты, тебя посадят
дети есть? ты готов рискнуть ими? если родители идиоты...
я готов рискнуть его детьми - идиты не должны размножаться.
ну да. специальный вирус будет который будет убивать только его детей
а согласие что код норм на форуме защитит его
клап это я сейчас пьяный преувеличиваю проблему?
Мдя, еще фосгенчику с динамитиком, да керосинчику на мыльце с рапылителем и будет сигналка "но пасаран". Может все таки о нормальных дверях, да сигнализации на пульт подумать, можно ротвейлера для харда завести, чем способ совместного семейного суицида изобретать?