4. Apua koodaamiseen & harjoitustehtäviä - matpi/EmbeddedSystemsUTU GitHub Wiki

Arduino koodauksen alkeita

Arduinojen koodaaminen saattaa välillä tuntua työläältä ja monimutkaiselta. Koodaamisen ongelmiin löytyy apua mm. Johtokasasta kurssityöksi materiaalista (Karp & Pellinen 2015) http://arduino.karp.pw/ Tämä opas löytyy myös wikin issue osastolta: https://github.com/matpi/EmbeddedSystemsUTU/issues/29

Muita suomenkielisiä Arduino koodauksen alkeita käsitteleviä www-sivuja

kotkamaa hacklabissa on esitelty lyhyesti muutamia perusasoita Arduino-ohjelmoinnista:

https://sites.google.com/site/kotkamaahacklab/alkuun-arduinolla

hutasu.net esittelee muiden mikrokontrollerialustojen ja niiden ohjelmoinnin lisäksi myös Arduino järjestelmää ja ohjelmointia:

http://www.hutasu.net/index.php?sivu_id=131

Seuraavassa kaaviossa esitellään arduino-ohjelman osat. Ohjelman osien tunnistaminen auttaa koodin jäsentämisessä.

Code model

Jos tuntuu vaikealta lähteä tekemään suoraan koodia, ohjelman kulku kannattaa muotoilla ensin vuokaavioksi, jossa kuvataan ohjelman eri vaiheet:

Code model

###Tehtävä 1. a) ympyröi setup-osio b)neliöi pääohjelma c) piirrä sydän funktioiden ympärille d) yliviivaa kommentit e) selitä muutamalla sanalla mitä kukin ohjelman osa tarkoittaa f) alleviivaa muuttujat

#include <LiquidCrystal.h>  // include the library code:

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);  // initialize the library with the numbers of the interface pins

int potpin = 0;  // analog pin used to connect the potentiometer

int val = 0;    // variable to read the value from the analog pin 

int led = 13;  //variable to store number of pin for led


void setup() 

{ 

lcd.begin(16, 2);   // set up the LCD's number of columns and rows: 

lcd.print("hello, world!");  // Print a message to the LCD.

pinMode(led, OUTPUT);  // initialize the digital pin as an output.

}

void loop()

{  

val = analogRead(potpin);  // reads the value of the potentiometer (value between 0 and 1023) 

doop(); // "visit" the function doop

  if(val < 500) // If value stored in val is smaller than 500 then go to function that flashes led.
  
  { 

  valot(); // "visit" the function valot 

  }

}

void valot()

{

digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
delay(1000);               // wait for a second
digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
delay(1000);               // wait for a second

}

void doop()

{
lcd.setCursor(0, 1);      // set the cursor to column 0, line 1 (note: line 1 is the second row, since 

counting begins with 0):

lcd.print(val);  // print the value stored to val:

}

###Tehtävä 2. Etsi virheet koodeista ja korjaa (1 virhe per koodi)

###a) int led = 13;

void setup()

{                

Serial.begin(9600); 

}

void loop()

{

Serial.println(”Kukkuu!”;

digitalWrite(led, HIGH); 

delay(1000); 
          
digitalWrite(led, LOW); 

delay(1000);  
        
}

###b)

const int ledPin =  13;    

int ledState = LOW; 
        
long previousMillis = 0;        

long interval = 1000;          

void setup()

{

pinMode(ledPin, OUTPUT); 
 
}

void loop()

{

unsigned long currentMillis = millis();

if(currentMillis - previousMillis > interval)

{

previousMillis = currentMillis;   

	if (ledState == LOW)

 	ledState = HIGH;

else

	ledState = LOW;

	digitalWrite(ledPin, ledState);

}

###Tehtävä 3. Kauanko pää-ohjelman yksi kierros kestää, kun muuttuja ”int val” saa arvokseen

###a) 100

###b) 500

###c) 1000

Huomioon ei tarvitse ottaa komentoihin kuluvaa aikaa, vain delayt.

int val = 0;

int led = 13;

int laskuri = 0;

void setup() 

{ 

pinMode(led,OUTPUT);  

}

void loop() 

{

    if (val < 500)

    {

    delay(500);

    }
   
    if(val == 500)

    {

    digitalWrite(led, HIGH); 

    delay(val);  
         
    digitalWrite(led, LOW); 

    delay(val*2); 

    }  
    
    if (val > 500)

    {

    delay(1000);

    }

}

###Tehtävä 4. Kauanko pää-ohjelman yksi kierros kestää, kun muuttuja ”int val” saa arvokseen

###a) 50

###b) 700

int val = 0;

int laskuri = 0;

void setup() 

{ 

}

void loop() 

{

   if (val < 500)

   {

   delay(1000) ;

   }

   else

   {

   delay(2000);

   }

while (laskuri <6)

{

delay(500);

laskuri++;	//sama kuin ”laskuri = laskuri+1;

}

laskuri = 0;

}

###Tehtävä 5. Yhdistä alla olevaan koodiin tehtävän yksi koodi siten, että saat aikaan ohjelman, joka tulostaa lcd-näytölle potentiometrilta luettavia arvoja ja muuttaa servon asentoa arvojen mukaan. Poista myös yhdistetystä koodista edellä kuvatun tehtävän kannalta turhat osat.

#include <Servo.h> 

Servo myservo;  // create servo object to control a servo 

int potpin = 0;  // analog pin used to connect the potentiometer

int val;    // variable to read the value from the analog pin 

void setup() 

{ 

myservo.attach(9);  // attaches the servo on pin 9 to the servo object 

} 

void loop() 

{ 

val = analogRead(potpin);      // reads the value of the potentiometer (value between 0 and 1023) 

val = map(val, 0, 1023, 0, 179);     // scale it to use it with the servo (value between 0 and 180) 

myservo.write(val);       // sets the servo position according to the scaled value 

delay(15);      // waits for the servo to get there 

} 

####Viimeinen tehtävä: Aivopähkinä. Arduinon pinneihin 2-5 on kytketty ledit. Mitä alla oleva koodi tekee? Käytä Arduino referenceä hyväksi jos % operaattori on tuntematon sinulle.

int i = 0;

void setup()

{

pinMode(2, OUTPUT);

pinMode(3, OUTPUT);

pinMode(4, OUTPUT);

pinMode(5, OUTPUT);

}

void loop()

{

digitalWrite(i+2), HIGH);

delay(100);

digitalWrite(i+2), LOW);

i =   (i + 1) % 4;

}

Koodiesimerkki, jossa luetaan kytkintä sekä sytytetään ja sammutetaan lediä. Koodi toimii yhtä hyvin millä tahansa sensorilla ja aktuaattorilla.

const int nappiPin = 2;     // the number of the pushbutton pin
const int lediPin =  13;      // the number of the LED pin
int nappiTila = 0; 
boolean lediTila = false;         

void setup() {

pinMode(lediPin, OUTPUT);
pinMode(nappiPin, INPUT);
}



void loop() {

nappiTila = digitalRead(nappiPin);
delay(50); // napin värähtelyt pois


//tähän if lauseeseen mennään vain jos nappi on päällä ja ledi on sammuksissa
if (nappiTila == HIGH && lediTila == false)
{
// turn LED on:
digitalWrite(lediPin, HIGH);
lediTila = true;
}

// tähän if lauseeseen mennään vain jos kytkin on pois ja ledi on päällä
if ( nappiTila == LOW && lediTila == true)
{
// turn LED off:
digitalWrite(lediPin, LOW);
lediTila = false;
}

}
⚠️ **GitHub.com Fallback** ⚠️