
Arduino - zapni / vypni jedním tlačítkem
Zdravím všechny,
řeším problém s programem pro Arduino Uno. Potřeboval bych pomocí jednoho tlačíka (12) zapnout výstup (13) a zase vypnout pomocí stejného tlačítka (12), kterým jsem zapnul výstup (13). Pokoušel jsem se "něco" ubastlit, ale problém je v tom, že když tlačítko držím stisknuté, tak výstup je sepnutý a když ho pustím, tak vypne výstup. Mohl by mi někdo poradit, co s tím - případně navrhnout změny? Díky...
int start = 12;
int rele = 13;
int buttonState = 0;
void setup() {
pinMode(rele, OUTPUT);
pinMode(start, INPUT);
digitalWrite(start, HIGH);
}
void loop() {
buttonState = digitalRead(start);
if (buttonState == HIGH) {
digitalWrite(rele, LOW);
} else {
digitalWrite(rele, HIGH);
}
}
Napr.
int stav = 0;
void loop() {
buttonState = digitalRead(start);
if(stav != buttonState)
{
CAKAJ_10ms(); // najjednoduchsie debounce :)
buttonState = digitalRead(start);
if(stav != buttonState) // po debouncovani stale uroven udrzana
{
stav = buttonState;
if (buttonState == HIGH)
invertuj_stav_rele();
}
}
ok diky - zitra zkusim a dam vedet
Například takhle:
nemas to debouncovane (t.j. bude to robit nezmysly)
Debouncované to sice nemám, ale nesmysly to nedělá, to už bych na těch svých aplikacích poznal
Tak mas mozno HW debouncing na tom pine apod, alebo nejaky superspinac. Lebo normalny spinac urobi kludne aj 100 pulzov takze pri kazdom zmacknuti by si to 50x vypol a zapol, a ostalo by to na nahodnom stave.
Ked robis takto nejake HW vyrobky, tak to potom neni nic moc ;)
Druhá možnost je skrytý debouncing, kdy kromě výše popsané kostry ještě při tom stisku dělá něco dalšího (co já vím, třeba posílá něco přez SoftwareSerial, nebo wifinu, nebo tak), co samo o sobě způsobí nějaké to zdržení, čímž se ten debouncing provede, aniž by jako takový byl zmíněn či míněn ...
No to bude možná ono, protože digitalRead() si provádí milión kontrol, než se dostane k fyzickému vstupu. Pokud bych operoval pomocí PORT/PIN/DDR, tak ten debouncing budu muset udělat.
To urcite netrva 10ms, ale skor radovo jednotky us, to nestaci. Mas tam bud kondenzator alebo pin nastaveny na debounce, ak to ten chip umoznuje (nechce sa mi to teraz hladat), alebo to proste nefunguje a este si si to nevsimol :)
treba takhle
:
Cau tvoje zadani jsem pochopil tak, ze stiskem tlacitka se vystup zapne a zustane zapnuty dokud ho dalsim stiskem nevypnes a potom zustane vystup vypnuty.
Tvuj program ale dela pouze obraceni hodnoty vstupu 12 na vystup 13.
Je urcite vice zpusobu jak to maso uvarit, ale podle me je nejjednodussi zpusob ulozit do promenny buttonState zmenu hodnoty vstupu 12 a vystup 13 se pak rovna hodnote buttonState. Asi by to chtelo dat tam i nejakou tu pauzu pro debouncing.
Celkem to chodi ale urcite to bude chtit dopilovat.