Časování s millis()

Odpovědět
Ludek
Příspěvky: 289
Registrován: 02 pro 2019, 08:14
Reputation: 0
Bydliště: České Budějovice

Časování s millis()

Příspěvek od Ludek » 05 kvě 2020, 06:26

Jen dotaz... kolega za mnou přišel, že nemůže vytvořit program, aby se například - rozsvítila LED po nějakém čase,
když se drží tlačítko. Myslel jsem si brnkačka... Ale všechny kody na toto téma používají kromě millis(), také ještě
pomocné proměnné " currMillis - prevMillis > (nějaké číslo)) ". Jenomže po stisku tlačítka se toto testuje, ale my ještě neznáme
tu prevMillis, ta se aktualizuje až při provedení příkazu - po dané prodlevě. A tak jsme došli, babi...
Je nějaký kod, kde se interval může použít hned?

ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: Časování s millis()

Příspěvek od ondraN » 05 kvě 2020, 07:13

Když otestuješ stisk tlačítka a je stlačeno, dej si do proměnné millis(). Pak periodicky testuj jestli je stále stisknuté a jestli millis()-proměnná nepřekročilo určený čas. Pokud bylo dříve uvolněno tlačítko, ak opusť testovací cyklus bez akce, pokud se dosáhlo času bez uvolnění tlačítka tak rozsviť LED a opusť cykl.

Kód: Vybrat vše

unsigned long Time;
if (digitalRead(Tlacitko)==LOW){	//když bude tlačítko stisknuté
	Time=millis();
	delay(20); //debounce interval
	do{
		if((millis()-Time)>1000){	//podrženo víc jak jednu sekundu
			digitalWrite(LED,HIGH);	//rozsvítíme LED	
			break;	//opustíme testovací smyčku
			}
	}while(digitalRead(Tlacitko)==LOW);	//opakujeme dokud se neuvolní stisk tlačítka
}
Ukázka kódu předpokládá že jsou již deklarované použité proměnné a piny nasměrované na vstup a výstup.

Uživatelský avatar
pavel1tu
Příspěvky: 2054
Registrován: 26 říj 2017, 08:28
Reputation: 0
Bydliště: Trutnov
Kontaktovat uživatele:

Re: Časování s millis()

Příspěvek od pavel1tu » 05 kvě 2020, 10:28

Ondro, pěkný program, ale v tomto případě se po dobu stisku asi nebude vykonávat nic jiného - nutno upozornit - nemusí to být na vadu, neznáme zbytek kodu.

Jde to vyřešit mnoha způsoby,
jen uložením času začátku a konce stisku tlačítka a pak to vyhodnotit (krátké stisky nemusí správně fungovat při větším programu),
dát tlačítko na vstup co umí přerušení + to samé co výše (používám často, protože mám různé funkce tlačítka při dlouhém/krátkém stisku),
použít knihovnu na tlačítka, která umí vyhodnotit délku stisku ... asi nejjednodušší,

a tak dále
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

Uživatelský avatar
kiRRow
Příspěvky: 1151
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: Časování s millis()

Příspěvek od kiRRow » 05 kvě 2020, 17:05

No napočátku řešení tohohle problému bylo uvědomění si, že ačkoliv tlačítko má dva stavy, které umíme z pinu načíst, tak ve skutečnosti má tlačítko stavů více, které umíme vyhodnotit.
Načíst umím LOW a nebo HIGH.
Vyhodnotit umím LOW a HIGH, ale taky to že došlo k přechodu z LOW na HIGH a naopak z HIGH na LOW. A najednou tlačítko má stavy 4. Nedrženo, Stisknuto, Drženo, Puštěno.
Sranda je pak s dvojkliky. Hlavně vyladit to tak aby klik neměl odezvu vteřinu a zároveň, aby dvouklik nezvládal jedině profesionálně trénovaný datel :D

ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: Časování s millis()

Příspěvek od ondraN » 05 kvě 2020, 18:19

pavel1tu píše:
05 kvě 2020, 10:28
Ondro, pěkný program, ale v tomto případě se po dobu stisku asi nebude vykonávat nic jiného - nutno upozornit - nemusí to být na vadu, neznáme zbytek kodu.
.........................
Jasně, je to jen ilustrace a fungovat bude navíc jen ve smyčce. Tlačítka je nejlepší řešit přes interrupt od změny pinu nebo v časovém od čítače. Taky může být v té smyčce kdy se čeká vykonáván nějaký další kód. To už ale záleží na programu, který nemáme.
kiRRow píše:
05 kvě 2020, 17:05
No napočátku řešení tohohle problému bylo uvědomění si, že ačkoliv tlačítko má dva stavy, které umíme z pinu načíst, tak ve skutečnosti má tlačítko stavů více, které umíme vyhodnotit.
Načíst umím LOW a nebo HIGH.
Vyhodnotit umím LOW a HIGH, ale taky to že došlo k přechodu z LOW na HIGH a naopak z HIGH na LOW. A najednou tlačítko má stavy 4. Nedrženo, Stisknuto, Drženo, Puštěno.
Sranda je pak s dvojkliky. Hlavně vyladit to tak aby klik neměl odezvu vteřinu a zároveň, aby dvouklik nezvládal jedině profesionálně trénovaný datel :D
Tak tohle se nejlépe ošetřuje v tom časovém interruptu. Jinak je to dost pakárna :|

Ludek
Příspěvky: 289
Registrován: 02 pro 2019, 08:14
Reputation: 0
Bydliště: České Budějovice

Re: Časování s millis()

Příspěvek od Ludek » 11 kvě 2020, 08:44

Jo to by šlo, jen mu vyzkouším všechny možné stavy, aby došlo k akci pokaždé, to znamená
- jak při trvalém stisku, při dlouhém stisku i při krátkém stisku. Budu tedy testovat hranu kdy došlo ke stisku,
bez ohledu na jeho délku či ukončení. Díky

Ludek
Příspěvky: 289
Registrován: 02 pro 2019, 08:14
Reputation: 0
Bydliště: České Budějovice

Re: Časování s millis()

Příspěvek od Ludek » 11 kvě 2020, 19:57

Tak to nefunguje. Trápím se s takovou prkotinou, a zkouším trivialitu.
Stiskni tlačítko a po vteřině napiš na monitor třeba "AHOJ", - pouze jednou, dokud tlačítko neuvolním,
ale ostatní procedury musí šlapat dál. Rozlouskne někdo takový oříšek? díky

Uživatelský avatar
kiRRow
Příspěvky: 1151
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: Časování s millis()

Příspěvek od kiRRow » 11 kvě 2020, 20:35

no to si jen musíš pamatovat, že už jsi to na ten monitor vypsal .... a pokud si pamatuješ, že už jsi to tam jednou vypsal tak to tam nebudeš vypisovat znovu ... a až ten čudl pustíš, tak tu paměť vymažeš ....
if(vypsalJsemTo == false){
//vypisu to
vypsalJsemTo = true;
}
..... takhle se ti to vypíše jen jednou, do tý doby než smažeš tu paměť ...

Odpovědět

Kdo je online

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