Projekt 1 LED-i juhtimine nupuga

Lisada Arduino plaadile nupp, mille üks juhe ühendada maapotentsiaaliga (inglise keeles ground, lühend GND) ja teine mikrokontrolleri viiku A0. Valgusdioodi eraldi lisada pole vaja kuna Arduino plaadil on üks juba olemas, mis on ühendatud viiku D13. Olenevalt Arduino arendusplaadist võib LED paikneda plaadil erinevas kohas ja olla erinevat värvi, kuid alati on ta ühendatud viiku D13.
NB! Kui nupul puudub jadamisi takisti, siis tuleb eriti tähelepanelikult jälgida, et nuppu ei ühendataks toitepotentsiaali (+5V) ja GND vahele, kuna tagajärjeks võib olla maha põlenud plaat.

Arduino ühendusskeem

Näide #1.1 Nuppu all hoides LED põleb

Tegemist on lihtsa programmiga, kus nupu vajutamisel sisendviik A0 ühendub GND-ga ja mikrokontroller muudab selle peale väljundviigu D13 kõrgeks (+5 V). Tulemusena süttib Arduino plaadil D13 viiguga ühendatud LED. Programmi töötamiseks on eelnevalt vaja seadistada kasutatavad viigud. Kõik Arduino viigud on ohutuse mõttes tavaolekus sisendid. Seega üldiselt sisendeid eraldi seadistama ei pea. Samas puudub nupu oleku lugemisel vajalik pull-up takisti. Kasutame selleks mikrokontrolleri sisemist takistit, mille aktiveerimiseks tuleb viik seadistada olekusse INPUT_PULLUP. LED-i põlema saamiseks on vaja seadistada viik D13 väljundiks ehk OUTPUT. Programmi peatsüklis loop pidevalt kontrollitakse sisendi olekut ja kui see on madal (inglis keeles LOW), siis seatakse viik D13 kõrgeks (inglise keeles HIGH). Vastasel juhul seatakse D13 madalaks.
Arduino digitaalsete viikude kohta saab lugeda rohkem siit: https://www.arduino.cc/en/Tutorial/DigitalPins.

/*
Nimetus: Näide #1.1
Kirjeldus: Nuppu all hoides LED põleb 
*/
 
/* Konstandid */
// Viik kuhu on ühendatud nupp
const int nupp = A0; 
 
// Viik kuhu on ühendatud LED
const int led = 13; 
 
/* Globaalsed muutujad */
// Nupu muutuja oleku salvestamine ja selle algväärtustamine
int nupuOlek = 0; 
 
void setup() 
{ 
  // LED viigu väljundi seadistamine 
  pinMode(led, OUTPUT); 
  // Nupu viigu sisendi seadistamine ja sisemise "pull-up" takisti aktiveermine
  pinMode(nupp, INPUT_PULLUP); 
}
 
void loop()
{
  // Nupu muutuja hetkeväärtuse salvestamine
  nupuOlek = digitalRead(nupp); 
  // Kui nupp on alla vajutatud, siis seadistame LED viigu kõrgeks ehk LED süttib
  if (nupuOlek == LOW) 
  { 
    digitalWrite(led, HIGH);
  } 
  // Muul juhul seadistame LED viigu madalaks ehk LED ei põle
  else 
  { digitalWrite(led, LOW);
  }
}

Näide #1.2 Nupule vajutades LED süttib 1 sekundiks

Võrreldes eelmise programmiga on juurde lisatud 1000 ms (millisekundi) pikkune viide pärast LED-i oleku kõrgeks muutmist. Lisatud rida koodis hoiab LED-i põlemas veel viite väärtuse võrra pärast nupu lahti laskmist. Antud meetod on otstarbekas, et paremini märgata sisendi muutust. Arduino viitefunktsioonidest saab lähemalt uurida siit: https://www.arduino.cc/en/Reference/Delay

/*
Nimetus: Näide #1.2
Kirjeldus: Nupule vajutades süttib LED 1 sekundiks
*/
 
// Algus identne näitega #1.1 (kommenteeritud koodi vaata sealt)
const int nupp = A0; 
const int led = 13; 
 
int nupuOlek = 0; 
 
void setup() 
{ 
  pinMode(led, OUTPUT); 
  pinMode(nupp, INPUT_PULLUP); 
}
 
void loop()
{
  // Nupu muutuja hetkeväärtuse salvestamine
  nupuOlek = digitalRead(nupp); 
 
  /* Kui nupp on alla vajutatud, siis seadistame LED viigu kõrgeks ehk LED süttib,
     programm seisab 1 sekund ja pärast seda seatakse viik tagasi madalaks */
  if (nupuOlek == LOW) 
  { 
    digitalWrite(led, HIGH);
    delay(1000); // 1000 millisekundit ehk 1 sekund
  } 
  digitalWrite(led, LOW);
}

Näide #1.3 Nupule vajutades muudab LED oma olekut

Peatsüklis loop LED oleku kõrgeks muutmisele järgneb while tsükkel, mis hoiab programmi kinni kuni nupp on lahti lastud ehk viigu olek muutub tagasi kõrgeks. Lisaks on juures viide enne while tsüklit ja pärast LED-i oleku muutmist. Konkreetsed viited on vajalikud nupu kontaktide põrkumisest tekkiva värelemise efekti (debounce) eemaldamiseks, sest vastasel juhul on LED-i oleku muutumine kaootiline. Kontaktide värelemise efektist võib lähemalt lugeda siit: https://www.arduino.cc/en/Tutorial/Debounce.

/*
  Nimetus: Näide #1.3
  Kirjeldus: Nupule vajutades muudab LED oma olekut püsivalt
*/
 
// Algus identne näitega #1.1 (kommenteeritud koodi vaata sealt)
const int nupp = A0; 
const int led = 13; 
 
int nupuOlek = 0; 
 
void setup() 
{ 
  pinMode(led, OUTPUT); 
  pinMode(nupp, INPUT_PULLUP); 
}
 
void loop() 
{
  // Programm ei tee midagi kuni vajutatakse nuppu
  if (digitalRead(nupp) == LOW) 
    {
   // Lüliti kontaktide värelemise (debounce) efekti mõju vähendamiseks väike viide
    delay(50); 
    while (digitalRead(nupp) == LOW)
     { //Tsükkel hoiab programmi kinni kuni nupu viigu olek muutub kõrgeks
     }
    /* LED viigu olek inverteeritakse ehk seatakse
       vastupidiseks kasutades hetkeväärtust */
    digitalWrite(led, !digitalRead(led)); 
 
   // Lüliti kontaktide värelemise (debounce) efekti mõju vähendamiseks väike viide
    delay(50); 
    }
}

Harjutused

Harjutus #1.1

Modifitseerida näiteprogrammi nii, et nupule vajutades vilgub LED kolm korda.

Harjutus #1.2

Modifitseerida näiteprogrammi nii, et nupule vajutades hakkab LED konstantselt vilkuma 1 sekundilise intervalliga ja teine nupule vajutus lõpetab vilkumise.

Harjutus #1.3

Modifitseerida näiteprogrammi nii, et nupule vajutades LED vilgub nii mitu korda, kui on nuppu programmi töötamise jooksul kokku vajutatud. Pärast igat vajutust suureneb vilkumiste arv ühe võrra.

et/arduino/buttons/project1.txt · Last modified: 2020/07/20 09:00 by 127.0.0.1
CC Attribution-Share Alike 4.0 International
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0