Tipkalo (push button)

Š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.
 
Tipkalo

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.
 
tipkalo
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:
 
floatanje pinova Croduina
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;
}
Leave a Reply