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

Nedaří se vám s projektem a nenašli jste vhodné místo, kde se zeptat? Napište sem.
Pravidla fóra
Tohle subfórum je určeno pro konzultaci ucelených nápadů, popřípadě řešení komplexnějších projektů, které opravdu není možné rozdělit na menší části.
Většinu problémů jde rozdělit na menší a ptát se na ně v konkrétních subfórech.
BigSandy
Příspěvky: 219
Registrován: 23 zář 2017, 07:09
Reputation: 0

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

Příspěvek od BigSandy » 27 kvě 2020, 17:12

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

Pojkynet
Příspěvky: 28
Registrován: 26 kvě 2020, 01:14
Reputation: 0

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

Příspěvek od Pojkynet » 30 kvě 2020, 13:44

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:

martinius96
Příspěvky: 579
Registrován: 01 srp 2017, 19:29
Reputation: 0
Bydliště: Poprad
Kontaktovat uživatele:

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

Příspěvek od martinius96 » 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;
  }
}

Pojkynet
Příspěvky: 28
Registrován: 26 kvě 2020, 01:14
Reputation: 0

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

Příspěvek od Pojkynet » 30 kvě 2020, 15:33

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

martinius96
Příspěvky: 579
Registrován: 01 srp 2017, 19:29
Reputation: 0
Bydliště: Poprad
Kontaktovat uživatele:

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

Příspěvek od martinius96 » 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;
  }
}

Pojkynet
Příspěvky: 28
Registrován: 26 kvě 2020, 01:14
Reputation: 0

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

Příspěvek od Pojkynet » 30 kvě 2020, 19:23

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.

Pojkynet
Příspěvky: 28
Registrován: 26 kvě 2020, 01:14
Reputation: 0

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

Příspěvek od Pojkynet » 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

martinius96
Příspěvky: 579
Registrován: 01 srp 2017, 19:29
Reputation: 0
Bydliště: Poprad
Kontaktovat uživatele:

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

Příspěvek od martinius96 » 29 črc 2020, 23:28

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-)

Pojkynet
Příspěvky: 28
Registrován: 26 kvě 2020, 01:14
Reputation: 0

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

Příspěvek od Pojkynet » 31 črc 2020, 23:17

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.

Pojkynet
Příspěvky: 28
Registrován: 26 kvě 2020, 01:14
Reputation: 0

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

Příspěvek od Pojkynet » 03 srp 2020, 14:35

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

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 18 hostů