Hopp til innhald
Fagartikkel

Programmering i Arduino

Denne artikkelen gir deg oversikt over alle vanlege variablane og funksjonane du kan bruke når du programmerer ein Arduino.

Skriving av programkoden

Ein mikrokontroller har eit innebygd kodespråk som forstår eit bestemt sett med kodar. Programmet ditt må bestå av kodar som samsvarer med dette kodesettet, og kodane må stå i rett rekkefølge. Då forstår mikrokontrolleren kva han skal gjere.

Når du lagar programkoden, kan du bruke eit programmeringsverktøy, eller du kan skrive i eit tekstbehandlingsprogram.

Fordelen med å bruke programmeringsverktøyet er at det gir ulik tekstfarge på ulike delar av programkoden, og det kan gjere koden meir oversiktleg. Programmeringsverktøyet har òg eit auto-formatverktøy som kan hjelpe deg å lage tekstinnrykk og formatere koden slik at han visuelt blir enklare å lese.

Når du skriv koden din i eit tekstbehandlingsprogram, må du hente han inn i programmeringsverktøyet for og lagring på Arduinoen. Same kva verktøy du har brukt, er det først ved kompilering at blir koden feilsjekka mot programmeringsspråket.

Funksjonane setup() og loop()

Eit Arduino-program består alltid av to : setup() og loop().

  • Funksjonen setup() blir berre køyrd éin gong, og det er med ein gong brukar koplar til straumen.

  • Funksjonen loop() køyrer så lenge Arduinoen har straum. Her skriv du koden for det du vil Arduinoen skal gjere.

Kva kodeblokker som skal plasserast kvar, vil du forstå betre når du begynner å løyse oppgåver.

Dobbel skråstrek (//)

Når du skriv dobbel skråstrek (// ), vil ikkje programmet lese teksten som følger etter dette teiknet, som kode. Dobbel skråstrek bruker du derfor når du vil legge inn kommentarar i koden, anten for å beskrive for andre kva programmet skal gjere, eller heilt enkelt for å ha ein hugselapp til deg sjølv.

Semikolon (;)

I Arduino-programmering og i mange andre programmeringsspråk bruker vi semikolon (;) som eit avslutningsteikn.

Vi deler vanlegvis koden opp i instruksjonar som bestemmer kva programmet skal gjere. Når programmet les ei linje og kjem til eit semikolon, oppfattar det semikolonet som slutten på ein instruksjon eller kommando. Mikrokontrolleren utfører då først instruksjonen han akkurat har lese, og begynner så å lese neste linje. Du kan samanlikne semikolon-kommandoen med å trykke linjeskift-tasten ("Enter"-tasten) når du skriv på eit tastatur.

Døme

  • int ledpin = 13; // ein variabel og gir han verdien 13

  • pinMode(ledpin, OUTPUT); // Set pinne 13 som ein utgang

  • digitalWrite(ledpin, HIGH); // Set pinne 13 til høg (ON) tilstand

Her blir semikolon brukt til å avslutte kvar linje med kode. Dette gjer at kompilatoren forstår når ein instruksjon sluttar og den neste begynner. Tekstinformasjon som følger etter dobbel stråstrek, verkar ikkje inn på koden.

Det er viktig at du bruker semikolon rett i Arduino-koden. Viss du gløymer å skrive semikolon på slutten av ein instruksjon, vil du få melding om syntaksfeil når du prøver å koden din. Manglande semikolon fører nemleg til at kommandolinjer feilaktig blir slått saman, eller at Arduinoen oppfattar informasjonsteksten som ein del av koden, men utan å kjenne igjen nokon kommandoar, funksjon eller variablar.

Variablar

Variablar blir brukte til å lagre informasjon. Dei kan beskrivast som boksar som lagrar ein verdi inni seg. Mens eit program køyrer, kan det både legge til og hente ut variabelverdiar.

For at programmet skal skjønne kva som kan puttast i dei ulike variablane, må du fortelje mikrokontrolleren kva type data som skal lagrast i dei.

Talvariablar – heiltal

Ein boks (variabel) som heiter kan berre ha eit heiltal inni seg (1, 2, 3 osb.). Han kan ikkje innehalde .

Døme

  • int x = 16; // Heiltalsvariabel

  • int y = 8; // Ny heiltalsvariabel

  • int z = x + y; // Endå ein heiltalsvariabel

Koden over viser eit enkelt døme der vi har to heiltalsvariablar med verdiane x og y, og ein siste heiltalsvariabel med verdien z, som blir rekna ut ved hjelp av dei to andre variablane. Viss vi prøver å køyre denne koden, vil z-variabelen få verdien 24 (x + y, altså 16 + 8).

Same døme, men med variabelnamn som gir meining

I dømet over er verdien vi vil ha i boksen, eit heiltal (int ), og variabelnamna er sette til høvesvis x, y og z. Kva ein variabel skal heite, er heilt opp til brukaren. Vi kunne like gjerne namngitt variablane i dømet på denne måten:

  • int jenter = 16;

  • int gutar = 8;

  • int elevTal = jenter + gutar;

Resultatet for elevTal blir 24. Det er det same resultatet som for variabelen z i dømet ovanfor, for programmet utfører den same oppgåva, uavhengig av kva variablane heiter. Likevel er det viktig at variablane får namn som gir god meining. Det gjer det mykje lettare å forstå koden.

Talvariablar – desimaltal

Vil du at variabelen skal ha plass til desimaltal, må du velje float eller double. Eit enkelt døme kan vere talet . Treng du berre avrundinga 3,14, kan du godt bruke float. Treng du fleire desimalar for å få større nøyaktigheit, bør du nytte double.

Med double kan du i utgangspunktet lagre data med storleik 8 byte, mens float lagrar data med storleik 4 byte. Men små Arduinoar har ikkje stor lagringskapasitet. Dei lagrar derfor talverdiar som 4-bytes-data, same om du har valt float eller double. Skal programmet behandle tal som krev større lagringskapasitet, må du velje ein større Arduino med kraftigare minne.

Char

Variabeltypen char (blir uttalt tsjar) kan berre innehalde eitt enkelt teikn, men dette teiknet kan til gjengjeld vere eit tal, ein bokstav eller kva som helst anna teikn som finst i -tabellen og dermed på eit vanleg tastatur.

Døme

  • char variabel1 = 'A'; // Deklarerer ein char-variabel med verdien 'A'

  • char variabel2 = '#'; // Deklarerer ein char-variabel med verdien '#'

Legg merke til at vi bruker enkle hermeteikn når vi angir char-verdiar.

Tekstvariablar (String)

I ein char-variabel kan berre skrive eitt enkelt teikn, ikkje heile ord eller setningar. Viss du vil lagre tekst, kallar du boksen (variabelen) for String.

Døme

  • String namn = ''Ola''; // Deklarerer ein String-variabel vi har kalla "namn", som inneheld eit enkeltord, nemleg Ola

  • String tekstvariabel = ''Hei, eg programmerer ein Arduino!''; // Deklarerer ein String-variabel som har namnet "tekstvariabel", og som inneheld ei lita setning med fleire ord og ulike teikn

Legg merke til at vi bruker doble hermeteikn (= to enkle hermeteikn etter kvarandre) når vi angir String-verdiar.

Fordelen med å bruke String i staden for char er at du enkelt kan lage setningar, søke etter understrenger og utføre andre tekstbehandlingsoppgåver utan at du må handtere enkeltteikn manuelt.

I programmeringsverktøyet er det ikkje lagt inn noka avgrensing for kor lang ein String-variabel kan vere. Den einast avgrensinga er minnekapasiteten til Arduinoen. Ein Arduino Mega kan naturleg nok behandle større String-variablar enn ein Arduino Micro. Eit program som er skrive for ein Arduino Mega, kan derfor gi feilmelding på ein Micro eller Nano fordi dei har for lite minne.

Ver merksam på at bruk av String kan krevje meir minne og prosessorkraft enn bruk av char-variablar, spesielt viss du arbeider med store tekststrenger eller har avgrensa minne på Arduino-eininga di.

Bool

Variablar av typen bool kan berre ha ein av to verdiar, til dømes true eller false, sann eller usann, ja eller nei, 0 eller 1. Slike verdiar blir ofte brukte saman med if-setningar (funksjonar som sjekkar om eit vilkår er oppfylt eller ikkje), til dømes:

  • Viss lysbrytar er PÅ (TRUE), aktiver utgang for lyspære.

  • Viss lysbrytar er AV (FALSE), deaktiver utgang for lyspære.

Døme med kode

Dømet under er ein kode som bruker bool som ein variabel for om ein lysbrytar er PÅ eller AV, altså om påstanden eller spørsmålet er TRUE eller FALSE. Knappen blir sjekka ti gonger i sekundet fordi det ligg 100 ms pause i programmet.

Viss knappen er pressa ned, er påstanden rett, og då blir teksten "Knappen er trykt!" skriven på skjermen.

Dømekode


bool isButtonPressed = false; // Deklarerer ein bool-variabel med verdien false

void setup() {

pinMode(2, INPUT); // Set pinne 2 som inngang for ein knapp

Serial.begin(9600); // Startar seriekommunikasjon med ein baud-rate på 9600

}

void loop() {

isButtonPressed = digitalRead(2); // Les tilstanden til knappen, altså om han er PÅ eller AV

if (isButtonPressed) // Viss if-setninga er TRUE (Sann), gjennomfør følgande programlinje

{

Serial.println(''Knappen er trykt!''); // Skriv melding til serieporten viss knappen er trykt

}

delay(100); // Ta 100 millisekund pause før programmet blir køyrt på ny

}

Oversikt over dei vanlegaste variablane

Variablar i arduino-programmering

Variabel

Kan innehalde

Døme

intheiltal

int a = 14;

int tal = 42;

doubledesimaltal (med mange desimalar)double b = 3.14159265359;
floatdesimaltal (med få desimalar)float c = 3.14;
Stringtekst

String namn = ''Ola'';

String temperatur = ''Det er varmt.'';

charenkeltteikn

char bokstav= 'a';

char kva = '?';

char emneknagg = '#';

bool

sant / usant

på / av

bool x = true;

bool y = false;

bool på = 1;

bool av = 0;

Array

Ein array er ei samling variablar av same type, nesten som ei liste. Kvar verdi i ein array har sin eigen indeks, altså si eiga lagringsadresse, og han kan skrivast til eller lesast frå.

Du kan definere kor mange tal ein array skal innehalde (lengde), og kva slags tal det skal vere (type). For å opprette ein array bruker du ein av metodane som er viste under. Det er viktig at du er merksam på den ulike bruken av symbola (), [] og {}. (Dei heiter bogeparentes, hakeparentes og sløyfeparentes).

Døme på korleis du kan opprette ein array

Døme 1

Linja opprettar ein array av heiltal (int) med lengde 6 (plass til 6 tal), men utan verdiar:

  • int heiltal[6];

Døme 2

Linja opprettar ein array av heiltal utan spesifisert lengde, men gir han verdiane 2, 4, 8, 3, 6:

  • int heiltal[] = {2, 4, 8, 3, 6};

Døme 3

Linja opprettar ein array av heiltal med lengde 6 og gir han verdiane 2, 4, –8, 3, 2:

  • int heiltal[6] = {2, 4, –8, 3, 2};

Døme 4

Linja opprettar ein array av enkeltteikn med lengde 5 og fyller han med 5 bokstavar som samla utgjer ordet ''hallo'':

  • char melding[5] = {'h', 'a', 'l', 'l', 'o'};

Indeksering

Det første elementet i ein array er som 0. Viss vi opprettar ein array med til dømes lengde 10, vil siste element vere indeksert som 9.

I heiltals-arrayen {2, 4, –8, 3, 2} vil talet på heiltal[0] vere lik 2, mens heiltal[2] er lik –8.

For å forandre ein verdi i arrayen bruker vi eit enkelt likskapsteikn:

  • Heiltal[0] = 3;

Linja over forandrar den første verdien i heiltals-arrayen over frå 2 til 3.

Funksjonar

Med funksjon meiner vi innan programmering ei blokk med kode som utfører ei spesifikk oppgåve, og som kan brukast fleire gonger. Arduino-språket har mange innebygde funksjonar. I tillegg kan vi lage våre eigne funksjonar.

Døme 1: Innebygde funksjonar i Arduino

Kode

/* ------ Døme på innebygde funksjonar ------ */

float x = –14.6; // Variabel

float y = abs(x); // Returnerer absoluttverdien til x, som blir lagra i variabel y

int z = max(x); // Fjernar desimalen og gjer om x til eit heiltal, som blir lagra i variabel z

Kommentar

Koden over viser to av dei mange innebygde funksjonane til Arduino. Når koden blir køyrd, vil y returnere 14,6, mens z vil returnere –14.

Døme 2: Funksjon som gjer om frå tommar til millimeter

Kode

double tommarTilMillimeter(int antalTommar) / Funksjon som konverterer tommar til millimeter

{

double antalMillimeter = antalTommar * 25.4; //1 tomme = 25,4 mm

return antalMillimeter;

}

Kommentar

Koden er eit døme på korleis vi kan lage ein funksjon som reknar om tommar til millimeter:

  • Funksjonen tommarTilMillimeter tek inn variabelen int antalTommar.

  • Han set så ein ny variabel double antalMillimeter lik antalTommar multiplisert med 25,4 fordi ein tomme tilsvarer 25,4 millimeter.

  • Til slutt returnerer han verdien antalMillimeter, som er resultatet av omrekninga frå tommar til millimeter.

I forslaget over blir variabelen antalTommar nytta som grunnlag for utrekninga. Vi må då angi ein plass i programmet kva for tal denne variabelen skal ha.

I tillegg definerer vi ein variabel til å lagre svaret i, til dømes:

int millimeter;

Vi køyrer funksjonen ved å legge til eit tal i parentes etter funksjonsnamnet. Då vil dette talet bli brukt. Vil vi til dømes rekne ut kor mange millimeter tre tommar er, legg vi til talet 3.

Funksjonen reknar så ut svaret og lagrar det i variabelen millimeter:

millimeter = tommarTilMillimeter(3);

Svaret kan så skrivast til Serial Monitor eller sendast til ein aktuator, til dømes ein skjerm eller ein motor.

Vilkår

if-setningar

Ei if-setning er ein funksjon som sjekkar om eit vilkår er oppfylt (sant) eller ikkje. Viss vilkåret er oppfylt, vil koden køyrast, viss det ikkje er oppfylt, vil programmet hoppe over koden som er knytt til if-setninga, og gå direkte til neste kodelinje.

Programmering av automatiske gatelys er eit godt døme på bruk av if-setningar: Lysa skal berre skruast på dersom det er mørkare enn grenseverdien sensoren er programmert til. Når det er lysare enn programmert verdi, blir lysa slått av.

Døme: Samanlikning av to tal

Ei if-setning er ein funksjon som sjekkar om eit vilkår er sant eller ikkje. Eit døme på dette er å sjekke om ein variabel er større enn ein annan variabel.

Kode

int variabelA = 5;

int variabelB = 7;

// if-setning A

if (variabelA < variabelB) {

// Køyr denne koden. Skriv at verdi A er mindre enn verdi B.

}

// if-setning B

if (variabelA > variabelB) {

// Køyr denne koden. Skriv at verdi A er større enn verdi B.

}

Kommentar

Koden over viser to if-setningar som sjekkar kvart sitt vilkår. If-setning A sjekkar om variabelA er mindre enn variabelB. I vårt tilfelle er dette sant, og koden i if-setning A blir køyrd.

If-setning B sjekkar det motsette, nemleg om variabelA er større enn variabelB. I vårt tilfelle er dette ikkje sant, og koden i if-setning B blir ikkje køyrd.

else if

Når ein if-funksjon inneheld fleire enn to vilkår, bruker vi else if. Vi kan igjen bruke automatisk gatebelysning som døme. No har vi lagt inn eit ekstra vilkår i koden som gjer det mogleg å slå på belysninga manuelt med ein lysbrytar og overstyre lyssensoren.

Fullstendig døme: Automatisk styring av gatelys

Kode

if (lysverdi > lysgrense) {

// Viss lysverdien er høgare enn gitt lysgrense, skal gatelysa vere slått av.

digitalWrite(gatelys, LOW);

}

else if (lysbrytar == HIGH) {

// Viss lysbrytar er slått på, skal gatelysa skruast på,

// sjølv om lysverdi er høgare enn lysgrense.

digitalWrite(gatelys, HIGH);

}

else {

// Viss lysverdi er mindre eller lik gitt lysgrense,

// blir gatelysa skrudde på.

digitalWrite(gatelys, HIGH);

}

Kommentar

Koden over styrer belysninga på denne måten:

  • Så lenge det er lyst nok, er vilkåret i if-setninga oppfylt, og koden blir køyrd: Lysa blir slått av.

  • Viss lysbrytaren er slått på, skal lysa skruast på sjølv om vilkåret i if-setninga er oppfylt. Lyssensoren blir overstyrt.

  • Viss lyssensoren registrerer ein verdi under lysgrensa, er vilkåret i if-setninga brote, og lysa skal skruast på. (Lysbrytaren kan ikkje overstyre lyssensoren i dette tilfellet. Han kan altså ikkje brukast til å slå av lysa.)

OBS!

Dette er berre eit døme på korleis if og else kan nyttast, ikkje ein komplett kode som hentar inn lysverdi og brytarstatus.

Løkker

For-løkker

For-løkker og løkker generelt bruker vi når vi vil gjenta eit sett med kode fleire gonger. Ei for-løkke startar med "for", etterfølgd av instruksjonar om korleis løkka skal køyre.

Døme

Når vi skriv kode for ei for-løkke, må vi legge det som skal gjentakast, mellom sløyfeparentesar { }. I dømet nedanfor er dette linja Serial.println(heiltal[i]). Kvar gong løkka blir køyrd, vil programmet skrive ut verdien i heiltals-arrayen som har indeks "i".

Vi opprettar ein variabel i og set han lik 0. Så seier vi at løkka skal køyre så lenge i er mindre enn 5. For kvar gong løkka blir køyrd, skal i bli sett lik i + 1. Det vil seie at i skal auke med 1 kvar gong.

Utsnitt frå programkode

for (int i = 0; i < 5; i = i + 1)

{

Serial.println(heiltal[i]);

}

Tenk etter

Kva trur du blir skrive på skjermen første gongen løkka køyrer? Og kor mange gonger totalt trur du programmet vil køyre? Hugs:

  • Variabelen i aukar med 1 kvar gong programmet blir køyrt, og programmet skal berre køyre så lenge verdien er mindre enn 5.

  • Verdien startar med 0.

Kva manglar for at utsnittet over skal bli eit fullstendig program?

While-løkker

Ei while-løkke repeterer koden som er knytt til ho, så lenge eit vilkår er sant. Vilkåret står i bogeparentes ( ).

Døme

Kodeutsnitt

variabel = 0;

while (variabel < 200) {

// Repeterer 200 gonger

variabel++;

}

Kommentar

I dømet over er vilkåret at variabelverdien må vere mindre enn 200. Så lenge dette vilkåret er oppfylt (sant), vil programmet repetere linja variabel++;. Denne linja aukar innhaldet i variabel med 1 for kvar gong løkka blir gjenteken.

Sidan variabel har 0 som utgangsverdi, vil while-løkka køyre 200 gonger, heilt til variabel er 200 og vilkåret (variabel < 200) dermed er usant.

Oversikt over logiske funksjonar

Logiske funksjonar utfører operasjonar ut frå spørsmål eller påstandar i programkoden din.

Logiske funksjonar

Namn

Oppgåve

Døme

ifutfører ei blokk med kode viss eit vilkår er oppfylt (sant)

int sensorValue = analogRead(A0);

if (sensorValue > 500) {

digitalWrite(LED_BUILTIN, HIGH); // Slår på LED viss sensorverdien er over 500

}

elseutfører ei anna blokk med kode viss vilkåret i ei if-setning ikkje er oppfylt (sant)

int sensorValue = analogRead(A0);

if (sensorValue > 500) {

digitalWrite(LED_BUILTIN, HIGH); // Slår på LED viss sensorverdien er over 500

} else {

digitalWrite(LED_BUILTIN, LOW); // Slår av LED viss sensorverdien er 500 eller mindre

}

else iftillet at fleire vilkår blir testa etter kvarandre i ei if-else-rekkefølge
&&sann viss begge vilkåra er sanne

int temperature = 25;

int humidity = 70;

if (temperature > 20 && humidity < 80) {

// Utfør handling viss temperaturen er over 20 gradar og luftfukta er under 80 %

}

!!sann viss minst eitt vilkår er sant

bool isSensorTriggered = !!sensorValue; // Konverterer sensorverdien til ein boolsk verdi

! sanningsverdien til eit vilkår, boolsk verdi

if (!sensorValue)

{ Serial.println(''Sensoren er aktivert!''); } else

{ Serial.println(''Sensoren er ikkje aktivert.''); }

forgjentek ei blokk med kode eit bestemt antal gonger

for (int i = 0; i < 10; i++) {

digitalWrite(LED_BUILTIN, HIGH); // Slår på LED

delay(500);

digitalWrite(LED_BUILTIN, LOW); // Slår av LED

delay(500);

}

whilegjentek ei blokk med kode så lenge eit vilkår er sant (oppfylt)
do whilegjentek ei blokk med kode minst éin gong, og deretter så lenge eit vilkår er sant
switchtestar ein uttrykksverdi mot fleire tilfelle og utfører kode basert på resultatet

int dayOfWeek = 3;

switch (dayOfWeek) {

case 1:

Serial.println(''Måndag'');

break;

case 2:

Serial.println(''Tysdag'');

break;

case 3:

Serial.println(''Onsdag'');

break;

// ... osb.

}

Oversikt over matematiske funksjonar

Ein mikrokontroller er òg ein avansert kalkulator. Du kan derfor bruke ei rekke matematiske funksjonar for å gjere kalkulasjonar som er nødvendige for å behandle både variablar og tal.

Matematiske funksjonar

Namn eller symbol

Oppgåve

Døme

+legg saman to talint sum = x + y; // Addisjon
trekker eit tal frå eit annaint difference = x – y; // Subtraksjon
*multipliserer to talint product = x * y; // Multiplikasjon
/deler eit tal med eit annaint quotient = x / y; // Divisjon
%returnerer resten av ein divisjonint remainder = x % y; // Modulus
++aukar verdien til ein variabel med 1count++; // aukar count med 1
––reduserer verdien til ein variabel med 1count––; // reduserer count med 1
pow(x, y)reknar ut x opphøgd i y
sqrt(x)reknar ut kvadratrota av x

float number = 16.0;

float squareRoot = sqrt(number); // Kvadratrota av 16 = 4

cbrt(x)reknar ut kubikkrota av x
sin(x), cos(x), tan(x)reknar ut sinus, cosinus og tangens til vinkelen x (i radianar)

float angleradians = 0.7854; // ca. 45 gradar i radianar

float sineValue = sin(angleradians);

float cosineValue = cos(angleradians);

float tangentValue = tan(angleradians);

asin(x), acos(x), atan(x)reknar ut invers sinus, invers cosinus og invers tangens
round(x)rundar eit tal opp eller ned til næraste heiltal

float realNumber = 3.7;

int rounded = round(realNumber); // Avrundes til 4

ceil(x)rundar opp til næraste heiltal

float realNumber = 3.7;

int ceilValue = ceil(realNumber); // Avrundes opp til 4

floor(x)rundar ned til næraste heiltal

float realNumber = 3.7;

int floorValue = floor(realNumber); // Avrundes ned til 3

abs(x)returnerer absoluttverdien av x

int number = –5;

int absValue = abs(number); // Absoluttverdi av –5 = 5

sign(x)returnerer –1 viss x er negativ, 0 viss x er null og 1 viss x er positiv

int number = –5;
int signValue = sign(number); // –1 (negativt tal)

random(min, max) eit tilfeldig tal innanfor ei gitt rekkeviddeint randomNumber = random(1, 10); // Tilfeldig tal mellom 1 og 9
randomseed(seed)set ein startverdi for den tilfeldige talgeneratoren
float(x)konverterer ein verdi til variabeltypen float

int intValue = 42;

float floatValue = float(intValue); // Konverterer int til float

int(x)konverterer ein verdi til eit heiltal (int)

float floatValue = 3.14;

int intValue = int(floatValue); // Konverterer float til int

konverterer ein verdi til variabeltypen long

int intValue = 54321

long longValue = long(intValue); //
Konverterer int til long

PIrepresenterer π (pi), som er ein matematisk float circleArea = PI * radius * radius; // Reknar ut arealet til ein sirkel

Kompilering

Når du har skrive koden, må han kompilerast. Det vil seie at han må konverterast (bli omsett) til eit kodespråk som mikrokontrolleren forstår. Til dette bruker du ein kompilator, eit dataprogram som først analyserer programkoden din og så konverterer han. I denne prosessen gjer kompilatoren følgande:

  1. Parsing: Parsing er sjekk av til programkoden. Dette betyr at koden blir sjekka for grammatikk, skrivefeil og feil bruk av spesialteikn som til dømes og parentesar.

  2. Semantisk analyse: Kompilatoren sjekkar om koden følger strukturen og dei logiske reglane i programmeringsspråket, og om programmet kan utførast slik det er meint. Mellom anna sjekkar han om variablar er riktig deklarerte og brukte, om funksjonar får rette typar argument, og om operasjonar er logisk tillatt.

  3. Optimalisering: Kompilatoren kan utføre ulike typar optimalisering for å forbetre maskinkoden som blir generert. Til dømes kan han sjå etter moglegheiter for å redusere minnebruken eller for å få programmet til å køyre raskare.

  4. Generering av maskinkode: Kompilatoren konverterer den syntaktisk og semantisk rette koden til maskinkode som den aktuelle mikrokontrolleren kan lese og utføre.

  5. Lenking (linking): Viss programmet består av fleire filer, handterer kompilatoren òg lenkinga. Då kombinerer han alle dei genererte maskinkodefilene i ei køyrbar enkeltfil.

Når kompileringsprosessen er fullført, har du ei køyrbar fil (binær fil) som kan lastast opp og køyrast på Arduino-eininga di. I Arduino-miljøet er kompilatoren ein del av programvara som lar deg utvikle og laste opp kode til Arduino-eininga.