Što su?
Tipkalo je najčešće korišteni switch u elektronici i nema potreba da se dugo zadržavamo na tome što je. Vrlo kratko, s jednom sličicom, prikazati ćemo što i kako radi, a zatim ga odmah idemo spojiti na Croduino.
Pull-up otpornik
Svako tipkalo moramo spajati preko pull-up ili pull-down otpornika na Croduino. Već smo pričali o pull-up otpornicima i floatanju pinova Croduina. Provjerimo što se događa kada tipkalo ima, odnosno što kada nema ovog otpornika.
Tipkalo lijevo spojimo na +5V koje će se pri pritisku tipke proslijediti na digitalni pin 7. Tipkalo desno spajamo na pin 6, ali dodajemo mu 10k otpornik kako prikazuje slika dolje.
Ono što očekujemo je da će pinovi 7 i 6 Croduina imati očitanja LOW(0) kada nisu aktivirano, odnosno HIGH(1) kada su tipke pritisnute. Provjerimo što se u stvarnosti događa.
Napišimo mali sketch koji će čitati stanja digitalnih pinova 7 i 6.
int lijevoT = 7; // tipkalo lijevo, bez pull-up otpornika, je na pinu 7 int desnoT = 6; // tipkalo desno, s pull-up otpornikom, je na pinu 6 void setup() { pinMode(lijevoT, INPUT); pinMode(desnoT, INPUT); // definiramo ih kao ulazne pinove Serial.begin(9600); // započinjemo serijsku komunikaciju, preko koje ćemo čitati stanje pinova } void loop() { // ispisujemo stanja pinova 7 i 6 Serial.write("Tipkalo lijevo: "); Serial.write( digitalRead(lijevoT) ); Serial.write("\t"); Serial.write("Tipkalo desno: "); Serial.writeln( digitalRead(desnoT) ); }
Očitanja nam izgledaju otprilike ovako:
Pin na kojem se nalazi tipkalo bez pull-up otpornika floata, te je nekorisno kao tako. Dakle, pull-up/pull-down otpornik je jednostavno nešto bez čega tipkalo ne ide.
Tipkalo kao aktivator
Tipkalo želimo koristiti na način da kada je pritisnuto/aktivirano upali LED diodu na 13om pinu. Nema problema:
int tipkalo = 6; int led = 13; // iskoristimo LEDicu na pinu 13 // koju ćemo pritiskom na tipku paliti odnosno gasiti void setup() { pinMode(led, OUTPUT); pinMode(tipkalo, INPUT); } void loop() { digitalWrite(led, digitalRead(tipkalo) ); // ovo je isto kao: /* int stanjeTipke = digitalRead(tipkalo); // sprema vrijednost 0 ako tipka nije pritisnuta // ili 1 kada je tipka pritisnuta digitalWrite(led, stanjeTipke); // stanje tipke 1(HIGH) - LEDica svijetli // stanje tipke 0(LOW) - LEDica ne svijelti */ }
Tipkalo kao prekidač
Tipkalo možemo koristiti i kao prekidač. Koristiti ćemo boolean funkciju te pritiskom na tipku na pinu 6 prebacivati stanje iz LOW(0) u HIGH(1) i obratno. To radimo ovako:
int tipkalo = 6; int led = 13; // iskoristimo LEDicu na pinu 13 // koju ćemo pritiskom na tipku paliti odnosno gasiti int stanjeTipke; // varijabla u koju spremamo zadnje stanje tipkala bool boolLed = true; void setup() { pinMode(led, OUTPUT); pinMode(tipkalo, INPUT); } void loop() { stanjeTipke = digitalRead(tipkalo); // ako se promjeni stanje pin 6 if ( digitalRead(tipkalo) != stanjeTipke ) { boolLed = !boolLed; // promjeni i stanje LEDice digitalWrite(led, boolLed); } }
Tipkalo kao brojač
Koristiti ćemo varijablu brojač koju ćemo povećavati za 1 prilikom svakog novog pritiska tipkala. Ovdje moramo pripaziti na pojavu debouncing. Radi se o tome da koliko god mi brzo pustili tipku kod će nekoliko puta očitati da je aktivna te nepotrebno povećavati brojač. To možemo riješiti pomoću funkcije delay() koja će zaustaviti kod dok mi ne stignemo pustiti tipkalo ili malo sofisticiranije kao u sketchu ispod:
int tipkalo = 6; //tipkalo na pinu6 int brojac = 0; //brojac je 0 na pocetku bool boolBrojac = false; // bool s kojim kontroliramo ulazak u dio koda // koji povecava vrijednost "brojaca" void setup() { pinMode(tipkalo, INPUT); //definiramo tipkalo kao ulazni pin Serial.begin(9600); // stanje varijable brojac prikazivati cemo u Serial Monitoru Serial.println("Pocetno stanje brojaca: " + String(brojac)); // "pozdravna" poruka } void loop() { if ( digitalRead(tipkalo) == HIGH && boolBrojac == false ) // ako je tipka pritisnuta i vec nismo u if-u { boolBrojac = true; // usli smo u brojac brojac++; // isto sto i brojac = brojac + 1; Serial.println("Stanje brojaca: " + String(brojac)); // ispis stanja brojaca } // ovaj if obaviti će se samo jednom // iako ce vise puta digitalno ocitanje tipkala biti HIGH(1) // odamah po ulasku mijenjamo "boolBrojac" koji je uvijet za ulazak u if // samo kada je tipka deaktivirana, zelimo promijeniti // "boolBrojac" kako bi ponovno mogao uci u prvi if // te ponovnim pritiskom mogao povecati varijablu "brojac" if( digitalRead(tipkalo) == LOW && boolBrojac == true ) boolBrojac = false; }