Végül azt szeretném megoldani hogy a kapcsoló benyomáskor kivillanjon és folyamatosan vílágítson pl a led(beépített 13 pinen) és ha újból megnyomom akkor pedig kialudjon.
Röviden:
A jobboldali ábra, mert a nyomógomb esetén a GND-re kötés a gyakoribb, mert a chipben _belső felhúzó_ ellenállás van.
Es ha a külső kimarad, akkor is működtethető. De amióta az "A" vegu chipek vannak, a 2 megoldas egyenerteku (belső ellenállás "A" esetben >100kohm).
Mert nem tudod olyan gyorsan elengedni a gombot, mint kellene. De a viccet félre téve működik, csak olyan gyorsan lekapcsolod, hogy észre sem veszed. Gondold csak végig. Először nézed a gomb nyomást, aztán kivárod a prellt, és megint nézed a gombot. Megvan amit akarsz, kapcsolod a ledet, és jelölöd, hogy be van kapcsolva. És itt a rögtön folytatod azzal, hogy megnézed a gomb állapotát. Még mindíg nyomva van, mert ilyen gyorsan nem tudod elengedni, aztán megnézed, hogy be van-e kapcsolva (persze hogy be, hát most kapcsoltad be) és ha ezek igazak, akkor rögtön ki is kapcsolod. Vagyis működik, csak nem azt teszi amit vársz tőle.
1, ha gomb nyomott es perll is elmult:
led allapotvaltas:
a led eg, akkor kikapcsol, kulonben bekapcsol
a gomb elengedett allapot es a prell is elmult, akkor tovabb
mars az elejere
Ha ideírunk egy kész megoldást, akkor verni fogod a fejed a falba, hogy nem jöttél rá, pedig milyen kézenfekvő, és legközelebb megint nem fogsz rájönni. De ha a segítségekkel magad találod meg a megoldást, akkor legközelebb kapásból eszedbe jut.
Szóval egy variációban az jó vonulat lehet, hogy a gomb figyelés, és a kapcsolási feltétel létrejöttekor beállítod a jelződet, például azt amit te most "bekapcsolva" változónak neveztél. (Ez egyébként akár boolean is lehetne, jobban utalna a változó "flag" jellegére.) De nem kapcsolod be rögtön a LED-et, hanem akkor kapcsoltatod be, amikor elengedettnek látod a gombot, és a változód azt jelzi, hogy be kéne kapcsolni. Akkor bekapcsolod, és törlöd a kapcsolás jelzőt. Másként fogalmazva, és funkcióját tekintve nem is "bekapcsolva" lenne a boolean értelme, hanem "kapcsolni_kell". Amikor a gombot nyomva találod, akkor beállítod, és amikor elengeded, akkor egy másik program részlet rátalál a feladatra, és kapcsol. Ha bekapcsolva volt akkor ki, és viszont. Így egy helyen lesegeted a kapcsolót, és jelzed a másik programrészletednek, hogy van-e teendő. Csak azt kell még végig gondolnod, hogy melyik résznek hol kell lennie a loopban ahhoz, hogy egy gombnyomás egy kapcsolást eredményezzen.
Azt tartsd szem előtt, hogy a loop folyamatosan körbe-körbe csinálja amit beleírsz, és mindez igen gyorsan történik. Egy gombnyomás ideje alatt több százszor is vérehajtódik a loop, tehát, ha például egy if feltétel a gombnyomáskor folyamatosan fennáll, akkor az minden körben végrehajtódik. Ha csak egyszer kell végrehajtani valamit, akkor gondoskodni kell róla, hogy a folyamatosan fennálló feltétel ellenére csak egyszer foglalkozzunk vele. Például fogalmazhatod úgy a feltételt gombnyomás esetén, hogy ha még nincs beállítva a "flag", akkor beállítom. Így a folyamatos körbefutkosás ellenére csak egyszer lesz beállítva amit állítani akarsz.
Csak hogy lássad a programod hogyan is működik, tegyél bele várakozást a bekapcsolási meg a kikapcsolási pontok közé, és tartsd nyomva a gombot. Meglátod fel fog villanni, és elalszik miközben a gombot nyomod. Ha a világítás közben engeded el akkor égve is marad. És ha a kikapcsoláshoz is megtalálod a helyet, ahol időt kell adnod a gomb elengedésére, akkor kikapcsolni is fog, csak nem teljesen ezt a működést akartad leprogramozni. Ha nagyon részletesen akarod látni, akkor szúrj be minden utasítás után egy Serial.println("utasítás") sort, amivel a soros porton keresztül olvashatod a képernyőn a történéseket. Ha késleltetésekkel lelassítod, akkor lesz időd elolvasni melyik utasításnál tartasz, és a LED-en meg láthatod az eredményét. Ez persze egy folyamatos szövegáradat lesz, amiben meg kell találnod, mi mikor történt. Ha készítesz egy loop számlálót, amit a loop elején mindig növelsz eggyel, és kiíratod a soros portra, akkor rögtön azt is láthatod, hogy mikor kezdődik új kör, és jobban láthatod mi történik. Hajrá, meglesz az a bekapcs-kikapcs.
A Serial print-nek két előnye van:
1, várakozást okoz, így a prell lecsen (9600 bps esetén 1 karakter: 1 msec)
2, változóértékeket és elágazáshelyeket írass ki. Így követed a programodat...
Mondjuk én inkább timer irq-val csinálnám meg, a főprogramban is luxus a delay szerintem.
De miért is őrül meg?
Felfutó élnél vált a kimenet, kivárja a prell-t, és utána üresen fut a loop (oldin kizárja a többit) amíg le nem szállsz a gombról.