Relé - časovač (tlačítka, displej)
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.
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.
Relé - časovač (tlačítka, displej)
Zdravím,
potřeboval byl poradit s částí projektu - potřebuji spínat relé na dobu určenou uživatelem - po stisku tlačítka by se zvýšila doba sepnutí vždy např. o 5 sekund (kdykoliv by bylo možné přidat čas). Stiskem tlačítka reset by došlo k vynulování časovače a tedy rozepnutí relé (stejně jako na mikrovlnné troubě).
Na hodinovém displeji s TM1637 by se zobrazoval zbývající čas. Dále by se dvoupolohovým spínačem nastavovalo buď trvalé sepnutí relé nebo sepnutí dle zmíněného časovače.
Chtěl bych se tedy prosím zeptat, jakým způsobem bych měl toto řešit? - aby byly splněny všechny tyto požadavky.
Samozřejmě v tomto případě nemohu použít delay(), uvítám část zdrojového kódu.
Děkuji za rady
potřeboval byl poradit s částí projektu - potřebuji spínat relé na dobu určenou uživatelem - po stisku tlačítka by se zvýšila doba sepnutí vždy např. o 5 sekund (kdykoliv by bylo možné přidat čas). Stiskem tlačítka reset by došlo k vynulování časovače a tedy rozepnutí relé (stejně jako na mikrovlnné troubě).
Na hodinovém displeji s TM1637 by se zobrazoval zbývající čas. Dále by se dvoupolohovým spínačem nastavovalo buď trvalé sepnutí relé nebo sepnutí dle zmíněného časovače.
Chtěl bych se tedy prosím zeptat, jakým způsobem bych měl toto řešit? - aby byly splněny všechny tyto požadavky.
Samozřejmě v tomto případě nemohu použít delay(), uvítám část zdrojového kódu.
Děkuji za rady
Re: Relé - časovač (tlačítka, displej)
Ted se tu resilo neco podobneho :
https://www.arduino-forum.cz/viewtopic.php?f=37&t=2114
https://www.arduino-forum.cz/viewtopic.php?f=37&t=2114
Re: Relé - časovač (tlačítka, displej)
Ano, ale já to potřebuji jinak. Jedno stisknutí tlačítka = přičtení 5 s. Rozhodně nechci přidávat čas držením tlačítka (dalších 5 s se přičte až po uvolnění a opětovném stisknutí tlačítka).
Re: Relé - časovač (tlačítka, displej)
Tak si to to tak uprav - poznamenej si pri tom pricteni, zda je tlacitko stisknuto, pak si poznamenej, az bude pusteno s dalsi pricitani delej az kdyz ma napsano, ze posledni stav je pusteno a zase bude stisknuto
- pavel1tu
- Příspěvky: 2054
- Registrován: 26 říj 2017, 08:28
- Reputation: 0
- Bydliště: Trutnov
- Kontaktovat uživatele:
Re: Relé - časovač (tlačítka, displej)
Takže
1 - tlačítko START, stiskem se přičte 5s do časovače a ihned se začne časovat, každým dalším stiskem se přidá 5s i když šasovač poběží ?
2 - tlačítko RESET se časovač vynuluje
3 - přepínač pro výbět rtvalé sepnutí/časovač
4 - na displeji poběží čas - pžedpokládám v sekundách
to je celkem jednoduché - co už máš hotové z tohoto ?
to je k maturitě ?
1 - tlačítko START, stiskem se přičte 5s do časovače a ihned se začne časovat, každým dalším stiskem se přidá 5s i když šasovač poběží ?
2 - tlačítko RESET se časovač vynuluje
3 - přepínač pro výbět rtvalé sepnutí/časovač
4 - na displeji poběží čas - pžedpokládám v sekundách
to je celkem jednoduché - co už máš hotové z tohoto ?
to je k maturitě ?
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"
Pavel1TU
"Správně napsaný kod lze číst jako knihu"
Re: Relé - časovač (tlačítka, displej)
Já jsem dělal něco podobnýho pro tohle vlákno:
https://www.arduino-forum.cz/viewtopic.php?f=30&t=550
Je to sice bez displeje a reset se provádí dlouhým stiskem startovacího tlačítka, ale jako základ by to snad použít šlo.
Na začátku se v parametrech nastavuje přičítaný čas a maximální doba, která se dá naklikat
Hodně prostoru tam zabírají různé režimy blikání LED, když se čítač blíží ke konci (jednoblik / dvojblik / trvalé svícení) - to by se mohlo vyhodit (program to trochu znepřehledňuje).
https://www.arduino-forum.cz/viewtopic.php?f=30&t=550
Je to sice bez displeje a reset se provádí dlouhým stiskem startovacího tlačítka, ale jako základ by to snad použít šlo.
Na začátku se v parametrech nastavuje přičítaný čas a maximální doba, která se dá naklikat
Hodně prostoru tam zabírají různé režimy blikání LED, když se čítač blíží ke konci (jednoblik / dvojblik / trvalé svícení) - to by se mohlo vyhodit (program to trochu znepřehledňuje).
Re: Relé - časovač (tlačítka, displej)
pavel1tu - Ano, přesně takto, tyto 4 body bych chtěl aby byly splněny. (k maturitě to není - je to pro spínání motoru na určitou dobu)
Dávám sem část kódu - funkce casovac() - je to převzato z různých návodů na internetu a upraveno do podoby, kterou bych potřeboval - ale hlavní problém je v tom, že časovač sice "funguje" - přidává se stiskem tlačítka 5 sekund, ale bez ohledu na to, kolik času uběhlo, takže např. pokud na začátku zmáčknu tlačítko START 2krát - tudíž natavím 10 s a třeba po 5 s budu chtít přidat dalších 5 s, a zmačknu tlačítko, přidá se mi ale 15 s. To je hlavní problém, se kterým bych potřeboval poradit.
Děkuji
pro přehlednost:
proměnná greenLED je signál do relé (LOW - relé sepnuto, HIGH - relé rozepnuto)
Dávám sem část kódu - funkce casovac() - je to převzato z různých návodů na internetu a upraveno do podoby, kterou bych potřeboval - ale hlavní problém je v tom, že časovač sice "funguje" - přidává se stiskem tlačítka 5 sekund, ale bez ohledu na to, kolik času uběhlo, takže např. pokud na začátku zmáčknu tlačítko START 2krát - tudíž natavím 10 s a třeba po 5 s budu chtít přidat dalších 5 s, a zmačknu tlačítko, přidá se mi ale 15 s. To je hlavní problém, se kterým bych potřeboval poradit.
Děkuji
pro přehlednost:
proměnná greenLED je signál do relé (LOW - relé sepnuto, HIGH - relé rozepnuto)
Kód: Vybrat vše
void casovac()
{
// read the pushbutton input pin:
buttonState = digitalRead(BUTTON_PIN);
resetState = digitalRead(RESET_PIN);
currentMillis = millis();
// compare the buttonState to its previous state
if (buttonState != lastButtonState) {
// if the state has changed, increment the counter
if (buttonState == HIGH) {
// if the current state is HIGH then the button went from off to on:
buttonPushCounter++;
Serial.println("on");
Serial.print("number of button pushes: ");
Serial.println(buttonPushCounter);
// zde se pridava cas
interval += 5000;
previousMillis = currentMillis;
digitalWrite(greenLED, LOW);
relayOn = true;
Serial.println(interval);
Serial.println(currentMillis);
Serial.println(previousMillis);
} else {
// if the current state is LOW then the button went from on to off:
Serial.println("off");
}
// Delay a little bit to avoid bouncing
delay(20);
}
// save the current state as the last state, for next time through the loop
lastButtonState = buttonState;
// if relay is currently on...
if( relayOn )
{
// turn red led on, if close to turning off the relay
if (currentMillis - previousMillis >= interval-redLedInterval )
digitalWrite(redLED, (millis()/300)%2);//blink red led; 300ms on; 300ms off
// if enough time has elapsed, turn of the relay
if (currentMillis - previousMillis >= interval)
{
//buttonPushCounter++;
//Serial.println(buttonPushCounter);
// .. turn of relay
digitalWrite(in1, HIGH);
digitalWrite(greenLED, HIGH);
digitalWrite(redLED, LOW);
relayOn = false;
interval = 0;
}
}
// RESET - vypnuti rele
if( resetState==HIGH ) // no need to check for previous state, in this specific case
{
// .. turn of relay
interval = 0;
digitalWrite(in1, HIGH);
digitalWrite(greenLED, HIGH);
digitalWrite(redLED, LOW);
relayOn = false;
}
}
Re: Relé - časovač (tlačítka, displej)
Ještě doplním, že funkce casovac() se volá ve funkci loop.
- pavel1tu
- Příspěvky: 2054
- Registrován: 26 říj 2017, 08:28
- Reputation: 0
- Bydliště: Trutnov
- Kontaktovat uživatele:
Re: Relé - časovač (tlačítka, displej)
Nemám čas to podrobně rozebírat,
ale pod tím ++5s kde přidáváš těch 5s
máš "previousMillis = currentMillis;" - nedělá to tohle ?
To dle mne jakoby vynuluješ čas od kdy jsi začal časovat, ne ?
Pokud z loop() voláš jen toto, postrádá to trochu smysl.
Asi budeš muset program přeskládat:
- zvlášť přičítat ++5s při prvním stisku
- svlášť přičítat ++5s když už časuješ
ale je to jen nápad ....
ale pod tím ++5s kde přidáváš těch 5s
máš "previousMillis = currentMillis;" - nedělá to tohle ?
To dle mne jakoby vynuluješ čas od kdy jsi začal časovat, ne ?
Pokud z loop() voláš jen toto, postrádá to trochu smysl.
Asi budeš muset program přeskládat:
- zvlášť přičítat ++5s při prvním stisku
- svlášť přičítat ++5s když už časuješ
ale je to jen nápad ....
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"
Pavel1TU
"Správně napsaný kod lze číst jako knihu"
Re: Relé - časovač (tlačítka, displej)
Jo, to by odpovídalo.
Při dalším stisku tlačítka, pokud už časovač beží se vlastně časovač "vynuluje" a časuje od toho okamžiku stisknutí do intervalu o 5 s delšího než byl předchozí bez ohledu na již uběhlý čas. Já ale potřebuji, aby se dalším stiskem tlačítka pouze přičetlo 5 s k původnímu intervalu mínus již uběhlý čas, neboli aby se přičetlo 5 s ke zbývajícímu času.
Hodily by se nějaké proměnné uběhlý čas a zbývající čas - i pro zobrazování zbývajícího času na displeji.
Díky
Při dalším stisku tlačítka, pokud už časovač beží se vlastně časovač "vynuluje" a časuje od toho okamžiku stisknutí do intervalu o 5 s delšího než byl předchozí bez ohledu na již uběhlý čas. Já ale potřebuji, aby se dalším stiskem tlačítka pouze přičetlo 5 s k původnímu intervalu mínus již uběhlý čas, neboli aby se přičetlo 5 s ke zbývajícímu času.
Hodily by se nějaké proměnné uběhlý čas a zbývající čas - i pro zobrazování zbývajícího času na displeji.
Díky
Kdo je online
Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 14 hostů