Darbas su „šokinėjančiais“ mygtukais


Kada paskutinį kartą jums reikėjo pastoviai laikyti mygtuką, kad šviesa būtų įjungta? Tikriausiai niekada. Daug patogiau būtų, jeigu vieną kartą paspaudus mygtuką jis įjungtų šviesą, o dar kartą paspaudus išjungtų. Šiuo atveju mums nereikėtų laikyti mygtuko nuspausto, kad šviesa būtų įsijungusi. Deja tai nėra taip paprasta kaip atrodo. Jums neužtenka tiesiog nustatyti, kad mygtukas pakeistų reikšmę iš LOW į HIGH, reikės išvengti „šokinėjimo“ fenomeno.
Mygtukai yra mechaniniai įtaisai, kuriuose veikia spyruoklinė sistema. Kitaip sakant, kai jūs paspaudžiate mygtuką, signalas neiškart pasikeičia nuo LOW į HIGH. Jis šokinėja tarp šių dviejų būsenų keletą milisekundžių kol nusistovi. Žemiau parodyta, kaip mes tikimės, kad bus ir dešiniau, kaip ištikrųjų tai vyksta.

1

 

Realiai mygtukas paspaustas prie 25 ms žymos. Dažniausiai tikimasi, kad mygtukas iškarto pakeis būseną į HIGH, kaip matome kairiajame paveikslėlyje. Tačiau iš tikro jo reikšmė šokinės prie nusistovint, kaip matome dešiniau.
Jeigu mes visa tai žinome, galima tai sutvarkyti programinės įrangos pagalba. Parašome tokią programą, kuri atsižvelgia į mygtuko būsenos šokinėjimus ir palaukia kol nusistovės, o tada perskaito mygtuko būseną iš naujo. Programos logika yra tokia:
   1. Saugom pradinę mygtuko būseną (tarkim LOW).
   2. Skaitom dabartinę būseną.
   3. Jeigu dabartinė būsena skiriasi, palaukiam 5 ms, kad mygtukas spėtų pakeisti būseną.
   4. Po 5 ms, perskaitom mygtuko būseną iš naujo ir naudojam dabar esamą.
   5. Jeigu prieš tai buvusi būsena yra LOW, tai dabartinę padarom HIGH ir įjungiam LED‘ą.
   6. Nustatom pradinę mygtuko būseną lygią dabartinei.
   7. Vėl gryžtame prie antro žingsnio.

3

 

Ši programa mums duoda puikią galimybę išbandyti funckijas. Funkcijos tai programos blokai, kurie priima argumentus, įvykdo kodą, remiantis atsiųstai argumentais ir grąžina rezultatą. Gal net nesupratote, bet jūs jau anksčiau naudojote funkcijas. Tarkime kaip pavyzdys, funkcija digitalWrite() priima pin‘o numerį ir būseną ir parašo kokia būsena bus priskirta šiam pinui. Programos supaprastinimui jūs galite kurtis savo funkcijas, kad sudaryti veiksmų blokus, kuriuos galėsite kartoti vėl ir  vėl.

Programos eigoje yra eilės besikartojančių veiksmų, kuriuos mes naudosime kintamųjų reikšmių keitimui. Kadangi mums reikės pastoviai tikrinti šokinėjančias reikšmes, tai patogu būtų šokinėjimui sukurti atskirą funkciją, kurią galėtume išsikviesti bet kuriuo metu ir kiek reikia kartų. Ši funkcija priims pradinę mygtuko būseną ir grąžins dabartinę. Programa įvykdys visus reikiamus žingsnius ir galės keisti LED‘o būseną, kiekvieną kartą kai bus paspaustas mygtukas.

2 

 

Trumpai pasiaiškinam kodą. Pirmiausia nustatomos pastovios (constant) reikšmės pin‘ams, prijungtiems prie LED‘o ir mygtuko. Toliau trys Boolen tipo kintamieji. Prisiminkite, kad jeigu nenaudosite const, tai jūsų kintamasi galės kisti programos eigoje, kas nevisada gerai. Kintamieji aprašyti programos pradžioje tampa globaliais kintamasiais ir gali būti naudojami visoje programoje bet kurioje funkcijoje. Trys Boolean tipo kintamieji yra aprašyti viršuje ir jiems priskirtos pradinės reikšmės. Jie nėra konstatos, tai reiškia programos vykdymo eigoje galės kisti.

Ką gi daro ši dalis: boolean debounce(booleanlast). Tai funkcija kuri priima Boolean parametrus ir siunčia Boolean tipo kintamąjį. Ši funkcija palygina dabartinę būseną su prieš tai buvusia. Ženklas != reiškia nelygu. Jis tikrina pradinę būsena su esama. Jeigu jos skirias, tai reiškia mygtukas buvo paspaustas ir bus pradėtas vykdyti sąlygos sakinio kodas. Bus daromas 5 ms laukimas ir po jo vėl tikrinamos būsenos. 5 ms skirtos, tam kad nustotų šokinėti reikšmės. Kai bus nustatoma esama būsena, ji bus grąžinama programai. Current kintamasis yra lokalus, jis bus naudojamas tik funkcijoje. Kadangi funckija yra aprašyta kaip debounce, tai norint ją iškviesti, reikia parašyti currentButton = debounce(lastButton) setup arba loop dalyje. Kintamajam currentButton bus priskirta funkcijos grąžinama reikšmė.

Po funkcijos iškvietimo, jums labai lengva patikrinti būsenas su sąlygos sakiniu. Sąlygoje naudojamas && loginis operatorius reiškia žodį „AND“ (ir). Jeigu mums reikia sujungti 2 ar daugiau sąlygų vienoje tai tada ir galime pasinaudoti šiuo operatoriumi. Sąlyga bus tenkinama tik tokiu atveju jeigu visos dalys sujungtos loginiu operatoriumi && bus tenkinamos. Jeigu mygtukas prieš tai buvo LOW ir dabar yra HIGH, tai galime spręsti, kad jis buvo nuspaustas ir tada pakeičiama kintamojo ledOn reikšmė į priešingą. Šiuo atveju galime pasinaudoti ! prieš kintamojo ledOn vardą. Jis pakeis kintamojo reikšmę priešinga. Ciklas baigsis pakeičiant buvusią reikšmę.

Šis kodas pakeis LED‘o būseną kiekvieną kartą kai bus paspaustas mygtukas. Jeigu jūs nebandysite išvengti reikšmių šokinėjimo, galite sulaukti nenuspėjamų rezultatų. Kartais mygtukas veiks taip kaip priklauso, kartais ne.

 

 

 

Comments  

0 #1 TOmas is 5c 2016-04-19 07:48
Labai gera team I r8 9/11. Gj m8
Quote

Add comment

Security code
Refresh