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.
-
Pojkynet
- Příspěvky: 28
- Registrován: 26 kvě 2020, 01:14
- Reputation: 0
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
Chtěl bych to již namontovat do sklepa,abych se mohl dále věnovat prohlubování znalostí o arduinu
-
martinius96
- Příspěvky: 579
- Registrován: 01 srp 2017, 19:29
- Reputation: 0
- Bydliště: Poprad
-
Kontaktovat uživatele:
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
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
-
martinius96
- Příspěvky: 579
- Registrován: 01 srp 2017, 19:29
- Reputation: 0
- Bydliště: Poprad
-
Kontaktovat uživatele:
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
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
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í.
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:
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í.
PS:Moc děkuji martinius96
Tak ako? Nastali nejaké problémy?
-
Pojkynet
- Příspěvky: 28
- Registrován: 26 kvě 2020, 01:14
- Reputation: 0
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
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);
Kdo je online
Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 18 hostů