Časování s millis()
Časování s millis()
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?
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?
Re: Časování s millis()
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.
Ukázka kódu předpokládá že jsou již deklarované použité proměnné a piny nasměrované na vstup a výstup.
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
}
- 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()
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
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"
Pavel1TU
"Správně napsaný kod lze číst jako knihu"
Re: Časování s millis()
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
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
Re: Časování s millis()
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.
Tak tohle se nejlépe ošetřuje v tom časovém interruptu. Jinak je to dost pakárnakiRRow píše: ↑05 kvě 2020, 17:05No 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
Re: Časování s millis()
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
- 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
Re: Časování s millis()
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
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
Re: Časování s millis()
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ěť ...
if(vypsalJsemTo == false){
//vypisu to
vypsalJsemTo = true;
}
..... takhle se ti to vypíše jen jednou, do tý doby než smažeš tu paměť ...
Kdo je online
Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 12 hostů