Stránka 2 z 4

Re: časové hlídání dárlingu (vodárny)

Napsal: 27 kvě 2020, 17:12
od BigSandy
Pojkynet píše:
27 kvě 2020, 16:51
Bohužel ve sklepě 5x3 metry se ten plovaček moc použit nedà, protože nežli sepne budu tam mít 5cm vody😌
Tak ja mám sklep 4,5 x 3,5 metry a ten plovaček tam mám :D
Betonová podlaha a v rohu udělana dira vrtakem na zasuvky.
Jednou ročně zkontroluji a vysavačem povysavam pavouky.
A toto na ventilu.
https://www.aliexpress.com/item/4000709625945.html

Toto take nevypada špatně.
https://www.aliexpress.com/item/33004754249.html

Re: časové hlídání dárlingu (vodárny)

Napsal: 30 kvě 2020, 13:44
od Pojkynet
martinius96 píše:
26 kvě 2020, 04:00
Ahoj, snažil som sa to vytvoriť čo najjednoduchšie, dalo by sa to asi zapísať aj efektívnejšie, ale verím, že na začiatok to bude stačiť.
Systém má 3 režimy:
  • Režim 0 - čaká sa na impulz log 1 --> 5V na vstupe v nekonečnej slučke
  • Režim 1 - každú sekundu sa vykonáva meranie na vstupe, ak sa vykoná 120+ meraní log 1 za sebou, systém skočí do Režimu 2. Ak počas týchto 120 cyklov (120 sekúnd) nameria kedykoľvek log 0 --> skočí do Režimu 0
  • Režim 2 (Default v switch case) - Arduino v tomto režime čaká na hardvérový reset cez tlačidlo RESET na doske, nemožno z tohto režimu vyskočiť, je to akoby while(true), cyklus tam ostane navždy.
Do toho Režimu 1 som doplnil aj tú logiku, ktorú potrebuješ. Predpokladám, že pri prekročení 120 sekúnd chceš aj zhasnúť zelenú LED pri rozsvietení červenej LED, nastavil som to tak. Uprav si digitálne vývody podľa tvojho zapojenia. Čo sa týka merania každú sekundu, dá sa to zmeniť aj pre meranie každú milisekundu... Len sa zmení počet maximálnych impulzov (napríklad *1000), ktoré si schopný odmerať za 120 sekúnd (pozor, potrebuješ potom zmeniť aj dátový typ pre túto premennú [pocet_merani ], nakoľko int je len do 32,767, unsigned int 65535 ). Meranie cez digitalRead() trvá približne 4ns.

Kód: Vybrat vše

const int buttonPin = 2; //kontakt, na ktory sa privedie +5V
unsigned long lastDebounceTime = 0; //premenna pre cas millis()
int rezim = 0; //rezim systemu
int pocet_merani = 0; //pocet merani (cyklov), rataju sa do 2 minut --> 120 sekund
const int zelenaLED = 6; //D pin zelenej LED
const int cervenaLED = 7; //D pin cervenej LED
const int vystup = 8; //D pin pre rele
int reading;
int reading2;
void setup() {
  pinMode(buttonPin, INPUT);
  pinMode(zelenaLED, OUTPUT);
  pinMode(cervenaLED, OUTPUT);
  pinMode(vystup, OUTPUT);
  digitalWrite(vystup, HIGH);
  digitalWrite(zelenaLED, LOW);
  digitalWrite(cervenaLED, LOW);
}

void loop() {
  switch (rezim) {
    case 0:
      reading = digitalRead(buttonPin);
      if (reading == HIGH) {
        lastDebounceTime = millis();
        rezim = 1;
        digitalWrite(zelenaLED, HIGH);
        digitalWrite(vystup, LOW);
      }
      break;
    case 1:
      if (millis() - lastDebounceTime >= 1000) {
        lastDebounceTime = millis();
        reading2 = digitalRead(buttonPin);
        if (reading2 == HIGH) {
          pocet_merani++;
        } else {
          rezim = 0;
          pocet_merani = 0;
          digitalWrite(zelenaLED, LOW);
          digitalWrite(vystup, HIGH);
        }
        if (pocet_merani > 120) {
          rezim = 2;
          digitalWrite(cervenaLED, HIGH);
          digitalWrite(zelenaLED, LOW);
          digitalWrite(vystup, HIGH);
        }
      }
      break;
    default:
      // NUTNY RESTART ARDUINA NATVRDO CEZ RESET
      break;
  }
}
Ahoj
Potřeboval bych ještě jednu radu:Chtěl bych do tohoto programu ještě přidat,aby po přivedení +5V na pin 3
se rozsvítila červená led,nebo lépe přidat modrou a červená a zelená aby se zhasla relé odpojilo, ale ne po 120 sekundách,ale ihned a musel se provést reset arduina.
Moje znalosti na to bohužel nestačí pokoušel jsem se o různé úpravy kodu,ale nějak to nedělá to co potřebuji :roll:
Chtěl bych to již namontovat do sklepa,abych se mohl dále věnovat prohlubování znalostí o arduinu :idea:

Re: časové hlídání dárlingu (vodárny)

Napsal: 30 kvě 2020, 15:04
od martinius96
Takto by to mohlo fungovať.
Mohol by sa tam implementovať ešte watchdog, ktorý by Arduino resetol, ak by sa zaseklo, ale má dostatok pamäte aj do rezervy, nemalo by to nastať.

Kód: Vybrat vše

const int buttonPin = 2; //kontakt, na ktory sa privedie +5V
const int instantResetPin = 3; //kontakt, na ktory sa privedie +5V
unsigned long lastDebounceTime = 0; //premenna pre cas millis()
int rezim = 0; //rezim systemu
int pocet_merani = 0; //pocet merani (cyklov), rataju sa do 2 minut --> 120 sekund

const int zelenaLED = 6; //D pin zelenej LED
const int cervenaLED = 7; //D pin cervenej LED
const int modraLED = 9; //D pin cervenej LED
const int vystup = 8; //D pin pre rele

int reading;
int reading2;
int reading3;
void setup() {
  pinMode(buttonPin, INPUT);
  pinMode(instantResetPin, INPUT);
  pinMode(zelenaLED, OUTPUT);
  pinMode(cervenaLED, OUTPUT);
  pinMode(vystup, OUTPUT);
  digitalWrite(vystup, HIGH);
  digitalWrite(zelenaLED, LOW);
  digitalWrite(cervenaLED, LOW);
  digitalWrite(modraLED, LOW);
}

void loop() {
  reading3 = digitalRead(instantResetPin);
  if (reading3 == HIGH) {
    rezim = 2;
    digitalWrite(modraLED, HIGH);
    digitalWrite(cervenaLED, LOW);
    digitalWrite(zelenaLED, LOW);
    digitalWrite(vystup, HIGH);
  }
  switch (rezim) {
    case 0:
      reading = digitalRead(buttonPin);
      if (reading == HIGH) {
        lastDebounceTime = millis();
        rezim = 1;
        digitalWrite(zelenaLED, HIGH);
        digitalWrite(vystup, LOW);
      }
      break;
    case 1:
      if (millis() - lastDebounceTime >= 1000) {
        lastDebounceTime = millis();
        reading2 = digitalRead(buttonPin);
        if (reading2 == HIGH) {
          pocet_merani++;
        } else {
          rezim = 0;
          pocet_merani = 0;
          digitalWrite(zelenaLED, LOW);
          digitalWrite(vystup, HIGH);
        }
        if (pocet_merani > 120) {
          rezim = 2;
          digitalWrite(cervenaLED, HIGH);
          digitalWrite(zelenaLED, LOW);
          digitalWrite(vystup, HIGH);
        }
      }
      break;
    default:
      // NUTNY RESTART ARDUINA NATVRDO CEZ RESET
      break;
  }
}

Re: časové hlídání dárlingu (vodárny)

Napsal: 30 kvě 2020, 15:33
od Pojkynet
martinius96 píše:
30 kvě 2020, 15:04
Takto by to mohlo fungovať.
Mohol by sa tam implementovať ešte watchdog, ktorý by Arduino resetol, ak by sa zaseklo, ale má dostatok pamäte aj do rezervy, nemalo by to nastať.

Kód: Vybrat vše

const int buttonPin = 2; //kontakt, na ktory sa privedie +5V
const int instantResetPin = 3; //kontakt, na ktory sa privedie +5V
unsigned long lastDebounceTime = 0; //premenna pre cas millis()
int rezim = 0; //rezim systemu
int pocet_merani = 0; //pocet merani (cyklov), rataju sa do 2 minut --> 120 sekund

const int zelenaLED = 6; //D pin zelenej LED
const int cervenaLED = 7; //D pin cervenej LED
const int modraLED = 9; //D pin cervenej LED
const int vystup = 8; //D pin pre rele

int reading;
int reading2;
int reading3;
void setup() {
  pinMode(buttonPin, INPUT);
  pinMode(instantResetPin, INPUT);
  pinMode(zelenaLED, OUTPUT);
  pinMode(cervenaLED, OUTPUT);
  pinMode(vystup, OUTPUT);
  digitalWrite(vystup, HIGH);
  digitalWrite(zelenaLED, LOW);
  digitalWrite(cervenaLED, LOW);
  digitalWrite(modraLED, LOW);
}

void loop() {
  reading3 = digitalRead(instantResetPin);
  if (reading3 == HIGH) {
    rezim = 2;
    digitalWrite(modraLED, HIGH);
    digitalWrite(cervenaLED, LOW);
    digitalWrite(zelenaLED, LOW);
    digitalWrite(vystup, HIGH);
  }
  switch (rezim) {
    case 0:
      reading = digitalRead(buttonPin);
      if (reading == HIGH) {
        lastDebounceTime = millis();
        rezim = 1;
        digitalWrite(zelenaLED, HIGH);
        digitalWrite(vystup, LOW);
      }
      break;
    case 1:
      if (millis() - lastDebounceTime >= 1000) {
        lastDebounceTime = millis();
        reading2 = digitalRead(buttonPin);
        if (reading2 == HIGH) {
          pocet_merani++;
        } else {
          rezim = 0;
          pocet_merani = 0;
          digitalWrite(zelenaLED, LOW);
          digitalWrite(vystup, HIGH);
        }
        if (pocet_merani > 120) {
          rezim = 2;
          digitalWrite(cervenaLED, HIGH);
          digitalWrite(zelenaLED, LOW);
          digitalWrite(vystup, HIGH);
        }
      }
      break;
    default:
      // NUTNY RESTART ARDUINA NATVRDO CEZ RESET
      break;
  }
}
Problém by byl kdyby se arduino seklo se sepnutým relé,v tom případě se bude pořád čerpat voda a to by byl velký malér :o

Re: časové hlídání dárlingu (vodárny)

Napsal: 30 kvě 2020, 17:32
od martinius96
Tak skús takto s watchdogom, ale netestoval som to..
Zareaguje do 500ms od zaseku.

Kód: Vybrat vše

#include <avr\wdt.h>
const int buttonPin = 2; //kontakt, na ktory sa privedie +5V
const int instantResetPin = 3; //kontakt, na ktory sa privedie +5V
unsigned long lastDebounceTime = 0; //premenna pre cas millis()
int rezim = 0; //rezim systemu
int pocet_merani = 0; //pocet merani (cyklov), rataju sa do 2 minut --> 120 sekund

const int zelenaLED = 6; //D pin zelenej LED
const int cervenaLED = 7; //D pin cervenej LED
const int modraLED = 9; //D pin cervenej LED
const int vystup = 8; //D pin pre rele

int reading;
int reading2;
int reading3;
void setup() {
  wdt_enable(WDTO_500MS );
  wdt_reset();
  pinMode(buttonPin, INPUT);
  pinMode(instantResetPin, INPUT);
  pinMode(zelenaLED, OUTPUT);
  pinMode(cervenaLED, OUTPUT);
  pinMode(vystup, OUTPUT);
  digitalWrite(vystup, HIGH);
  digitalWrite(zelenaLED, LOW);
  digitalWrite(cervenaLED, LOW);
  digitalWrite(modraLED, LOW);
}

void loop() {
  wdt_reset();
  reading3 = digitalRead(instantResetPin);
  if (reading3 == HIGH) {
    rezim = 2;
    digitalWrite(modraLED, HIGH);
    digitalWrite(cervenaLED, LOW);
    digitalWrite(zelenaLED, LOW);
    digitalWrite(vystup, HIGH);
  }
  switch (rezim) {
    case 0:
      reading = digitalRead(buttonPin);
      if (reading == HIGH) {
        lastDebounceTime = millis();
        rezim = 1;
        digitalWrite(zelenaLED, HIGH);
        digitalWrite(vystup, LOW);
      }
      break;
    case 1:
      if (millis() - lastDebounceTime >= 1000) {
        lastDebounceTime = millis();
        reading2 = digitalRead(buttonPin);
        if (reading2 == HIGH) {
          pocet_merani++;
        } else {
          rezim = 0;
          pocet_merani = 0;
          digitalWrite(zelenaLED, LOW);
          digitalWrite(vystup, HIGH);
        }
        if (pocet_merani > 120) {
          rezim = 2;
          digitalWrite(cervenaLED, HIGH);
          digitalWrite(zelenaLED, LOW);
          digitalWrite(vystup, HIGH);
        }
      }
      break;
    default:
      // NUTNY RESTART ARDUINA NATVRDO CEZ RESET
      break;
  }
}

Re: časové hlídání dárlingu (vodárny)

Napsal: 30 kvě 2020, 19:23
od Pojkynet
martinius96 píše:
30 kvě 2020, 17:32
Tak skús takto s watchdogom, ale netestoval som to..
Zareaguje do 500ms od zaseku.

Kód: Vybrat vše

#include <avr\wdt.h>
const int buttonPin = 2; //kontakt, na ktory sa privedie +5V
const int instantResetPin = 3; //kontakt, na ktory sa privedie +5V
unsigned long lastDebounceTime = 0; //premenna pre cas millis()
int rezim = 0; //rezim systemu
int pocet_merani = 0; //pocet merani (cyklov), rataju sa do 2 minut --> 120 sekund

const int zelenaLED = 6; //D pin zelenej LED
const int cervenaLED = 7; //D pin cervenej LED
const int modraLED = 9; //D pin cervenej LED
const int vystup = 8; //D pin pre rele

int reading;
int reading2;
int reading3;
void setup() {
  wdt_enable(WDTO_500MS );
  wdt_reset();
  pinMode(buttonPin, INPUT);
  pinMode(instantResetPin, INPUT);
  pinMode(zelenaLED, OUTPUT);
  pinMode(cervenaLED, OUTPUT);
  pinMode(vystup, OUTPUT);
  digitalWrite(vystup, HIGH);
  digitalWrite(zelenaLED, LOW);
  digitalWrite(cervenaLED, LOW);
  digitalWrite(modraLED, LOW);
}

void loop() {
  wdt_reset();
  reading3 = digitalRead(instantResetPin);
  if (reading3 == HIGH) {
    rezim = 2;
    digitalWrite(modraLED, HIGH);
    digitalWrite(cervenaLED, LOW);
    digitalWrite(zelenaLED, LOW);
    digitalWrite(vystup, HIGH);
  }
  switch (rezim) {
    case 0:
      reading = digitalRead(buttonPin);
      if (reading == HIGH) {
        lastDebounceTime = millis();
        rezim = 1;
        digitalWrite(zelenaLED, HIGH);
        digitalWrite(vystup, LOW);
      }
      break;
    case 1:
      if (millis() - lastDebounceTime >= 1000) {
        lastDebounceTime = millis();
        reading2 = digitalRead(buttonPin);
        if (reading2 == HIGH) {
          pocet_merani++;
        } else {
          rezim = 0;
          pocet_merani = 0;
          digitalWrite(zelenaLED, LOW);
          digitalWrite(vystup, HIGH);
        }
        if (pocet_merani > 120) {
          rezim = 2;
          digitalWrite(cervenaLED, HIGH);
          digitalWrite(zelenaLED, LOW);
          digitalWrite(vystup, HIGH);
        }
      }
      break;
    default:
      // NUTNY RESTART ARDUINA NATVRDO CEZ RESET
      break;
  }
}
Díky moc večer otestuji a dám vědět.

Re: časové hlídání dárlingu (vodárny)

Napsal: 03 čer 2020, 21:30
od Pojkynet
Děkuji moc za pomoc vše už funguje ve sklepě a zatím spokojenost.Uvidíme co ukáže čas.
výhoda je,že program se dá upravit,nebo rozšířit. Na rozdíl od komerčních zařízení. :P
PS:Moc děkuji martinius96

Re: časové hlídání dárlingu (vodárny)

Napsal: 29 črc 2020, 23:28
od martinius96
Pojkynet píše:
03 čer 2020, 21:30
Děkuji moc za pomoc vše už funguje ve sklepě a zatím spokojenost.Uvidíme co ukáže čas.
výhoda je,že program se dá upravit,nebo rozšířit. Na rozdíl od komerčních zařízení. :P
PS:Moc děkuji martinius96
Tak ako? Nastali nejaké problémy? 8-)

Re: časové hlídání dárlingu (vodárny)

Napsal: 31 črc 2020, 23:17
od Pojkynet
Párkrát se stalo pokud sepne darling často za sebou tak spadne do chyby,podle mne je to kabelem který vede k tlakovému spínači a není stíněný,
Zkusím vyměnit a uvidím.

Re: časové hlídání dárlingu (vodárny)

Napsal: 03 srp 2020, 14:35
od Pojkynet
Ahoj tak po nějakém čase testování se vyskytuje chyba,že náhodně spadne do chyby,ale ne dárling,ale sonda proti zaplavení sklepa,
Stane se to jen,při sepnutí,nebo vypnutí dárlingu,neporadí někdo jak to ošetřit?

Kód: Vybrat vše

void loop() {
  wdt_reset();
  reading3 = digitalRead(instantResetPin);
  if (reading3 == HIGH) {
    rezim = 2;
    digitalWrite(modraLED, HIGH);
    digitalWrite(cervenaLED, LOW);
    digitalWrite(zelenaLED, LOW);
    digitalWrite(vystup, LOW);