arduinon ohjelmointi - mycourses · arduinon ohjelmointi 24. syyskuuta 2016 17 globaali vs lokaali...
TRANSCRIPT
Arduinon ohjelmointiSami-Petteri [email protected]
26. syyskuuta 2016
Arduinon ohjelmointi24. syyskuuta 2016
2
Arduino-ohjelman rakenne
int ledpin = 13;
void setup()
pinMode(ledpin , OUTPUT);
void loop() digitalWrite(ledpin , HIGH);delay (1000);digitalWrite(ledpin , LOW);delay (1000);
Arduinon ohjelmointi24. syyskuuta 2016
3
Muuttujathttps://www.arduino.cc/en/Tutorial/Variables
int︸︷︷︸tyyppi
omenamaara︸ ︷︷ ︸nimi
= 5︸︷︷︸arvo
;
I Tyyppi (kokonaisluku, kirjain, ...)I Jokainen muuttuja on jonkin tyyppinen.I Vrt. esim Python missä muuttujalla on vain nimi ja arvo
I ArvoI Mikäli muuttujalle ei luomishetkellä anneta arvoa, se voi olla
mitä tahansaI Muuttujan arvo ei siis oletuksena ole nolla!
Arduinon ohjelmointi24. syyskuuta 2016
4
Tärkeimmät muuttujatyypithttps://learn.sparkfun.com/tutorials/data-types-in-arduino
I Kokonaisluku (int, long) int muuttuja = -4;I Liukuluku (float, double) float muuttuja = 4.0;I Merkki (char) char muuttuja = ’a’;
I Vain ASCII-järjestelmän merkitI Aakkoset ja numerot löytyvät, ääkköset eivät
I Totuusarvo (boolean) boolean muuttuja = true;I Tosi (true) tai epätosi (false)
Arduinon ohjelmointi24. syyskuuta 2016
5
Muuttujatyypit
I Kieli on vahvasti tyypitettyI Jokaisen muuttujan tyyppi on siis määritelty
luomisvaiheessaI Tyyppi määrää:
I Millaisia arvoja muuttuja voi sisältääI Mitä muuttujalla voi tehdäI Paljonko muuttuja vie tilaa ohjelman muistissa
Arduinon ohjelmointi24. syyskuuta 2016
6
Muuttujatyypit laskutoimituksissa
Arduino ei automaattisesti muunna muuttujatyyppejä ihmisenmieleen sopiviksi.
int kokonaisluku = 2;float muuttuja1 = 3/ kokonaisluku; // 1float muuttuja2 = 3.0/2.0; // 1.5float muuttuja3 = 3.0/( float)kokonaisluku; // 1.5
I (tyyppi)muuttuja-notaatio muuntaa muuttujan tyypinI Muunnos isommasta tyypistä pienempään aiheuttaa
ongelmia jos muunnettava arvo on liian iso. (long→ int)
Arduinon ohjelmointi24. syyskuuta 2016
7
Lukutyypit
Laskutoimituksissa ja sijoituksissa voi merkitä lukuja erilukujärjestelmissä
I 0123 (oktaali)I 0b10100011 (binääri)I 0xA3 (heksadesimaali)I 3.4e3 (3.4 ∗ 103)
Myös muuttujatyypin voi erikseen määrätä. Hyödyllistäesimerkiksi laskutoimituksissa.
I 7U (unsigned)I 11L (long)I 15UL (unsigned long)I 12.3f (liukuluku)
Arduinon ohjelmointi24. syyskuuta 2016
8
Tärkeimpiä operaattoreita
summa 1+2 = 3erotus 1-2 = -1tulo 1*2 = 2osamäärä 1.0/2.0 = 0.5jakojäännös 5%3 = 2
Arduinon ohjelmointi24. syyskuuta 2016
9
Muutama oikotie
summa a += 2 a = a+2erotus a -= 2 a = a-2tulo a *= 2 a = a*2osamäärä a /= 2.0 a = a/2kasvata yhdellä a++ a = a+1vähennä yhdellä a−− a = a-1
Arduinon ohjelmointi24. syyskuuta 2016
10
Under-/overflow
I Mikäli muuttujan arvo menee muuttujatyypin alueen yli,"pyörähtää muuttuja yli"
byte c = 0; // c = 0--c; // c = 255c = c + 1; // c = 0
Arduinon ohjelmointi24. syyskuuta 2016
11
TaulukotI Hyvä väline esimerkiksi useamman ledin nastanumeroiden
säilömiseen.
int led_pin [3] = 3, 5, 6;// led_pin [0] on nyt 3// led_pin [1] v a s t a a v a s t i 5
I Taulukon jäseniä kutsutaan alkioksi.I Alkioon pääsee käsiksi syntaksilla nimi[alkio]I Indeksointi alkaa nollasta
led_pin [1] = 2;// led_pin vastaa nyt määritelmää 3 , 2 , 6
Arduinon ohjelmointi24. syyskuuta 2016
12
Tekstihttps://www.arduino.cc/en/Reference/String
I C-kielessä ei ole erillistä muuttujatyyppiä tekstille, vainmerkeille (char)
I Merkkijonot esitetään char-taulukkona
char materiaali [] = "puu";// materiaali-muuttuja vastaa nyt// määritelmää ’ p ’, ’u ’, ’u ’, ’\0 ’
I Merkkijonon lopussa ns. nollatavuI Työkalut pystyvät päättelemään mihin merkkijono loppuu.I Kolmen merkin merkkijonon tallentamiseen tarvitaan siis
neljä merkkiä!
Arduinon ohjelmointi24. syyskuuta 2016
13
Merkkijonojen käsittely
Merkkijonojen käsittelyyn on C-kielessä olemassaapufunktioita. Esimerkkejä
I strcpyI Kopioi osa merkkijonosta toiseen merkkijonoon
I strcatI Yhdistä kaksi merkkijonoa toisiinsa
I strcmpI Vertaile kahta merkkijonoa toisiinsa
I itoa ja atoiI Muunna kokonaisluku merkkijonoksi tai toisin päin
Arduinon ohjelmointi24. syyskuuta 2016
14
Vaikeaa?https://www.arduino.cc/en/Reference/StringObject
I Merkkijonojen käsittely C-kielen työkaluilla voi olla hiemanhaastavaa.
I Arduino sisältää String-nimisen olennon joka tekee tekstinkäsittelystä hieman helpompaa.
I Merkkijonoja voi helposti yhdistää ja muokata.
S t r i n g merkki jono = " e la im ia on " + S t r i n g ( 3 ) + " kp l " ;/ / merkkijono on nyt muotoa " elaimia on 3 kpl "
Arduinon ohjelmointi24. syyskuuta 2016
15
String-objektin muuntaminen
I Jotkut funktiot palauttavat tai vaativat c-tyylisiächar-taulukoita.
I Muuntaminen onnistuu kuitenkin helposti.
String nimi = "EsimErkki";nimi.c_str () // vastaa c-tyylistä char-taulukkoa.
// Tätä pystyy vain lukemaan,// ei muokkaamaan.
char merkkijono [] = "testausteksti";String muunnettu = String(merkkijono);
Arduinon ohjelmointi24. syyskuuta 2016
16
Muuttujien näkyvyys
int koira = 1;
void setup()
int kissa = koira + 2; // Toimii
void loop()
kissa = koira + 2; //Ei toimi, kissa näkyy//vain setup-funktiossa
Arduinon ohjelmointi24. syyskuuta 2016
17
Globaali vs lokaali muuttujaGlobaali (esimerkissä koira)
I Voidaan käyttää kaikkialla ohjelmassaI Hyviä kun samaa muuttujaa käytetään kaikkialla
ohjelmassa. Esim. Arduinoon kytketyn ledin pinninumeroI Vältä mikäli mahdollista. Hankala tutkia mitkä kaikki
ohjelman osat vaikuttavat muuttujaan.
Lokaali (esimerkissä kissa)
I Voi käyttää vain niiden aaltosulkeiden välissä jossamääritetty
I Laitteen tarvitsee säilöä tieto ainoastaan pienessä osassaohjelmaa→ tehokkaampaa
I Vaikeampi tehdä mokia
Arduinon ohjelmointi24. syyskuuta 2016
18
Funktiot
paluutyyppi funktionimi(parametri)
return paluuarvo;
Funktio ottaa sisäänsä parametreja, tekee niillä jotakin ja antaajonkinlaisen paluuarvon.
I PaluutyyppiI Muuttujan palauttaman arvon tyyppi.
I FunktionimiI Pitää alkaa kirjaimella.
I ParametriI Parametrit joita funktio ottaa vastaan. Voi olla useampia ja
jokaisella pitää olla tyyppi.I Pilkulla voi erottaa useampia parametreja.
Arduinon ohjelmointi24. syyskuuta 2016
19
Funktioesimerkki
int laskeYhteen(int numero1, int numero2)
return numero1 + numero2;
int a = laskeYhteen (1, 2); //a:n arvo on nyt 3
Arduinon ohjelmointi24. syyskuuta 2016
20
Ehtolauseet
if (false)
// Mikäli ehto on true, hypätään koodissa tänne.// Näin ei kuitenkaan ole, eli täällä ei käydä.
else
// If-lauseen ehto oli epätosi.// Hypätään siis tänne, eli else-lohkoon.
I Else-lohkon voi myös jättää pois. Tällöin ei tehdä mitäänjos lauseen ehto on epätosi.
Arduinon ohjelmointi24. syyskuuta 2016
21
Else if – mutta entä jos?
if (5 > 10)
//Ei ole, eli tänne ei päädytäelse if (6 > 10)
//Ei ole sekään, eli tännekään ei päädytäelse
//Päädytään siis tänne
Arduinon ohjelmointi24. syyskuuta 2016
22
Mielekkäitä totuuksia – Vertailu
a == b a yhtä suuri kuin ba != b a eri suuruinen kuin ba < b a pienempi kuin ba > b a suurempi kuin ba <= b a pienempi tai yhtäsuuri kuin ba >= b a suurempi tai yhtäsuuri kuin bI Kaikki yllä olevat vertailut muuttuvat suorituksen jälkeen
jompaan kumpaan kahdesta:I true jos ehto täyttyyI false jos ehto ei täyty
Arduinon ohjelmointi24. syyskuuta 2016
23
Boolen operaattorit
a && b tosi jos a ja b ovat molemmat tosia (and)a || b tosi jos jompikumpi, a tai b ovat tosia (or)!a tosi jos a on epätosi (not)I Kaikki yllä olevat ehdot muuttuvat suorituksen jälkeen
jompaan kumpaan kahdesta:I true jos ehto täyttyyI false jos ehto ei täyty
Arduinon ohjelmointi24. syyskuuta 2016
24
Boolen logiikka
int a = 15;
if ( (a > 10) && (a < 20) )
Serial.println("a on 10:n ja 20:n valissa");
Arduinon ohjelmointi24. syyskuuta 2016
25
Boolen logiikka
if ( true && true )
Serial.println("a on 10:n ja 20:n valissa");
Arduinon ohjelmointi24. syyskuuta 2016
26
Boolen logiikka
if ( true )
Serial.println("a on 10:n ja 20:n valissa");
Arduinon ohjelmointi24. syyskuuta 2016
27
Helpot asiat mokata!
I Varoitus! a=b ja a==b ovat eri asioita!I a = b; sijoita b:n arvo a:hanI a == b; tarkista ovatko a ja b saman arvoiset
I C-tyylisiä merkkijonoja ei voi vertailla ==-operaattorilla.Arduinon String-olioita voi!
Arduinon ohjelmointi24. syyskuuta 2016
28
Silmukat, eli toistorakenteet
I Silmukoita käytetään kun samankaltaisia asioita pitäätehdä useita kertoja peräkkäin.
I Silmukoita käytetään kun samankaltaisia asioita pitäätehdä useita kertoja peräkkäin.
I Silmukoita käytetään kun samankaltaisia asioita pitäätehdä useita kertoja peräkkäin.
Arduinon ohjelmointi24. syyskuuta 2016
29
While ja for
int i=0;while (i <= 5)
Serial.println(i);i++;
for (int i=0; i <= 5; i++)
Serial.println(i);
012345
Arduinon ohjelmointi24. syyskuuta 2016
30
ForKäyttökohteita esimerkiksi taulukoiden läpikäynti.
for (alkuarvo; ehto; askel)
//Todo: mitä tähän voisi laittaa
I Alkuarvo (int i = 0;)I Luodaan loopin sisällä käytettävä muuttuja ja annetaan sille
alkuarvo.I Ehto (i <= 5;)
I Ennen jokaista loopin suorituskertaa tarkistetaan että ehtototeutuu. Mikäli ei, koko looppi ohitetaan.
I Askel (i++)I Jokaisen loopin suorituskerran viimeiseksi suoritetaan tämä
käsky. Tässä tapauksessa kasvatetaan luotua i-muuttujaayhdellä.
Arduinon ohjelmointi24. syyskuuta 2016
31
For esimerkki
int ledpin [3] = 3, 5, 6;
void setup()
for (int i=0; i<3; i++) //i=0, 1, 2
pinMode(ledpin[i], OUTPUT);
Arduinon ohjelmointi24. syyskuuta 2016
32
While
Hieman geneerisempi toistorakenne kuin for.
while (ehto)
//Todo: mitä tähän voisi laittaa
I Ehto (i <= 5)I Ennen jokaista loopin suorituskertaa tarkistetaan että ehto
toteutuu. Mikäli ei, koko looppi ohitetaan.I Huom! Mikäli ehto toteutuu joka kerta, looppi ei lopu
koskaan.
Arduinon ohjelmointi24. syyskuuta 2016
33
While esimerkki
I Odotetaan minuutti ja joka sekunti tulostetaan kauankoaikaa on vielä jäljellä.
I millis() kertoo montako millisekuntia sitten Arduinokäynnistettiin.
long nowplusminute = millis () + 60000;
while (millis () < nowplusminute)
Serial.println(nowplusminute - millis ());delay (1000);
Arduinon ohjelmointi24. syyskuuta 2016
34
For vs while
I Oikeastaan for-silmukan voi ajatella "hienompana"versionawhile-silmukasta
I alkuarvo on vain lause joka ajetaan ennenwhile-silmukkaan siirtymistä
I ehto on while-silmukan ehtoI askel on lause joka sijoitetaan viimeiseksi while-silmukan
sisälle.
Arduinon ohjelmointi24. syyskuuta 2016
35
Break ja continue
I Silmukoiden kulkuun voidaan vaikuttaa kahdellakomennolla:
I breakI Lopeta silmukan suoritus heti ja siirry siitä ulos
I continueI Hyppää välittömästi takaisin silmukan alkuun.I For-silmukassa suoritetaan lisäksi askel-vaihe.
Arduinon ohjelmointi24. syyskuuta 2016
36
Break ja continue -esimerkki
int i=0;
while (true)
Serial.println(i);
i++;if (i < 3)
continue;break;
0123
Arduinon ohjelmointi24. syyskuuta 2016
37
Arduino
Arduinon ohjelmointi24. syyskuuta 2016
38
Arduino UNO:n pääpiirteet
I Flash-muistia 32 kilotavua, josta 0,5 KB varattu Arduinonbootloaderille
I Tähän tilaan ohjelman pitää siis mahtuaI 2 kilotavua SRAM-muistia
I Käyttömuisti. Esim muuttujat asuvat täälläI Tieto häviää kun virrat katkeavat
I 1 kilotavu EEPROM-muistiaI Muisti joka ei häviä virtojen katketessaI Esimerkiksi laitteen asetusten säilöminenI Vrt. tietokoneen kovalevy
Arduinon ohjelmointi24. syyskuuta 2016
39
Arduino UNO vs teensy 2.0
I Arduino UNO perustuu ATmega328P-piiriinI Teensy ATmega32U4-piiriin.I Piirissä on tuki USB:lle. Teensy voi esimerkiksi esittää
USB-näppäimistöäI Flash-muistia 32 kilotavua
I Teensyssä n. 32kBI 2 kilotavua SRAM-muistia
I Teensyssä n. 2,5kBI 1 kilotavu EEPROM-muistia
I Teensyssä 1kBI Käytännössä eroja siis on, mutta kumpikin ovat
"tyhmiä"mikrokontrolloreita
Arduinon ohjelmointi24. syyskuuta 2016
40
digitalWritehttps://www.arduino.cc/en/Tutorial/DigitalPins
I Asettaa pinnin arvon LOW tai HIGH.I LOW, "pois päältä"I HIGH, "päällä"
Esimerkiksi ledin vilkutus
void setup()
pinMode (13, OUTPUT);void loop()
digitalWrite (13, HIGH); //LED päällädelay (1000); //Odota sekuntidigitalWrite (13, LOW); //LED pois päältädelay (1000); //Odota sekunti
Arduinon ohjelmointi24. syyskuuta 2016
41
digitalRead
I Lukee pinnin tilanI LOW, pinni kytketty maahan (GND)I HIGH, pinni kytketty jännitteeseen. (3-5 volttia)
void setup()
pinMode(3, INPUT);
void loop()
int arvo = digitalRead (3);
Arduinon ohjelmointi24. syyskuuta 2016
42
Ylös-/Alasvetovastuksethttps://learn.sparkfun.com/tutorials/pull-up-resistors
I Mikäli pinniä ei ole kytketty mihinkään, sanotaan että sekelluu
I digitalRead palauttaa satunnaisesti HIGH tai LOWI Ratkaisuna alasvetovastus
I Kytketään pinni vastuksella (n. 10KΩ) GND:henI Pinnin arvo on nyt LOW kunnes se kytketään myös +5V:iin
I Ylösvetovastus lähes sama asia:I Kytketään pinni vastuksella (n. 10KΩ) +5V:iinI Pinnin arvo on nyt HIGH kunnes se kytketään myös
GND:iin
Arduinon ohjelmointi24. syyskuuta 2016
43
INPUT_PULLUPI Arduinosta löytyy sisäänrakennettuna ylösvetovastusI Aktivoidaan määrittämällä pinnin modeksi INPUT_PULLUPI Yksinkertainen nappula voidaan nyt kytkeä suoraan
GND:in ja halutun pinnin välille. Mitään ylimääräistävastusta ei tarvita kytkennässä!
void setup()
pinMode(3, INPUT_PULLUP);
void loop()
int nappula = digitalRead (3);
Arduinon ohjelmointi24. syyskuuta 2016
44
analogReadI analogReadilla voidaan lukea pinnin jänniteI Onnistuu vain pinneistä jotka on nimetty A0, A1...
I Kyseisten pinnien takana on 10-bittinenanalogidigitaalimuuntaja (AD)
I Arvo 0-5V väliltä saadaan lukuna väliltä 0-1023. (2,5V siisvastaisi lukua 512)
I Kyseisiä pinnejä voi käyttää myös digitaaliseen I/O:hon
void setup()
pinMode(A1 , INPUT);
void loop()
int arvo = analogRead(A1);
Arduinon ohjelmointi24. syyskuuta 2016
45
analogWriteI Arduinossa ei ole DA-muunninta→ analoginen ulostulo
pitää tehdä "keinotekoisesti"I PWM, eli Arduino kytkee pinniä nopeasti 0V ja 5V välillä.
(kanttiaalto)I "Teho"määräytyy kauanko pinniä pidetään HIGH- ja
kauanko LOW-tilassaI Esimerkiksi LEDien himmentämisessä ja normaalien
moottorien tehon säädössä riittäväI Vain tildellä (∼) merkittyjä pinnejä voi käyttää
void setup() pinMode(3, OUTPUT);
void loop() //Ledi palaa "puolella teholla"
analogWrite (3, 127);
Arduinon ohjelmointi24. syyskuuta 2016
46
Esimerkki: Monen ledin vilkutusBlinkkiesim.ino
Ongelma: Halutaan saada useampi kuin yksi ledi vilkkumaantietyllä taajuudella.
I Arduinon tutussa Blink-esimerkissä vilkutetaan yhtä lediäkytkemällä sitä päälle sekä pois, välissä odottaen sopivaaika.
I Odottelun aikana ei voida tehdä mitään muuta, eikäkahden ledin vilkuttaminen eri taajuuksilla ole tällä tavallamielekästä.
Arduinon ohjelmointi24. syyskuuta 2016
47
Esimerkki: Monen ledin vilkutus
Esimerkkiä varteen tarvitaan Arduino tai teensy jossa
I Pinniin 9 on kytketty etuvastuksen kanssa sarjaan lediI Pinniin 10 on kytketty etuvastuksen kanssa sarjaan ledi
Arduinon ohjelmointi24. syyskuuta 2016
48
Esimerkki: Monen ledin vilkutus
BlinkLed led1(10, 1000);BlinkLed led2(9, 500);
void setup()
void loop() led1.update ();led2.update ();
I BlinkLed on luokka josta luodaan oliot led1 ja led2.I led1 ja led2 sisältävät .update()-metodin jonka kutsuminen
pitää huolen että ledi on oikeassa tilassa
Arduinon ohjelmointi24. syyskuuta 2016
49
Luokka ja olio?
I Luokka kuvaa miten asia toimii.I Sillä on omia sisäisiä muuttujia.I Sillä on omia funktioita jotka vaikuttavat sen muuttujiin.I Esim. servo, näyttö, ihminen.
I Olio on luokan pohjalta luotu itsenäinen eliö.
Esimerkissämme on siis kaksi BlinkLed-tyyppistä oliota.I led1 on pinniin 10 kytketty ledi joka vilkkuu 1s sykleissä.I led2 on pinniin 9 kytketty ledi joka vilkkuu 0,5s sykleissä.
Arduinon ohjelmointi24. syyskuuta 2016
50
Esimerkki: Monen ledin vilkutus
class BlinkLed
public:BlinkLed(int pin , int blink_time);void setDelay(int blink_time);void update ();
private:int _pin; //Pin johon led on kytkettybool _state; //Onko ledi nyt päällä vai ei
int _blink_time; //Kauanko pidetään lediä päällä/poislong _last_cycle; //Milloin viimeksi tehtiin ledille jotakin
;
Arduinon ohjelmointi24. syyskuuta 2016
51
Public- ja private-lohkothttps://fi.wikipedia.org/wiki/Luokka_(ohjelmointi)
I Public-lohkon alla olevat asiat näkyvät ulkomaailmaan.I Tämän vuoksi esimerkin led1:n update()-funktiota voidaan
kutsua ohjelman pääloopissa.I Private-lohkon asioita voi käyttää luokan sisällä olevissa
funktioissa, mutta niitä ei voi käyttää ulkopuolella.I Esimerkiksi led1:n pinniä ei voi selvittää lukemalla
muuttujaa led1._pin.I Tapana on erottaa private muuttujat alaviivalla alkavalla
nimellä, mutta tämä ei ole pakollista.
Arduinon ohjelmointi24. syyskuuta 2016
52
Esimerkki: Monen ledin vilkutus
BlinkLed(int pin , int blink_time)
_pin = pin;_blink_time = blink_time;_state = LOW;
pinMode(_pin , OUTPUT);_last_cycle = millis ();
I Ns. konstruktori. Suoritetaan silloin kun luodaan uusi olio.I BlinkLed led1(10, 1000); käyttää tätä osaa luokasta.
Arduinon ohjelmointi24. syyskuuta 2016
53
Esimerkki: Monen ledin vilkutus
void setDelay(int blink_time)
_blink_time = blink_time;
I Public-blokissa oleva funktio joka muokkaaprivate-muuttujaa.
Arduinon ohjelmointi24. syyskuuta 2016
54
Esimerkki: Monen ledin vilkutushttps://www.arduino.cc/en/Reference/Millis
void update ()
if (millis ()-_last_cycle >= _blink_time)
_state = !_state;_last_cycle = millis ();
digitalWrite(_pin , _state);
I millis() – aika Arduinon käynnistymisestä millisekunteina.I Funktio tarvittaessa kääntää ledin päälle tai pois. Tämän
jälkeen voidaan odottamisen sijaan tehdä jotakin muuta.
Arduinon ohjelmointi24. syyskuuta 2016
55
Ohjelma laitteelle
Arduinon ohjelmointi24. syyskuuta 2016
56
Esimerkki: Monen ledin vilkutus
Jatketaan esimerkkiä hieman lisää.I Uusi ongelma ledin vilkkumisnopeutta halutaan muuttaa
lennosta.
Arduinon ohjelmointi24. syyskuuta 2016
57
Esimerkki: Monen ledin vilkutus
void setup() Serial.begin (9600);
void loop() led1.update ();led2.update ();
update_speeds ();
I setup-funktiossa alustetaan sarjaporttiyhteys.I pääloopissa kutsutaan yhtä uutta funktiota.
Arduinon ohjelmointi24. syyskuuta 2016
58
Esimerkki: Monen ledin vilkutus
void update_speeds ()
if (Serial.available ())
long new_delay = Serial.parseInt ();led2.setDelay(new_delay);
Serial.println("Set new delay for led2:"+String(new_delay));
I Nyt Arduinosta voi avata Serial monitorin ja lähettääArduinolle halutun viiveen numerona.
Arduinon ohjelmointi24. syyskuuta 2016
59
Serial monitorin avaaminen
Varmista että tools→ port on valittu oikein.
Arduinon ohjelmointi24. syyskuuta 2016
60
Serial monitor
Arduinon ohjelmointi24. syyskuuta 2016
61
Sarjaporttihttps://www.arduino.cc/en/Reference/Serial
I Arduino osaa USB:n kautta esittää sarjaporttiaI Helpoin tapa tietää mitä Arduinossa tapahtuuI Kun ohjelma ei toimi kuten sen pitäisi, kannattaa
sarjaporttiin tulostaa eri muuttujien arvoja ja tutkia niidenjärkevyyttä
I Tekstin tulostaminen ennen ja jälkeen jonkin ohjelmanosan auttaa selvittämään, jääkö ohjelma jumiin johonkinkohtaan.
I Huom! jos käytät sarjaporttia, pinnejä 0 ja 1 ei voi enääkäyttää muuhun!
Arduinon ohjelmointi24. syyskuuta 2016
62
Enum
enum OhjelmanTila kysyy_nimea ,sanoo_moi
;OhjelmanTila tila = kysyy_nimea;
void loop()
String nimi;
if (tila == kysyy_nimea)nimi = kysy_nimi ();
if (tila == sanoo_moi)sano_moi(nimi);
Arduinon ohjelmointi24. syyskuuta 2016
63
Vinkit ohjelmointiin: SisennysI Sisennetty koodi on helppolukuista sillä lohkot erottuvat
visuaalisesti toisistaanI Koodia saa sisennettyä painamalla tab-nappulaa kursorin
ollessa rivin alussa
void loop()String nimi;if (tila == tila1)nimi = kysy_nimi ();if (tila == tila2)sano_moi(nimi);
void loop()
String nimi;
if (tila == tila1)nimi = kysy_nimi ();
if (tila == tila2)sano_moi(nimi);
Arduinon ohjelmointi24. syyskuuta 2016
64
Vinkit ohjelmointiin: Manuaalien lukeminen
I Arduinon sivuilla hyvät on ohjeet useimpien funktioidenkäyttöön.
I Kannattaa aina lukea funktion manuaali kun käyttää sitäensimmäistä kertaa.
I Tiettyjen kirjastojen käyttäminen saattaa asettaa rajoituksiaesimerkiksi tiettyjen pinnien toimintaan.
I Myös komponenttien käyttöön löytyy hyviä ja huonojaohjeita Googlella.
Arduinon ohjelmointi24. syyskuuta 2016
65
Vinkit ohjelmointiin: Google
I Lähes kaikki kääntäjän ilmoittamat virheet googlautuvathyvin.
I Maailmassa on tehty paljon asioita jo ennestään: how to *with arduino/c
I Englannin kielellä parhaat hakutuloksetI Tällä pääsee yllättävän pitkälle kaikkeen ohjelmointiin
liittyvässä!
Arduinon ohjelmointi24. syyskuuta 2016
66
Ohjelman debuggaus: kumiankka
Arduinon ohjelmointi24. syyskuuta 2016
67
Linkkejä
I Arduinon oppaat ja esimerkitI https://www.arduino.cc/en/Tutorial/HomePage
I Arduinon kielen referenssiI https://www.arduino.cc/en/Reference/HomePage
I Atmega328P-piirin datasheet. Kertoo kaiken mitä kyseinenpiiri osaa, kannattaa lukea lähinnä mielenkiinnosta – opuson todella pitkä.
I http://www.atmel.com/images/atmel-8271-8-bit-avr-microcontroller-atmega48a-48pa-88a-88pa-168a-168pa-328-328p_datasheet_complete.pdf