Kommentarer:
Kommentering av programkoden er både nyttig og nødvendig. I C og C++ har vi to måter å lage kommentarer på.
I starten av programmet har vi en kommentar som går over flere linjer. (Markert med grønn skrift) Slike kommentarer starter med /* (skråstrek+stjerne) og avsluttes med */ (stjerne+skråstrek)
Det som er mest brukt er kommentarer på en linje, disse lages med dobbel skråstrek - // Når vi skriver dobbel skråstrek betyr det at resten av linja er kommentar (fram til linjeskift). Her er slike kommentarer markert med rød skrift.
|
|
Preprocessor
Linjen i toppen, som starter med # kalles for «compiler preprocessor directives».
Det betyr at deg ikke egentlig er C-kode, men beskjeder til kompilatoren om hva den skal gjøre.
«#define» angir bl.a. konstanter som brukes i programmet. Her sier vi at hver gang vi bruker ordet LED skal det erstattes med tallet 13 (pinne nr 13)
«#include» gir kompilatoren beskjed om hvilke andre filer som hører til programmet, enten filer som vi har laget selv, eller ferdige programbiblioteker. Foreløpig har vi ingen, men det kan f.eks. være wire.h, som brukes til I2C-kommunikasjon, eller LiquidCrystal.h som er et bibliotek for LCD-paneler.
Mange standard-biblioteker kan finnes under menyen Skisse -> Inkluder bibliotek
|
|
Funksjonen setup:
I Setup-funksjonen, merket med rød tekst, gjøres oppsettet av mikrokontrolleren, som f.eks. oppsett av hvilke pinner som brukes som utganger, og hvilke som brukes som innganger. Foreløpig har vi satt opp én pinne som utgang, og vi har gitt denne pinne «aliaset» eller navnet LED.
Konseptet med funksjoner ser vi på senere, men vi kan nevne at funksjoner inneholder en kodeblokk, som kort og godt er en eller flere linjer kode som hører sammen.
Vi ser at starten på en kodeblokk er markert med { - venstre klammeparantes eller curly-brace på engelsk. Slutten på kodeblokka markeres med } – høyre klammeparantes.
Som vi ser har vi to funksjoner i programmet vårt, setup og loop, med hver sin kodeblokk. Loop kommer tilbake til snart. (Neste fane)
|
|
Funksjonen loop:
Uendelig løkke: Når vi jobber med mikrokontrollere, har vi i 99,9% av tilfellene behov for en uendelig løkke (loop). I motsetning til programmer som kjører på vanlige datamaskiner, vil vi som oftest aldri at programmet skal avsluttes. Det skal bare kjøre og kjøre til mikrokontrolleren enten får et reset-signal, eller mister spenningen.
Når vi jobber med Arduino er det loop-funksjonen som er denne uendelige løkken. Her har jeg markert funksjonen og tilhørende start- og stopp-klammer med rød skrift. For hver runde i løkken kjøres de fire kodelinjene i midten.
I et vanlig C- eller C++-program ville dette være en uendelig while-løkke. Alle while-løkker har en logisk test, omsluttet av parenteser. For å lage en uendelig løkke setter vi inn svaret på denne logiske testen, 1, altså sann. Så lenge den logiske testen er sann (og det vil 1 alltid være), så kjøres koden mellom klammeparentesene. Det vil altså se slik ut: while (1){ //Kode som kjøres }
|
|
"Resten av koden"
De andre funksjonene som er brukt i koden brukes i de fleste Arduino-programmer:
- pinMode() - Setter en Arduino-pinne til inn- eller utgang
- digitalWrite() - Setter en utgangspinne til enten høyt eller lavt nivå (1 eller 0, 5V eller 0V)
- delay() - lager en pause i programmet på et gitt antall millisekunder
I setup-funksjonen brukes pinMode til å sette pinne 13 til utgang.
Loop-funksjonen setter vekselvis pinne 13 til høyt og lavt nivå, med ett sekunds pause mellom. Legg merke til at ved å bruke delay-funksjonen på denne måten "blokkerer" vi programmet slik at vi ikke kan gjøre noe annet i mellomtiden. (F.eks. sjekke om en knapp er trykt inn) Vi kommer tilbake til teknikker for å forhindre dette lenger ut i kurset.
Andre viktige funksjoner som vi også vil komme borti ofte er:
- digitalRead() – leser logisk nivå på en pinne
- analogWrite() – skriver en «analog» verdi på en pinne (egentlig PWM)
- analogRead() – leser en analog verdi fra en pinne (ADC)
Vi vil beskrive disse funksjonene nærmere etter hvert som vi får bruk for dem.
|
Oppgaver:
Vi avslutter denne bolken med et par enkle oppgaver:
Oppgave 1: Skriv om programmet slik at du får korte blink med en lengre pause mellom
Oppgave 2: Skriv om programmet slik at den interne lysdioden blinker det internasjonale SOS-signalet i morse (3 korte, 3 lange og 3 korte blink).
Mer om morse-alfabetet her https://no.wikipedia.org/wiki/Morsealfabetet
|
Dette er bare løsnings-forslag. Det finnes selvsagt mange måter å løse oppgavene på, :-)
Oppgave 1: Skriv om programmet slik at du får korte blink med en lengre pause mellom
#define LED 13
void setup(){ pinMode(LED, OUTPUT);
}
void loop(){ digitalWrite(LED, HIGH); delay(50); digitalWrite(LED, LOW); delay(1000);
}
Oppgave 2: Skriv om programmet slik at den interne lysdioden blinker det internasjonale SOS-signalet i morse (3 korte, 3 lange og 3 korte blink).
Her har jeg løst oppgaven med "klipp-og-lim". Oppgaven kan løses mye mer elegant med å bruke løkker og funksjoner, men det kan vi komme tilbake til.
#define LED 13
//Lager 4 lengde-definisjoner, slik at det blir enkelt å justere
#define KORT 200
#define LANG 500
#define MELLOMPIP 200
#define MELLOMTEGN 600
void setup() {
pinMode(LED, OUTPUT); //Setter LED-pinnen til utgang
}
void loop() {
//Første "S"
digitalWrite(LED, HIGH);
delay(KORT);
digitalWrite(LED, LOW);
delay(MELLOMPIP);
digitalWrite(LED, HIGH);
delay(KORT);
digitalWrite(LED, LOW);
delay(MELLOMPIP);
digitalWrite(LED, HIGH);
delay(KORT);
digitalWrite(LED, LOW);
delay(MELLOMTEGN);
// "O"
digitalWrite(LED, HIGH);
delay(LANG);
digitalWrite(LED, LOW);
delay(MELLOMPIP);
digitalWrite(LED, HIGH);
delay(LANG);
digitalWrite(LED, LOW);
delay(MELLOMPIP);
digitalWrite(LED, HIGH);
delay(LANG);
digitalWrite(LED, LOW);
delay(MELLOMTEGN);
//Andre "S"
digitalWrite(LED, HIGH);
delay(KORT);
digitalWrite(LED, LOW);
delay(MELLOMPIP);
digitalWrite(LED, HIGH);
delay(KORT);
digitalWrite(LED, LOW);
delay(MELLOMPIP);
digitalWrite(LED, HIGH);
delay(KORT);
digitalWrite(LED, LOW);
delay(2000); //Ekstra lang pause før neste SOS
|
Neste artikkel -->