arduinon ohjelmointi - mycourses · arduinon ohjelmointi 24. syyskuuta 2016 17 globaali vs lokaali...

Post on 19-Oct-2018

222 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Arduinon ohjelmointiSami-Petteri Pukkilasami-petteri.pukkila@aalto.fi

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

top related