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.
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)
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:
Ensin pitäisi päästä katsomaan, mitä arvoja napista tulee, kun se on pohjassa tai ylhäällä.
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!
}
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);
}
Ä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?
}
}
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!
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