4. Apua koodaamiseen & harjoitustehtäviä - matpi/EmbeddedSystemsUTU GitHub Wiki
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
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ä.
Jos tuntuu vaikealta lähteä tekemään suoraan koodia, ohjelman kulku kannattaa muotoilla ensin vuokaavioksi, jossa kuvataan ohjelman eri vaiheet:
###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;
}
}