Arduino časování
Moderátor: Moderátoři
Arduino časování
- pocitujlasku
- Příspěvky: 2764
- Registrován: 12 pro 2005, 00:00
- Bydliště: SR, Poprad
Kód: Vybrat vše
if podmienka {
delay(oneskorenie);
nastav rele;
}to ti ale zastavi beh programu na ten cas.
Kód: Vybrat vše
if podmienka {
premenna= aktualne milis+oneskorenie
}
if (premenna<=aktualne milis) {
nastav rele
}
Tu program bude bezat dalej
Alebo cez prerusenie, to uz ale z hlavy nedam. v principe si nastavis interny timer, a on ti po zadanom case spusti tvoju funkciu, kde nastavis rele.
V poslednom moze nastat problem, ak vyuzivas kniznice, ktore pouzivaju tiez timer.
Ja osobne pouzivam druhy sposob. program bezi a +- nejake milisekundy u mna nie su podstatne.
URL:https://playground.arduino.cc/Main/MsTimer2/
1/ nastavíš čas a jméno funkce přerušení
MsTimer2::set(500, flash); // 500ms period
2/ nastartuješ, kdy potřebuješ
if (podminka) MsTimer2::start();
3/ po uplynutí arduino 'zavolá' funkci flash(), což je přerušení od časovače TCNT2. Použité proměnné uvnitř by měly být deklarovány jako volatile, pokud se k nim přistupuje i mimo funkci flash()
void flash() {
static boolean output = HIGH;
digitalWrite(13, output);
output = !output;
}
bdn píše:Použité proměnné uvnitř by měly být deklarovány jako volatile, pokud se k nim přistupuje i mimo funkci flash()
Jenom malá poznámka. Deklarace proměnné jako "volatile" uvnitř funkce opravdu nemění její rozsah platnosti. Tj. k takové proměnné nelze přistupovat mimo funkci, ve které je deklarována.
net píše:... jak vytvořit zpožděné sepnutí relé? ...
Nenapsal jsi zda zpožděné sepnutí bude:
- vyvolané např. externím vstupem
- vyvolané nějakou událostí v programu nezávisle na vstupech
a zda "zpožděné sepnutí" znamená:
- čekat nějakou dobu, co nějaká událost trvá a pokud nezmizí tak teprve pak sepnout?
- nebo objeví se událost, kvůli které má být relé sepnuto a protože je událost mžiková, sepneme relé a prodloužíme jeho sepnutí na nějakou delší dobu?
A software při startu čeká cca10-15s na brejle tedy na jejich sepnutí jinak err.
Pokud neni potřeba nějakou extra přesnost, dalo by se periodicky zjišťovat milis()
něco jako if milis()>=cas_akce .... Zejména pokud program nemá dělat nic jiného než právě toto.
Případně by se to dalo napsat v assembleru nebo v něčem bez použití knihoven arduina a pak to tam naloadovat přes bootloader (použít ten samý příkaz avrdude, jako používá arduino IDE ale hex soubor nahradit svým ostatní ponechat).