Stránka 1 z 3
Relé - časovač (tlačítka, displej)
Napsal: 01 bře 2020, 01:16
od ondyy
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
Re: Relé - časovač (tlačítka, displej)
Napsal: 01 bře 2020, 08:29
od gilhad
Re: Relé - časovač (tlačítka, displej)
Napsal: 01 bře 2020, 09:30
od ondyy
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)
Napsal: 01 bře 2020, 10:05
od gilhad
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
Re: Relé - časovač (tlačítka, displej)
Napsal: 01 bře 2020, 11:41
od pavel1tu
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ě ?

Re: Relé - časovač (tlačítka, displej)
Napsal: 01 bře 2020, 13:17
od AstroMiK
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).
Re: Relé - časovač (tlačítka, displej)
Napsal: 01 bře 2020, 14:19
od ondyy
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)
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)
Napsal: 02 bře 2020, 19:23
od ondyy
Ještě doplním, že funkce casovac() se volá ve funkci loop.
Re: Relé - časovač (tlačítka, displej)
Napsal: 02 bře 2020, 19:40
od pavel1tu
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 ....
Re: Relé - časovač (tlačítka, displej)
Napsal: 02 bře 2020, 20:56
od ondyy
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