66
Arduinon ohjelmointi Sami-Petteri Pukkila sami-petteri.pukkila@aalto.fi 1. helmikuuta 2016

Arduinon ohjelmointi - Aalto€¦ · Arduinon ohjelmointi 31. tammikuuta 2016 2 Ohjelman rakenne #include //Matemaattisia funktioita const int ledPin = 13; //Merkkivalo

  • Upload
    others

  • View
    3

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Arduinon ohjelmointi - Aalto€¦ · Arduinon ohjelmointi 31. tammikuuta 2016 2 Ohjelman rakenne #include  //Matemaattisia funktioita const int ledPin = 13; //Merkkivalo

Arduinon ohjelmointiSami-Petteri [email protected]

1. helmikuuta 2016

Page 2: Arduinon ohjelmointi - Aalto€¦ · Arduinon ohjelmointi 31. tammikuuta 2016 2 Ohjelman rakenne #include  //Matemaattisia funktioita const int ledPin = 13; //Merkkivalo

Arduinon ohjelmointi31. tammikuuta 2016

2

Ohjelman rakenne

#include <math . h> / / Matemaattisia funktioita

const i n t l edPin = 13; / / Merkkivaloi n t sensorPin = 4; / / Anturi bensatankissa

void setup ( ) / / Suoritetaan vain kerran alussa

/ / I/O-porttien alustuspinMode ( ledPin , OUTPUT) ;pinMode ( sensorPin , INPUT) ;

void loop ( ) / / Suoritetaan kerta toisensa perään

/ / analogRead palauttaa arvon välillä [0, 1023].i n t gasLevel = analogRead ( sensorPin ) ;i n t ledOn = gasLevel < 300; / / LED sytytetään kun tankki lähes tyhjäd i g i t a l W r i t e ( ledPin , ledOn ) ;

Page 3: Arduinon ohjelmointi - Aalto€¦ · Arduinon ohjelmointi 31. tammikuuta 2016 2 Ohjelman rakenne #include  //Matemaattisia funktioita const int ledPin = 13; //Merkkivalo

Arduinon ohjelmointi31. tammikuuta 2016

3

Funktiot

I "Maaginen laatikko"I Voi ottaa vastaan määrätyn tyyppisiä muuttujia (parametrit)I Tekee sisäisesti jotakinI Voi palauttaa määrätyn tyyppisen paluuarvon. (tai void, jos

ei mitään)

Page 4: Arduinon ohjelmointi - Aalto€¦ · Arduinon ohjelmointi 31. tammikuuta 2016 2 Ohjelman rakenne #include  //Matemaattisia funktioita const int ledPin = 13; //Merkkivalo

Arduinon ohjelmointi31. tammikuuta 2016

4

Funktiot

int laskeYhteen(int numero1 , int numero2)

return numero1 + numero2;

int a = laskeYhteen (1, 2); //a==3

I Parametrien muokkaus funktion sisällä ei vaikutaalkuperäisiin muuttujiin!

Page 5: Arduinon ohjelmointi - Aalto€¦ · Arduinon ohjelmointi 31. tammikuuta 2016 2 Ohjelman rakenne #include  //Matemaattisia funktioita const int ledPin = 13; //Merkkivalo

Arduinon ohjelmointi31. tammikuuta 2016

5

Muuttujat

I <tyyppi> <nimi> = <arvo>;I Jokainen muuttuja on jonkin tyyppinen (kokonaisluku,

kirjain, ...)I Vrt. esim Python, missä muuttujalla on vain nimi ja arvo

I Mikäli muuttujalle ei luomishetkellä anneta arvoa, se voiolla mitä tahansa

I int muuttuja;I Muuttujan arvon ei voida olettaa olevan nolla!

Page 6: Arduinon ohjelmointi - Aalto€¦ · Arduinon ohjelmointi 31. tammikuuta 2016 2 Ohjelman rakenne #include  //Matemaattisia funktioita const int ledPin = 13; //Merkkivalo

Arduinon ohjelmointi31. tammikuuta 2016

6

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

Page 7: Arduinon ohjelmointi - Aalto€¦ · Arduinon ohjelmointi 31. tammikuuta 2016 2 Ohjelman rakenne #include  //Matemaattisia funktioita const int ledPin = 13; //Merkkivalo

Arduinon ohjelmointi31. tammikuuta 2016

7

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

Page 8: Arduinon ohjelmointi - Aalto€¦ · Arduinon ohjelmointi 31. tammikuuta 2016 2 Ohjelman rakenne #include  //Matemaattisia funktioita const int ledPin = 13; //Merkkivalo

Arduinon ohjelmointi31. tammikuuta 2016

8

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

Page 9: Arduinon ohjelmointi - Aalto€¦ · Arduinon ohjelmointi 31. tammikuuta 2016 2 Ohjelman rakenne #include  //Matemaattisia funktioita const int ledPin = 13; //Merkkivalo

Arduinon ohjelmointi31. tammikuuta 2016

9

MuuttujatyyppejäI voidI boolean (0, 1, true, false)I char (’a’, -128, 127)I int (-32768 ... 32767)’I long (-2147483648 ... 2147483647)I unsigned char (0 .. 255)I byte (0 .. 255)I unsigned int (0 .. 65536)I word (0 .. 65536)I unsigned long (0 .. 4294967295)I float (-3.4028e+38 to 3.4028e+38)I double (toistaiseksi sama kuin float)I jne.

Page 10: Arduinon ohjelmointi - Aalto€¦ · Arduinon ohjelmointi 31. tammikuuta 2016 2 Ohjelman rakenne #include  //Matemaattisia funktioita const int ledPin = 13; //Merkkivalo

Arduinon ohjelmointi31. tammikuuta 2016

10

Muuttujatyypit

I Kokonaisluku (int, long) int muuttuja = -4;I Liukuluku (float, double) float muuttuja = 4.0;

I Arduinon tämän hetkisessä toteutuksessa float ja doublekäytännössä sama asia

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)I false = 0, true jotakin muuta

Page 11: Arduinon ohjelmointi - Aalto€¦ · Arduinon ohjelmointi 31. tammikuuta 2016 2 Ohjelman rakenne #include  //Matemaattisia funktioita const int ledPin = 13; //Merkkivalo

Arduinon ohjelmointi31. tammikuuta 2016

11

Muuttujatyypit

Lukuja voi merkata myös erilaisissa lukujärjestelmissä.Kannattaa myös huomata, että laskutoimituksissakin luvuilla onjokin tyyppi.

I 123 (kokonaisluku)I 0267 (oktaali)I 0b10100011 (binääri)I 0xA3 (heksadesimaali)I 7U (unsigned)I 11L (long)I 15UL (unsigned long)I 12.3 (liukuluku)I 3.4e3 (3.4 ∗ 103)

Page 12: Arduinon ohjelmointi - Aalto€¦ · Arduinon ohjelmointi 31. tammikuuta 2016 2 Ohjelman rakenne #include  //Matemaattisia funktioita const int ledPin = 13; //Merkkivalo

Arduinon ohjelmointi31. tammikuuta 2016

12

Muuttujatyypit

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 saattaa

aiheuttaa ongelmia (long→ int)

Page 13: Arduinon ohjelmointi - Aalto€¦ · Arduinon ohjelmointi 31. tammikuuta 2016 2 Ohjelman rakenne #include  //Matemaattisia funktioita const int ledPin = 13; //Merkkivalo

Arduinon ohjelmointi31. tammikuuta 2016

13

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

Page 14: Arduinon ohjelmointi - Aalto€¦ · Arduinon ohjelmointi 31. tammikuuta 2016 2 Ohjelman rakenne #include  //Matemaattisia funktioita const int ledPin = 13; //Merkkivalo

Arduinon ohjelmointi31. tammikuuta 2016

14

Mikä tyyppi pitäisi valita?

I Pienin mahdollinen joka sovellutukseen kelpaaI unsigned-etuliite, mikäli negatiivisia arvoja ei tarvita

I Enemmän tilaa "positiivisella"puolellaI const-etuliite, mikäli muuttujan arvoa ei tarvitse ohjelman

ajon aikana muuttaaI Esim kytkentäpinnien numerot

Page 15: Arduinon ohjelmointi - Aalto€¦ · Arduinon ohjelmointi 31. tammikuuta 2016 2 Ohjelman rakenne #include  //Matemaattisia funktioita const int ledPin = 13; //Merkkivalo

Arduinon ohjelmointi31. tammikuuta 2016

15

Tärkeimpiä operaattoreita

summa 1+2 3erotus 1-2 -1tulo 1*2 2osamäärä 1/2 0.5jakojäännös 5%3 2

Page 16: Arduinon ohjelmointi - Aalto€¦ · Arduinon ohjelmointi 31. tammikuuta 2016 2 Ohjelman rakenne #include  //Matemaattisia funktioita const int ledPin = 13; //Merkkivalo

Arduinon ohjelmointi31. tammikuuta 2016

16

Tärkeimpiä operaattoreita

I Muutama oikotie onneen muuttujien kanssa

summa a+=2 a = a+2erotus a-=2 a = a-2tulo a*=2 a = a*2osamäärä a/=2 a = a/2kasvata yhdellä a++ a = a+1vähennä yhdellä a−− a = a-1

Page 17: Arduinon ohjelmointi - Aalto€¦ · Arduinon ohjelmointi 31. tammikuuta 2016 2 Ohjelman rakenne #include  //Matemaattisia funktioita const int ledPin = 13; //Merkkivalo

Arduinon ohjelmointi31. tammikuuta 2016

17

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

Page 18: Arduinon ohjelmointi - Aalto€¦ · Arduinon ohjelmointi 31. tammikuuta 2016 2 Ohjelman rakenne #include  //Matemaattisia funktioita const int ledPin = 13; //Merkkivalo

Arduinon ohjelmointi31. tammikuuta 2016

18

Teksti

I C-kielessä ei 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 Kertoo apufunktioille merkkijonon loppukohdanI Kolmen merkin merkkijonon tallentamiseen tarvitaan siis

neljä merkkiä!

Page 19: Arduinon ohjelmointi - Aalto€¦ · Arduinon ohjelmointi 31. tammikuuta 2016 2 Ohjelman rakenne #include  //Matemaattisia funktioita const int ledPin = 13; //Merkkivalo

Arduinon ohjelmointi31. tammikuuta 2016

19

Merkkijonojen käsittely

Merkkijonojen käsittelyyn on olemassa apufunktioitaI strcpy

I Kopioi osa merkkijonosta toiseen merkkijonoonI strcat

I Yhdistä kaksi merkkijonoa toisiinsaI strcmp

I Vertaile kahta merkkijonoa toisiinsaI itoa ja atoi

I Muunna kokonaisluku merkkijonoksi tai toisin päin

Page 20: Arduinon ohjelmointi - Aalto€¦ · Arduinon ohjelmointi 31. tammikuuta 2016 2 Ohjelman rakenne #include  //Matemaattisia funktioita const int ledPin = 13; //Merkkivalo

Arduinon ohjelmointi31. tammikuuta 2016

20

Vaikeaa?

I Merkkijonojen käsittely hieman hankalaa C-kielessäI Apuun tulee Arduinon olento nimeltä StringI Kuluttaa kuitenkin muistia enemmän kuin c-tyyliset

merkkijonot – käytä vain jos on tarvetta

String merkkijono = "elaimiaon" + 3 + "kpl";// m e r k k i j o n o on nyt muotoa " elaimia on 3 kpl "

Page 21: Arduinon ohjelmointi - Aalto€¦ · Arduinon ohjelmointi 31. tammikuuta 2016 2 Ohjelman rakenne #include  //Matemaattisia funktioita const int ledPin = 13; //Merkkivalo

Arduinon ohjelmointi31. tammikuuta 2016

21

String muuntaminen

I Jotkut funktiot palauttavat tai vaativat c-tyylisiämerkkitaulukoita

I String kuitenkin vain piilottaa merkkitaulukon taakseen.→muuntaminen onnistuu

String koirateksti = "koira";koirateksti.c_str() // vastaa c-tyylistä merkkijonoa.

// Vain lukemiseen,// ei muokkaamiseen

char merkkijono [] = "kissa";String kissateksti = String(merkkijono);

Page 22: Arduinon ohjelmointi - Aalto€¦ · Arduinon ohjelmointi 31. tammikuuta 2016 2 Ohjelman rakenne #include  //Matemaattisia funktioita const int ledPin = 13; //Merkkivalo

Arduinon ohjelmointi31. tammikuuta 2016

22

Ehtolauseet

if (false)

// Tee jotakin jos ehto on tosielse

// Hyppää tänne jos ehto epätosi

Page 23: Arduinon ohjelmointi - Aalto€¦ · Arduinon ohjelmointi 31. tammikuuta 2016 2 Ohjelman rakenne #include  //Matemaattisia funktioita const int ledPin = 13; //Merkkivalo

Arduinon ohjelmointi31. tammikuuta 2016

23

Ehtolauseet

I Mikäli ehto on tosi, suoritetaan kyseessä oleva lohko

// Tässä ehto ei ole tosi, eli lohkoa ei suoriteta// vaan siirrytään eteenpäinif (false)

// Tee jotakin jos ehto on tosi

Page 24: Arduinon ohjelmointi - Aalto€¦ · Arduinon ohjelmointi 31. tammikuuta 2016 2 Ohjelman rakenne #include  //Matemaattisia funktioita const int ledPin = 13; //Merkkivalo

Arduinon ohjelmointi31. tammikuuta 2016

24

EhtolauseetI Mikäli lohkoa ei suoritettu, suoritetaan else-lohko.

I tai ei mitään, jos else-lohkoa ei ole

// Tässä ehto ei ole tosi, eli lohkoa ei suoriteta// vaan siirrytään eteenpäinif (false)

// Tee jotakin jos ehto on tosielse

// Tämä lohko suoritetaan, koska edellisen// lohkon ehto oli epätosi

Page 25: Arduinon ohjelmointi - Aalto€¦ · Arduinon ohjelmointi 31. tammikuuta 2016 2 Ohjelman rakenne #include  //Matemaattisia funktioita const int ledPin = 13; //Merkkivalo

Arduinon ohjelmointi31. tammikuuta 2016

25

Näitä voi myös yhdistää

boolean kissat_kivoja = false;boolean linnut_kivoja = false;

if (linnut_kivoja)

//Eivät ole, eli tänne ei päädytäelse if (kissat_kivoja) //epätosi

//Eivät ole, eli tännekään ei päädytäelse

//Päädytään siis tänne

Page 26: Arduinon ohjelmointi - Aalto€¦ · Arduinon ohjelmointi 31. tammikuuta 2016 2 Ohjelman rakenne #include  //Matemaattisia funktioita const int ledPin = 13; //Merkkivalo

Arduinon ohjelmointi31. tammikuuta 2016

26

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 true jos ehto täyttyyI false (0) jos ehto ei täyty

Page 27: Arduinon ohjelmointi - Aalto€¦ · Arduinon ohjelmointi 31. tammikuuta 2016 2 Ohjelman rakenne #include  //Matemaattisia funktioita const int ledPin = 13; //Merkkivalo

Arduinon ohjelmointi31. tammikuuta 2016

27

IF-lauseissa on jo jotain järkeä

int kissat = 2;int koirat = 3;

if (koirat < kissat) //epätosi

//koirat ovat huonompia kuin kissatelse

//koirat ovat parempia kuin kissat

Page 28: Arduinon ohjelmointi - Aalto€¦ · Arduinon ohjelmointi 31. tammikuuta 2016 2 Ohjelman rakenne #include  //Matemaattisia funktioita const int ledPin = 13; //Merkkivalo

Arduinon ohjelmointi31. tammikuuta 2016

28

Totuuksien yhdistäminen

Mitä jos halutaankin tutkia, ovatko koirat parempia kuin kissatJA ovatko linnut huonompia kuin kissat

Page 29: Arduinon ohjelmointi - Aalto€¦ · Arduinon ohjelmointi 31. tammikuuta 2016 2 Ohjelman rakenne #include  //Matemaattisia funktioita const int ledPin = 13; //Merkkivalo

Arduinon ohjelmointi31. tammikuuta 2016

29

Boolen logiikka

a && b a ja b molemmat tosia (and)a || b a tai b on tosi (or)!a a on epätosi (not)I true jos ehto toteutuu, muuten false

Page 30: Arduinon ohjelmointi - Aalto€¦ · Arduinon ohjelmointi 31. tammikuuta 2016 2 Ohjelman rakenne #include  //Matemaattisia funktioita const int ledPin = 13; //Merkkivalo

Arduinon ohjelmointi31. tammikuuta 2016

30

Boolen logiikka

IF-lauseessa voi käyttää sulkuja kuten matematiikassa

int linnut = 1;int kissat = 2;int koirat = 3;

if ( (koirat > kissat) && (linnut < kissat) )

//koirat ovat parempia kuin kissat//ja//linnut ovat huonompia kuin kissat

Page 31: Arduinon ohjelmointi - Aalto€¦ · Arduinon ohjelmointi 31. tammikuuta 2016 2 Ohjelman rakenne #include  //Matemaattisia funktioita const int ledPin = 13; //Merkkivalo

Arduinon ohjelmointi31. tammikuuta 2016

31

Boolen logiikka

int linnut = 1;int kissat = 2;int koirat = 3;

if ( true && true )

//koirat ovat parempia kuin kissat//ja//linnut ovat huonompia kuin kissat

Page 32: Arduinon ohjelmointi - Aalto€¦ · Arduinon ohjelmointi 31. tammikuuta 2016 2 Ohjelman rakenne #include  //Matemaattisia funktioita const int ledPin = 13; //Merkkivalo

Arduinon ohjelmointi31. tammikuuta 2016

32

Boolen logiikka

int linnut = 1;int kissat = 2;int koirat = 3;

if ( true )

//koirat ovat parempia kuin kissat//ja//linnut ovat huonompia kuin kissat

Page 33: Arduinon ohjelmointi - Aalto€¦ · Arduinon ohjelmointi 31. tammikuuta 2016 2 Ohjelman rakenne #include  //Matemaattisia funktioita const int ledPin = 13; //Merkkivalo

Arduinon ohjelmointi31. tammikuuta 2016

33

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 ==-operaattoreilla

Page 34: Arduinon ohjelmointi - Aalto€¦ · Arduinon ohjelmointi 31. tammikuuta 2016 2 Ohjelman rakenne #include  //Matemaattisia funktioita const int ledPin = 13; //Merkkivalo

Arduinon ohjelmointi31. tammikuuta 2016

34

Silmukat

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.

Page 35: Arduinon ohjelmointi - Aalto€¦ · Arduinon ohjelmointi 31. tammikuuta 2016 2 Ohjelman rakenne #include  //Matemaattisia funktioita const int ledPin = 13; //Merkkivalo

Arduinon ohjelmointi31. tammikuuta 2016

35

While

while (ehto)

//Tee jotakin niin kauan kuin ehto//on tosi

Page 36: Arduinon ohjelmointi - Aalto€¦ · Arduinon ohjelmointi 31. tammikuuta 2016 2 Ohjelman rakenne #include  //Matemaattisia funktioita const int ledPin = 13; //Merkkivalo

Arduinon ohjelmointi31. tammikuuta 2016

36

For

for (alkuarvo; ehto; askel)

//Tee jotakin niin kauan kuin ehto//on tosi

Page 37: Arduinon ohjelmointi - Aalto€¦ · Arduinon ohjelmointi 31. tammikuuta 2016 2 Ohjelman rakenne #include  //Matemaattisia funktioita const int ledPin = 13; //Merkkivalo

Arduinon ohjelmointi31. tammikuuta 2016

37

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);

Page 38: Arduinon ohjelmointi - Aalto€¦ · Arduinon ohjelmointi 31. tammikuuta 2016 2 Ohjelman rakenne #include  //Matemaattisia funktioita const int ledPin = 13; //Merkkivalo

Arduinon ohjelmointi31. tammikuuta 2016

38

For vs while

I Oikeastaan for-silmukan voi ajatella hienompana versionawhile-silmukasta

I alkuarvo on vain lause joka ajetaan ennen while-silmukkaaI ehto on while-silmukan ehtoI askel on lause joka sijoitetaan viimeiseksi while-silmukan

sisälle.

Page 39: Arduinon ohjelmointi - Aalto€¦ · Arduinon ohjelmointi 31. tammikuuta 2016 2 Ohjelman rakenne #include  //Matemaattisia funktioita const int ledPin = 13; //Merkkivalo

Arduinon ohjelmointi31. tammikuuta 2016

39

For vs while

int ledpin [3] = 3, 5, 6;

void setup()

int i=0;while (i<3)

pinMode(ledpin[i], OUTPUT);

i++;

Page 40: Arduinon ohjelmointi - Aalto€¦ · Arduinon ohjelmointi 31. tammikuuta 2016 2 Ohjelman rakenne #include  //Matemaattisia funktioita const int ledPin = 13; //Merkkivalo

Arduinon ohjelmointi31. tammikuuta 2016

40

Break ja continue

I Silmukoiden kulkuun voidaan vaikuttaa myös kahdellakomennolla:

I breakI Lopeta silmukan suoritus heti ja siirry siitä ulos

I continueI Hyppää takaisin silmukan alkuun.I For-silmukassa kuitenkin suoritetaan askel-vaihe. Täten

vertaus whileen ei ole aivan täysin toimiva.

Page 41: Arduinon ohjelmointi - Aalto€¦ · Arduinon ohjelmointi 31. tammikuuta 2016 2 Ohjelman rakenne #include  //Matemaattisia funktioita const int ledPin = 13; //Merkkivalo

Arduinon ohjelmointi31. tammikuuta 2016

41

Break ja continue

int i=0;

while (true)

Serial.println(i);

i++;if (i < 3)

continue;break;

Page 42: Arduinon ohjelmointi - Aalto€¦ · Arduinon ohjelmointi 31. tammikuuta 2016 2 Ohjelman rakenne #include  //Matemaattisia funktioita const int ledPin = 13; //Merkkivalo

Arduinon ohjelmointi31. tammikuuta 2016

42

Arduinon 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

I Arduinon kirjastot piilottavat AVR-C:n paljon helpompaanmuotoon.

Page 43: Arduinon ohjelmointi - Aalto€¦ · Arduinon ohjelmointi 31. tammikuuta 2016 2 Ohjelman rakenne #include  //Matemaattisia funktioita const int ledPin = 13; //Merkkivalo

Arduinon ohjelmointi31. tammikuuta 2016

43

Arduino

Page 44: Arduinon ohjelmointi - Aalto€¦ · Arduinon ohjelmointi 31. tammikuuta 2016 2 Ohjelman rakenne #include  //Matemaattisia funktioita const int ledPin = 13; //Merkkivalo

Arduinon ohjelmointi31. tammikuuta 2016

44

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()

byte arvo = digitalRead (3);

Page 45: Arduinon ohjelmointi - Aalto€¦ · Arduinon ohjelmointi 31. tammikuuta 2016 2 Ohjelman rakenne #include  //Matemaattisia funktioita const int ledPin = 13; //Merkkivalo

Arduinon ohjelmointi31. tammikuuta 2016

45

Ylös-/Alasvetovastukset

I Mikäli pinniä ei ole kytketty mihinkään, sanotaan että sekelluu

I digitalWrite 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

Page 46: Arduinon ohjelmointi - Aalto€¦ · Arduinon ohjelmointi 31. tammikuuta 2016 2 Ohjelman rakenne #include  //Matemaattisia funktioita const int ledPin = 13; //Merkkivalo

Arduinon ohjelmointi31. tammikuuta 2016

46

INPUT_PULLUP

I Arduinosta löytyy sisäänrakennettuna ylösvetovastusI Aktivoidaan määrittämällä pinnin modeksi INPUT_PULLUP

void setup()

pinMode(3, INPUT_PULLUP);

void loop()

byte arvo = digitalRead (3);

Page 47: Arduinon ohjelmointi - Aalto€¦ · Arduinon ohjelmointi 31. tammikuuta 2016 2 Ohjelman rakenne #include  //Matemaattisia funktioita const int ledPin = 13; //Merkkivalo

Arduinon ohjelmointi31. tammikuuta 2016

47

digitalWriteI 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

Page 48: Arduinon ohjelmointi - Aalto€¦ · Arduinon ohjelmointi 31. tammikuuta 2016 2 Ohjelman rakenne #include  //Matemaattisia funktioita const int ledPin = 13; //Merkkivalo

Arduinon ohjelmointi31. tammikuuta 2016

48

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 siis lukuna väliltä 0-1023. (2,5Vsiis vastaisi lukua 512)

I (Kyseisiä pinnejä voi käyttää myös digitaaliseen I/O:hon)

void setup ( )

pinMode (A1 , INPUT) ;

void loop ( )

i n t arvo = analogRead (A1) ;

Page 49: Arduinon ohjelmointi - Aalto€¦ · Arduinon ohjelmointi 31. tammikuuta 2016 2 Ohjelman rakenne #include  //Matemaattisia funktioita const int ledPin = 13; //Merkkivalo

Arduinon ohjelmointi31. tammikuuta 2016

49

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);

Page 50: Arduinon ohjelmointi - Aalto€¦ · Arduinon ohjelmointi 31. tammikuuta 2016 2 Ohjelman rakenne #include  //Matemaattisia funktioita const int ledPin = 13; //Merkkivalo

Arduinon ohjelmointi31. tammikuuta 2016

50

Muut

I millis()I aika Arduinon käynnistyksestä millisekunneissa

I map()I muuttujan arvovälin muuntaminen toiselle välilleI esim. [0, 1023]→ [0, 256]

I min(), max(), abs(), sin(), cos()...I random()

I satunnaislukujaI Servo

I kirjasto Servomoottorin liikutteluunI ...

Page 51: Arduinon ohjelmointi - Aalto€¦ · Arduinon ohjelmointi 31. tammikuuta 2016 2 Ohjelman rakenne #include  //Matemaattisia funktioita const int ledPin = 13; //Merkkivalo

Arduinon ohjelmointi31. tammikuuta 2016

51

Arduino IDE

I Kaikki Arduinon ohjelmointiin tarvittavaI KoodieditoriI KääntäjäI Koodin lataus ArduinolleI Sarjaportin kuuntelu

Page 52: Arduinon ohjelmointi - Aalto€¦ · Arduinon ohjelmointi 31. tammikuuta 2016 2 Ohjelman rakenne #include  //Matemaattisia funktioita const int ledPin = 13; //Merkkivalo

Arduinon ohjelmointi31. tammikuuta 2016

52

Ohjelma laitteelle

Page 53: Arduinon ohjelmointi - Aalto€¦ · Arduinon ohjelmointi 31. tammikuuta 2016 2 Ohjelman rakenne #include  //Matemaattisia funktioita const int ledPin = 13; //Merkkivalo

Arduinon ohjelmointi31. tammikuuta 2016

53

Muistin loppuminen

I Mikäli itse ohjelmakoodi on liian iso, saat virheviestinI Mikäli jossakin kohtaa käyttömuisti loppuu, todennäköisesti

vain tapahtuu kummallisia asioita. (laite ei toimi kutenpitää, tai ei toimi lainkaan, ...)

I Vältä globaaleja muuttujiaI Helpointa rajoitukseen on törmätä säilömällä iso määrä

tekstinpätkiäI Esimerkiksi LCD-näytön käyttöliittymän tekstit voisivat olla

ongelmaI PROGMEM. Tallenna data flash-muistiin.I Pienissä projekteissa tuskin tulee kuitenkaan vastaan

Page 54: Arduinon ohjelmointi - Aalto€¦ · Arduinon ohjelmointi 31. tammikuuta 2016 2 Ohjelman rakenne #include  //Matemaattisia funktioita const int ledPin = 13; //Merkkivalo

Arduinon ohjelmointi31. tammikuuta 2016

54

Ohjelman debuggaus: sarjaportti

I Arduino osaa USB:n kautta emuloida sarjaporttiaI Helpoin tapa tietää mitä Arduinossa tapahtuuI Kun ohjelma ei toimi kuten sen pitäisi, kannattaa

sarjaporttiin tulostaa eri muuttujien arvoja ja tutkia, ettäovatko lukemat järkeviä

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!

Page 55: Arduinon ohjelmointi - Aalto€¦ · Arduinon ohjelmointi 31. tammikuuta 2016 2 Ohjelman rakenne #include  //Matemaattisia funktioita const int ledPin = 13; //Merkkivalo

Arduinon ohjelmointi31. tammikuuta 2016

55

Ohjelman debuggaus: sarjaportti

int nappi = 3;

void setup() Serial.begin (9600);pinMode(nappi , INPUT);

void loop() byte napinTila = digitalRead(nappi);Serial.println(napinTila);delay (1);

Page 56: Arduinon ohjelmointi - Aalto€¦ · Arduinon ohjelmointi 31. tammikuuta 2016 2 Ohjelman rakenne #include  //Matemaattisia funktioita const int ledPin = 13; //Merkkivalo

Arduinon ohjelmointi31. tammikuuta 2016

56

Ohjelman debuggaus: sarjaportti

Page 57: Arduinon ohjelmointi - Aalto€¦ · Arduinon ohjelmointi 31. tammikuuta 2016 2 Ohjelman rakenne #include  //Matemaattisia funktioita const int ledPin = 13; //Merkkivalo

Arduinon ohjelmointi31. tammikuuta 2016

57

Ohjelman debuggaus: sarjaportti

Page 58: Arduinon ohjelmointi - Aalto€¦ · Arduinon ohjelmointi 31. tammikuuta 2016 2 Ohjelman rakenne #include  //Matemaattisia funktioita const int ledPin = 13; //Merkkivalo

Arduinon ohjelmointi31. tammikuuta 2016

58

Ohjelman debuggaus: kumiankka

Page 59: Arduinon ohjelmointi - Aalto€¦ · Arduinon ohjelmointi 31. tammikuuta 2016 2 Ohjelman rakenne #include  //Matemaattisia funktioita const int ledPin = 13; //Merkkivalo

Arduinon ohjelmointi31. tammikuuta 2016

59

Vinkit ohjelmointiin: funktiot

I Yksi toiminto, yksi funktioI Yksi ongelma, monta "aliongelmaa"I Voi käyttää myös ryhmän työnjakoon

EsimerkiksiI Ongelma: Aja robotti pisteeseen x

I Missä ollaan nytI Miten pisteeseen x pääseeI Miten robotin saa liikkumaan

Page 60: Arduinon ohjelmointi - Aalto€¦ · Arduinon ohjelmointi 31. tammikuuta 2016 2 Ohjelman rakenne #include  //Matemaattisia funktioita const int ledPin = 13; //Merkkivalo

Arduinon ohjelmointi31. tammikuuta 2016

60

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);

Page 61: Arduinon ohjelmointi - Aalto€¦ · Arduinon ohjelmointi 31. tammikuuta 2016 2 Ohjelman rakenne #include  //Matemaattisia funktioita const int ledPin = 13; //Merkkivalo

Arduinon ohjelmointi31. tammikuuta 2016

61

Vinkit ohjelmointiin: SisennysI Joissakin kielissä (Python) sisennyksellä on väliä ohjelman

toiminnan kannalta – Arduinon kielessä ei.I Sisentämällä koodi kuitenkin on paljon helpompilukuista ja

virheet helpompia huomata

//Ei siis näin. Hankala lukea ja helppo laittaa//kaarisulkuja vääriin paikkoihinvoid loop()if (anturi > raja)sulje_venttiili1 ();sulje_venttiili2 ();

Page 62: Arduinon ohjelmointi - Aalto€¦ · Arduinon ohjelmointi 31. tammikuuta 2016 2 Ohjelman rakenne #include  //Matemaattisia funktioita const int ledPin = 13; //Merkkivalo

Arduinon ohjelmointi31. tammikuuta 2016

62

Vinkit ohjelmointiin: Manuaalien lukeminen

I Arduinon sivuilla hyvät ohjeet useimpien funktioidenkäyttöön

I Kertovat yleensä myös missä mitäkin kannattaa käyttää jamilloin mennään metsään

I Muista että useimmat asiat toimivat C:ssä samalla tavallaI Joihinkin osiin löytyy hyviä ja helppoja oppaita, joihinkin

hieman teknisiä ja joihinkin huonosti mitäänI Google yleensä osaa auttaa kun kirjoittaa ongelman

englanniksi ja osien tapauksessa liittää tunnistekoodin

Page 63: Arduinon ohjelmointi - Aalto€¦ · Arduinon ohjelmointi 31. tammikuuta 2016 2 Ohjelman rakenne #include  //Matemaattisia funktioita const int ledPin = 13; //Merkkivalo

Arduinon ohjelmointi31. tammikuuta 2016

63

Vinkit ohjelmointiin: Google

I Lähes kaikki kääntäjän ilmoittamat virheet googlautuvathyvin.

I Maailmassa tehty paljon asioita jo ennestään: how to * witharduino/c

I Englannin kielellä parhaat hakutuloksetI Ehkä tärkeimpiä asioita oppia!

Page 64: Arduinon ohjelmointi - Aalto€¦ · Arduinon ohjelmointi 31. tammikuuta 2016 2 Ohjelman rakenne #include  //Matemaattisia funktioita const int ledPin = 13; //Merkkivalo

Arduinon ohjelmointi31. tammikuuta 2016

64

Versionhallinta

I "Tää toimi vielä eilen, mut sit tein jotakin ja nyt mikään eienää toimi"

I Helpottaa kun useampi ihminen haluaa koodata samaaprojektia

I GitI Githubin student-ohjelmassa saa muutaman privarepon

ilmaiseksi

Page 65: Arduinon ohjelmointi - Aalto€¦ · Arduinon ohjelmointi 31. tammikuuta 2016 2 Ohjelman rakenne #include  //Matemaattisia funktioita const int ledPin = 13; //Merkkivalo

Arduinon ohjelmointi31. tammikuuta 2016

65

Arduinon tekstieditori

I Arduinon asetuksista voi valita käyttöön ulkopuolisentekstieditorin jos kokee tarpeelliseksi. Kääntäminen jaupload toimivat edelleen ohjelman kautta.

I Inotool jos pitää komentorivistä

Page 66: Arduinon ohjelmointi - Aalto€¦ · Arduinon ohjelmointi 31. tammikuuta 2016 2 Ohjelman rakenne #include  //Matemaattisia funktioita const int ledPin = 13; //Merkkivalo

Arduinon ohjelmointi31. tammikuuta 2016

66

Linkkejä

I https://www.arduino.cc/en/Tutorial/HomePageI https://www.arduino.cc/en/Reference/HomePageI http://cslibrary.stanford.edu/101/EssentialC.pdfI https://github.com/liffiton/Arduino-Cheat-SheetI http://tronixstuff.com/I http://www.asciitable.com/I http://www.atmel.com/images/

atmel-8271-8-bit-avr-microcontroller-atmega48a-48pa-88a-88pa-168a-168pa-328-328p_datasheet_complete.pdf