Ledin ohjaaminen painonapilla

Johdanto

Tämä harjoitus on suoraa jatkoa edelliseen harjoitukseen, jossa lediä vilkutettiin ennalta määritettyyn tahtiin. Nyt mukaan lisätään vielä painonappi, ja voit sytyttää ledin painamalla napin pohjaan. Tällaisen asian ohjelmoimiseksi tarvitset ehtolausetta!

Painonappeja käytetään oikeastaan kaikessa kodin elektroniikassa. Napin painallus luetaan yleensä joonkinlaisella tietokoneella, joka lähettää käskyjä sitten eteenpäin haluttujen toimintojen aikaansaamiseksi.

Alla olevalla videolla esitellään eräs DIY-versio painonapista! (DIY = Do It Yourself)

ShiftyTips: DIY On Off Switch

Ohjelman tavoite

Led syttyy, kun nappia painetaan. Huomaa, että virtapiiri on sama kuin aiemmassakin harjoituksessa!

Tarvittavat komennot

Edellisestä ohjelmasta tarvitaan näitä komentoja:

Uudet komennot:

Lisäksi kirjoitetaan ensimmäinen ehtolause ja käytetään muuttujaa:

Ohjelmointi 1/3

Ensin pitäisi päästä katsomaan, mitä arvoja napista tulee, kun se on pohjassa tai ylhäällä.

Tehtävä
Aloita kopioimalla seuraavanlainen koodi Arduinollesi. Lue huolellisesti koodin kommentoidut kohdat (tekstit merkinnän “//” jälkeen) ja vastaa niiden pohjalta sivun alalaidassa olevaan monivalintaan.

Tarkempaa tietoa siitä, mitä INPUT_PULLUP tarkoittaa, löydät tämän harjoituksen lopusta kohdasta Lisätietoa

void setup() {
  // Kerrotaan Arduinolle, että porttiin 2 on kytketty laite (nappi) josta tulee tietoa sisään (Input)
  pinMode(2, INPUT_PULLUP);
  // Kerrotaan Arduinolle, että porttiin 5 on kytketty laite (led), jota on tarkoitus ohjata.
  pinMode(5, OUTPUT);
}

void loop() {
  // loop-osa on vielä tyhjä. Sitä ohjelmoidaan myöhemmin!
}

Missä osassa Arduino-ohjelmaa asetetaan portit sisään- tai ulostuloiksi?

Ohjelmointi 2/3 - Serial Monitor

Jatka koodia kahdella uudella komennolla, jotka on selitetty koodin seassa olevilla kommenteilla. Vaikka aiemmat kommentit eivät olekaan enää tekstin seassa, niin voit jättää ne sinne halutessasi!

void setup() {
  pinMode(2, INPUT_PULLUP);
  pinMode(5, OUTPUT);
  // Avataan sarjaliikenne tietokoneen ja Arduinon välille. 
  Serial.begin(9600);
}

void loop() {
  int buttonState = digitalRead(2);
  // Tulostetaan sarjamonitoriin tieto siitä, onko nappi pohjassa vai ei.
  Serial.println(buttonState);
}
Tehtävä
Lataa ohjelma Arduinolle ja avaa serial monitor Arduino IDE:n oikeassa yläkulmassa olevasta suurennuslasikuvakkeesta. Painele nappia ja tarkkaile siitä tulostettuja arvoja. Vastaa sitten sivun alalaidassa olevaan monivalintaan!

Mikä arvo napista tulee, kun se on pohjassa?

Ohjelmointi 3/3 - If-lause

Äsken pääsit lukemaan napista tulevia tiloja. Tila oli 1 eli HIGH silloin, kun nappi oli ylhäällä, ja 0 eli LOW silloin, kun nappi oli alhaalla. Nyt tavoitteena on muokata ohjelmaa sellaiseksi, että led palaa aina, kun nappi on pohjassa. Tähän tarvitaan if-lausetta, jota selitetään seuraavaksi hieman.

If-lause on ohjelmoinnin peruspalikoita. Sillä halutaan määrittää, mitä tapahtuu jos jokin ehto täyttyy. Else -komennolla kerrotaan taas se, mitä tapahtuu, jos ensimmäinen ehto ei täyty. Ehto voi olla esimerkiksi se, että napista luettu tila on yhtä suuri kuin 0 tai 1. Alla oleva koodi on esimerkki if-lauseesta. Sitä ei tarvitse kopioida!

if(ehto){
    //Mitä tapahtuu, jos ehto täyttyy?
  }
  else{
    //Mitä tapahtuu, jos ehto ei täyty?
  }
}
Tehtävä
Jatka koodiasi nyt kirjoittamalla if-lauseeseen siitä puuttuva ehto, joka on kirjoitettu kommenttina koodiin. Katso mallia Arduinon referenssistä kohdasta if-lause. Vinkki: tarvitset ehdon toteuttamiseen digitalRead(2) -komentoa, koska nappi on kiinni portissa 2.
void setup() {
  pinMode(2, INPUT_PULLUP);
  pinMode(5, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  Serial.println(digitalRead(2));
  if(/*jos napista tuleva arvo on "0"*/){
    digitalWrite(5, HIGH);
  }
  else{
    digitalWrite(5, LOW);
  }
}

Olet tällä kurssilla tutustunut virtapiirin toimintaperiaatteisiin, elektroniikan peruskomponentteihin kuten vastukseen, lediin ja kytkimeen sekä oppinut mikrokontrollerin ohjelmoinnin perusteita. Seuraavalta sivulta löydät vielä lisätietoa harjoituksen asioista!

Lisätietoa

Sarjamonitori eli serial monitor

Serial monitor on kätevä tapa debugata Arduinon toimintaa, ja sitä tullaan käyttämään kurssilla runsaasti. Arvojen tulostaminen serial monitoriin auttaa ymmärtämään, mitä tapahtuu kun ohjelma on käynnissä.

Mikä ihmeen Input_Pullup?

Saatoit huomata, että nappia käytettäessä portin tilaksi asetettiin “INPUT_PULLUP” käskyllä “pinMode(5, INPUT_PULLUP)". Tämä merkintä tarkoittaa kyseisen portin liittämistä Arduinon sisäiseen ylösvetovastukseen. Ylösvetovastukseen kytkettäessä portti on kiinni jännitteessä napin ollessa ylhäällä, ja tila on tällöin varmasti 1 eli HIGH. Jos nappia ei kytketä ylösvetovastukseen, arvo kelluu napin ollessa ylhäällä eli arvo on sattumanvaraisesti joko 1 tai 0. Lisätietoa ylösvetovastuksesta löydät täältä.

Muuttuja

Kaikessa ohjelmoinnissa tarvitaan muuttujia. Muuttuja on muistipaikka, johon tallennetaan arvoja. Muuttujan määrittelyssä sille annetaan tyyppi (esim. kokonaisluku tai merkkijono), nimi (ohjelmoija saa määrätä nimen itse) ja arvo. Myöhemmin ohjelmassa muuttujaan viitataan pelkällä nimellä.

Ehtolause

Teit koodiin if-else -rakenteen, jota tarvitaan ohjelmoinnissa usein. Kaksi yhtäsuuruusmerkkiä (==) ehtolauseessa on vertailuoperaattori, mikä tarkoittaa “on yhtä suuri kuin”. Koodissa käytetty ehto buttonState == 0 tarkistaa siis onko buttonState-muuttujaan tallennettu arvo 0. Muita vertailuoperaattoreita ovat:

// a on pienempi tai yhtäsuuri kuin b
a <= b
// a on pienempi kuin b
a < b
a on suurempi kuin b
a > b
//a on suurempi tai yhtäsuuri kuin b
a >= b
//a ja b eivät ole yhtäsuuria.
a != b