Njuike sisdollui
Fágaartihkal

Programmering i Arduino

Denne artikkelen gir deg oversikt over alle vanlige variablene og funksjonene du kan bruke når du programmerer en Arduino.

Skriving av programkoden

En mikrokontroller har et innebygd kodespråk som forstår et bestemt sett med koder. Programmet ditt må bestå av koder som samsvarer med dette kodesettet, og kodene må stå i riktig rekkefølge. Da forstår mikrokontrolleren hva den skal gjøre.

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

Fordelen med å bruke programmeringsverktøyet er at du får ulik tekstfarge på ulike deler av programkoden, og det kan gjøre koden mer oversiktlig. Programmeringsverktøyet har også et auto-formatverktøy som kan hjelpe deg å lage tekstinnrykk og formatere koden slik at den visuelt blir enklere å lese.

Når du skriver koden din i et tekstbehandlingsprogram, må du hente den inn i programmeringsverktøyet for og lagring på Arduinoen. Uansett hvilket verktøy du har brukt, er det først ved kompilering at blir koden feilsjekka mot programmeringsspråket.

Funksjonene setup() og loop()

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

  • Funksjonen setup() kjøres kun én gang, og det er med en gang bruker kopler til strømmen.

  • Funksjonen loop() kjører så lenge Arduinoen har strøm. Her skriver du koden for det du vil Arduinoen skal gjøre.

Hvilke kodeblokker som skal plasseres hvor, vil du forstå bedre når du begynner å løse oppgaver.

Dobbel skråstrek (//)

Når du skriver dobbel skråstrek (// ), vil ikke programmet lese teksten som følger etter skråstrekene, som kode. Dobbel skråstrek bruker du derfor når du vil legge inn kommentarer i koden, enten for å beskrive for andre hva programmet skal gjøre, eller helt enkelt for å ha en huskelapp til deg selv.

Semikolon (;)

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

Vi deler vanligvis koden opp i instruksjoner som bestemmer hva programmet skal gjøre. Når programmet leser ei linje og kommer til et semikolon, oppfatter det semikolonet som slutten på en instruksjon eller kommando. Mikrokontrolleren utfører da først instruksjonen den akkurat har lest, og begynner så på neste linje. Du kan sammenlikne semikolon-kommandoen med å trykke linjeskift-tasten ("Enter"-tasten) når du skriver på et tastatur.

Eksempel

  • int ledPin = 13; // en variabel og gir den verdien 13

  • pinMode(ledPin, OUTPUT); // Setter pinne 13 som en utgang

  • digitalWrite(ledPin, HIGH); // Setter pinne 13 til høy (ON) tilstand

Her brukes semikolon til å avslutte hver linje med kode. Dette gjør at kompilatoren forstår når en instruksjon slutter og den neste begynner. Tekstinformasjon som følger etter dobbel stråstrek, påvirker ikke koden.

Det er viktig at du bruker semikolon riktig i Arduino-koden. Hvis du glemmer å skrive semikolon på slutten av en instruksjon, vil du få melding om syntaksfeil når du prøver å koden din. Manglende semikolon fører nemlig til at kommandolinjer feilaktig blir slått sammen, eller at Arduinoen oppfatter informasjonsteksten som en del av koden, men uten å kjenne igjen noen kommandoer, funksjon eller variabler.

Variabler

Variabler brukes til å lagre informasjon. De kan beskrives som bokser som lagrer en verdi inni seg. Mens et program kjører, kan det både legge til og hente ut variabelverdier.

For at programmet skal skjønne hva som kan puttes i de ulike variablene, må du fortelle mikrokontrolleren hvilken type data som skal lagres i dem.

Tallvariabler – heltall

En boks (variabel) som heter kan bare ha et heltall inni seg (1, 2, 3 osv.). Den kan ikke inneholde .

Eksempel

  • int x = 16; // Heltallsvariabel

  • int y = 8; // Ny heltallsvariabel

  • int z = x + y; // Enda en heltallsvariabel

Koden over viser et enkelt eksempel der vi har to heltallsvariabler med verdiene x og y, og en siste heltallsvariabel med verdien z, som blir regna ut ved hjelp av de to andre variablene. Hvis vi prøver å kjøre denne koden, vil z-variabelen få verdien 24 (x + y, altså 16 + 8).

Samme eksempel, men med variabelnavn som gir mening

I eksempelet over er verdien vi vil ha i boksen, et heltall (int ), og variabelnavna er satt til henholdsvis x, y og z. Hva en variabel skal hete, er helt opp til brukeren. Vi kunne like gjerne navngitt variablene i eksempelet på denne måten:

  • int jenter = 16;

  • int gutter = 8;

  • int antallElever = jenter + gutter;

Resultatet for antallElever blir 24. Det er det samme resultatet som for variabelen z i eksempelet ovenfor, for programmet utfører den samme oppgaven, uavhengig av hva variablene heter. Likevel er det viktig at variablene får navn som gir mening. Det gjør det mye lettere å forstå koden.

Tallvariabler – desimaltall

Vil du at variabelen skal ha plass til desimaltall, må du velge float eller double. Et enkelt eksempel kan være tallet . Trenger du bare avrundinga 3,14, kan du godt bruke float. Trenger du flere desimaler for å få større nøyaktighet, bør du benytte double.

Med double kan du i utgangspunktet lagre data med størrelse 8 byte, mens float lagrer data med størrelse 4 byte. Men små Arduinoer har ikke stor lagringskapasitet. De lagrer derfor tallverdier som 4-bytes-data, samme om vi har valgt float eller double. Skal programmet behandle tall som krever større lagringskapasitet, må du velge en større Arduino med kraftigere minne.

Char

Variabeltypen char (uttales tsjar) kan bare inneholde ett enkelt tegn, men dette tegnet kan til gjengjeld være et tall, en bokstav eller et hvilket som helst annet tegn som fins i -tabellen og dermed på et vanlig tastatur.

Eksempel

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

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

Legg merke til at vi bruker enkle anførselstegn når vi angir char-verdier.

Tekstvariabler (String)

I en char-variabel kan bare skrive ett enkelt tegn, ikke hele ord eller setninger. Hvis du vil lagre tekst, kaller du boksen (variabelen) for String.

Eksempel

  • String navn = ''Ola''; // Deklarerer en String-variabel vi har kalt "navn", som inneholder et enkeltord, nemlig Ola

  • String tekstvariabel = ''Hei, jeg programmerer en Arduino!''; // Deklarerer en String-variabel som har navnet "tekstvariabel", og som inneholder en liten setning med flere ord og ulike tegn

Legg merke til at vi bruker doble anførselstegn (= to enkle anførselstegn etter hverandre) når vi angir String-verdier.

Fordelen med å bruke String i stedet for char er at du enkelt kan lage setninger, søke etter understrenger og utføre andre tekstbehandlingsoppgaver uten at du må håndtere enkelttegn manuelt.

I programmeringsverktøyet er det ingen begrensninger for hvor lang en String-variabel kan være. Den eneste begrensninga er minnekapasiteten til Arduinoen. En Arduino Mega kan naturlig nok behandle større String-variabler enn en Arduino Micro. Et program som er skrevet for en Arduino Mega, kan derfor gi feilmelding på en Micro eller Nano fordi de har for lite minne.

Vær oppmerksom på at bruk av String kan kreve mer minne og prosessorkraft enn bruk av char-variabler, spesielt hvis du arbeider med store tekststrenger eller har begrensa minne på Arduino-enheten din.

Bool

Variabler av typen bool kan bare ha en av to verdier, for eksempel true eller false, sann eller usann, ja eller nei, 0 eller 1. Slike verdier brukes ofte sammen med if-setninger (funksjoner som sjekker om et er oppfylt eller ikke), for eksempel:

  • Hvis lysbryter er PÅ (TRUE), aktiver utgang for lyspære.

  • Hvis lysbryter er AV (FALSE), deaktiver utgang for lyspære.

Eksempel med kode

Eksempelet under er en kode som bruker bool som en variabel for om en lysbryter er PÅ eller AV, altså om påstanden eller spørsmålet er TRUE eller FALSE. Knappen sjekkes ti ganger i sekundet fordi det ligger 100 ms pause i programmet.

Hvis knappen er pressa ned, er påstanden riktig, og da skrives teksten "Knappen er trykt!" på skjermen.

Eksempelkode


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

void setup() {

pinMode(2, INPUT); // Setter pinne 2 som inngang for en knapp

Serial.begin(9600); // Starter seriekommunikasjon med en baud-rate på 9600

}

void loop() {

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

if (isButtonPressed) // Hvis if-setningen er TRUE (Sann), gjennomfør følgende programlinje

{

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

}

delay(100); // Ta 100 millisekunder pause før programmet kjøres igjen

}

Oversikt over de vanligste variablene

Variabler i arduino-programmering

Variabel

Kan inneholde

Eksempel

intheltall

int a = 14;

int tall = 42;

doubledesimaltall (med mange desimaler)double b = 3.14159265359;
floatdesimaltall (med få desimaler)float c = 3.14;
Stringtekst

String navn = ''Ola'';

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

charenkelttegn

char bokstav= 'a';

char hva = '?';

char hashtag = '#';

bool

sant / usant

på / av

bool x = true;

bool y = false;

bool på = 1;

bool av = 0;

Array

En array er ei samling variabler av samme type, nesten som ei liste. Hver verdi i en array har sin egen indeks, altså sin egen lagringsadresse, og den kan skrives til eller leses fra.

Du kan definere hvor mange tall en array skal inneholde (lengde), og hva slags tall det skal være (type). For å opprette en array bruker du en av metodene vist under. Det er viktig at du er oppmerksom på den ulike bruken av symbolene (), [] og {}. (De kalles bueparentes, hakeparentes og sløyfeparentes).

Eksempler på hvordan du kan opprette en array

Eksempel 1

Linja oppretter en array av heltall (int) med lengde 6 (plass til 6 tall), men uten verdier:

  • int heltall[6];

Eksempel 2

Linja oppretter en array av heltall uten spesifisert lengde, men gir den verdiene 2, 4, 8, 3, 6:

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

Eksempel 3

Linja oppretter en array av heltall med lengde 6 og gir den verdiene 2, 4, –8, 3, 2:

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

Eksempel 4

Linja oppretter en array av tegn med lengde 5 og fyller den med 5 bokstaver som samla utgjør ordet ''hallo'':

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

Indeksering

Det første elementet i en array er som 0. Hvis vi oppretter en array med for eksempel lengde 10, vil siste element være indeksert som 9.

I heltall-arrayen {2, 4, –8, 3, 2} vil tallet på heltall[0] være lik 2, mens heltall[2] er lik –8.

For å endre en verdi i arrayen bruker vi et enkelt likhetstegn:

  • Heltall[0] = 3;

Linja over endrer den første verdien i heltall-arrayen over fra 2 til 3.

Funksjoner

Med funksjon mener vi innen programmering ei blokk med kode som utfører ei spesifikk oppgave, og som kan brukes flere ganger. Arduino-språket har mange innebygde funksjoner. I tillegg kan vi lage våre egne funksjoner.

Eksempel 1: Innebygde funksjoner i Arduino

Kode

/* ------ Eksempler på innebygde funksjoner ------ */

float x = –14.6; // Variabel

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

int z = max(x); // Fjerner desimalen og gjør om x til et heltall som blir lagra i variabel z

Kommentar

Koden over viser to av de mange innebygde funksjonene til Arduino. Når koden kjøres, vil y returnere 14,6, mens z vil returnere –14.

Eksempel 2: Funksjon som gjør om fra tommer til millimeter

Kode

double tommerTilMillimeter(int antallTommer) // Funksjon som konverterer tommer til millimeter

{

double antallMillimeter = antallTommer * 25.4; //1 tomme = 25,4 mm

return antallMillimeter;

}

Kommentar

Koden er et eksempel på hvordan vi kan lage en funksjon som regner om tommer til millimeter:

  • Funksjonen tommerTilMillimeter tar inn variabelen int antallTommer.

  • Den setter så en ny variabel double antallMillimeter lik antallTommer multiplisert med 25,4. En tomme tilsvarer nemlig 25,4 millimeter.

  • Til slutt returnerer den verdien antallMillimeter, som er resultatet av omregninga fra tommer til millimeter.

I forslaget over benyttes variabelen antallTommer som grunnlag for utregninga. Vi må da angi en plass i programmet hvilken type tall denne variabelen skal ha.

I tillegg må vi definere en variabel til å lagre svaret i, for eksempel:

int millimeter;

Vi kjører funksjonen ved å legge inn et tall i parentes etter funksjonsnavnet. Da vil dette tallet bli brukt. Vil vi for eksempel regne ut hvor mange millimeter tre tommer er, legger vi til tallet 3.

Funksjonen regner ut svaret og lagrer det i variabelen millimeter:

millimeter = tommerTilMillimeter(3);

Svaret kan så skrives til Serial Monitor eller sendes til en aktuator, for eksempel en skjerm eller en motor.

Vilkår (betingelser)

if-setning

En if-setning er en funksjon som sjekker om et vilkår (en betingelse) er oppfylt, altså om vilkåret er sant eller ikke. Hvis vilkåret er oppfylt, vil koden kjøres, hvis det ikke er oppfylt, vil programmet hoppe over koden som er knytta til if-setningen, og gå direkte til neste kodelinje.

Programmering av automatiske gatelys er et godt eksempel på bruk av if-setninger: Lysa skal bare skrus på dersom det er mørkere enn hva sensoren er programmert til. Når det er lysere enn programmert verdi, slås lysa av.

Eksempel: Sammenlikning av to tall

En if-setning er en funksjon som sjekker om et vilkår er oppfylt eller ikke. Et eksempel på dette er å sjekke om en variabel er større enn en annen variabel.

Kode

int variabelA = 5;

int variabelB = 7;

// if-setning A

if (variabelA < variabelB) {

// Kjør denne koden. Skriv at verdi A er mindre enn verdi B.

}

// if-setning B

if (variabelA > variabelB) {

// Kjør denne koden. Skriv at verdi A er større enn verdi B.

}

Kommentar

Koden over viser to if-setninger som sjekker hvert sitt vilkår. If-setning A sjekker om variabelA er mindre enn variabelB. I vårt tilfelle er dette sant, og koden i if-setning A blir kjørt.

If-setning B sjekker det motsatte, nemlig om variabelA er større enn variabelB. I vårt tilfelle er dette ikke sant, og koden i if-setning B blir ikke kjørt.

else if

Når en if-funksjon inneholder flere enn to vilkår, bruker vi else if. Vi kan igjen bruke automatisk gatebelysning som eksempel. Nå har vi lagt inn et ekstra vilkår i koden som gjør det mulig å slå på belysninga manuelt med en lysbryter og overstyre lyssensoren.

Fullstendig eksempel: Automatisk styring av gatelys

Kode

if (lysVerdi > lysGrense) {

// Hvis lysverdien er høyere enn gitt lysgrense, skrus gatelysa av.

digitalWrite(gatelys, LOW);

}

else if (lysBryter == HIGH) {

// Hvis lysbryter er slått på, skal gatelysa skrus på,

// uansett om lysverdi er høyere enn lysgrense.

digitalWrite(gatelys, HIGH);

}

else {

// Hvis lysverdi er mindre eller lik gitt lysgrense,

// skrus gatelysa på.

digitalWrite(gatelys, HIGH);

}

Kommentar

Koden over styrer belysninga på denne måten:

  • Så lenge det er lyst nok, er vilkåret i if-setningen oppfylt, og koden kjøres: Lysa skrus av.

  • Hvis lysbryteren er slått på, skal lysa skrus på selv om vilkåret i if-setningen er oppfylt. Lyssensoren overstyres.

  • Hvis lyssensoren registrerer en verdi under lysgrensa, er vilkåret i if-setningen brutt, og lysa skal skrus på. (Lysbryteren kan ikke overstyre lyssensoren i dette tilfellet. Den kan altså ikke brukes til å slå av lysa.)

OBS!

Dette er bare et eksempel på hvordan if og else kan benyttes, ikke en komplett kode som henter inn lysverdi og bryterstatus.

Løkker

For-løkker

For-løkker og løkker generelt bruker vi når vi vil gjenta et sett med kode flere ganger. Ei for-løkke starter med "for", etterfulgt av instruksjoner om hvordan løkka skal kjøre.

Eksempel

Når vi skriver kode for ei for-løkke, må vi legge det som skal repeteres, mellom sløyfeparenteser { }. I eksempelet nedenfor er dette linja Serial.println(heltall[i]). Hver gang løkka kjøres, vil programmet skrive ut verdien i heltall-arrayen som har indeks "i".

Vi oppretter en variabel i og setter den lik 0. Så sier vi at løkka skal kjøre så lenge i er mindre enn 5. For hver gang løkka kjøres, skal i settes lik i + 1, det vil si øke med 1 hver gang.

Utsnitt fra programkode

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

{

Serial.println(heltall[i]);

}

Tenk etter

Hva tror du vil skrives på skjermen første gangen løkka kjører? Og hvor mange ganger totalt tror du løkka vil kjøres? Husk:

  • Variabelen i øker med 1 hver gang programmet kjøres, og programmet skal bare kjøre så lenge verdien er mindre enn 5.

  • Verdien starter med 0.

Hva mangler for at utsnittet over skal bli et fullstendig program?

While-løkker

Ei while-løkke repeterer koden som er knytta til den, så lenge et vilkår er oppfylt (sant). Vilkåret står i bueparentes ( ).

Eksempel

Kodeutsnitt

variabel = 0;

while (variabel < 200) {

// Repeterer 200 ganger

variabel++;

}

Kommentar

I eksempelet over er vilkåret at variabelverdien må være mindre enn 200. Så lenge dette vilkåret er oppfylt (sant), vil programmet repetere linja variabel++;. Denne linja øker innholdet i variabel med 1 for hver gang løkka gjentas.

Siden variabel har 0 som utgangsverdi, vil while-løkka kjøre 200 ganger, helt til variabel er 200 og vilkåret (variabel < 200) dermed er usant.

Oversikt over logiske funksjoner

Logiske funksjoner utfører operasjoner ut fra spørsmål eller påstander i programkoden din.

Logiske funksjoner

Navn

Oppgave

Eksempel

ifutfører ei blokk med kode hvis et vilkår er oppfylt (sant)

int sensorValue = analogRead(A0);

if (sensorValue > 500) {

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

}

elseutfører ei annen blokk med kode hvis vilkåret i en if-setning ikke er oppfylt (usant)

int sensorValue = analogRead(A0);

if (sensorValue > 500) {

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

} else {

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

}

else iftillater at flere vilkår blir testa etter hverandre i en if-else-rekkefølge
&&sann hvis begge vilkåra er sanne

int temperature = 25;

int humidity = 70;

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

// Utfør handling hvis temperaturen er over 20 grader og luftfuktigheten er under 80 %

}

!!sann hvis minst ett vilkår er sant

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

! sannhetsverdien til et vilkår, boolsk verdi

if (!sensorValue)

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

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

forgjentar ei blokk med kode et bestemt antall ganger

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);

}

whilegjentar ei blokk med kode så lenge et vilkår er sant (oppfylt)
do whilegjentar ei blokk med kode minst én gang, og deretter så lenge et vilkår er sant (oppfylt)
switchtester en uttrykksverdi mot flere tilfeller og utfører kode basert på resultatet

int dayOfWeek = 3;

switch (dayOfWeek) {

case 1:

Serial.println(''Mandag'');

break;

case 2:

Serial.println(''Tirsdag'');

break;

case 3:

Serial.println(''Onsdag'');

break;

// ... osv.

}

Oversikt over matematiske funksjoner

En mikrokontroller er også en avansert kalkulator. Du kan derfor bruke ei rekke matematiske funksjoner for å gjøre kalkulasjoner som er nødvendige for å behandle både variabler og tall.

Matematiske funksjoner

Navn eller symbol

Oppgave

Eksempel

+legger sammen to tallint sum = x + y; // Addisjon
trekker et tall fra et annetint difference = x – y; // Subtraksjon
*multipliserer to tallint product = x * y; // Multiplikasjon
/deler et tall med et annetint quotient = x / y; // Divisjon
%returnerer resten av en divisjonint remainder = x % y; // Modulus
++øker verdien til en variabel med 1count++; // øker count med 1
––reduserer verdien til en variabel med 1count––; // reduserer count med 1
pow(x, y)beregner x opphøyd i y
sqrt(x)beregner kvadratrota av x

float number = 16.0;

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

cbrt(x)beregner kubikkrota av x
sin(x), cos(x), tan(x)beregner sinus, cosinus og tangens til vinkelen x (i radianer)

float angleRadians = 0.7854; // ca. 45 grader i radianer

float sineValue = sin(angleRadians);

float cosineValue = cos(angleRadians);

float tangentValue = tan(angleRadians);

asin(x), acos(x), atan(x)beregner invers sinus, invers cosinus og invers tangens
round(x)runder et tall opp eller ned til nærmeste heltall

float realNumber = 3.7;

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

ceil(x)runder opp til nærmeste heltall

float realNumber = 3.7;

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

floor(x)runder ned til nærmeste heltall

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 hvis x er negativ, 0 hvis x er null og 1 hvis x er positiv

int number = –5;

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

random(min, max) et tilfeldig tall innenfor en gitt rekkeviddeint randomNumber = random(1, 10); // Tilfeldig tall mellom 1 og 9
randomSeed(seed)setter en startverdi for den tilfeldige tallgeneratoren
float(x) en verdi til typen float

int intValue = 42;

float floatValue = float(intValue); // Konverterer et tall av typen int til float

int(x)konverterer en verdi til typen int

float floatValue = 3.14;

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

konverterer en verdi til typen long

int intValue = 54321

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

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

Kompilering

Når du har skrevet koden, må den kompileres. Det vil si at den må konverteres (oversettes) til et kodespråk som mikrokontrolleren forstår. Til dette bruker du en kompilator, et dataprogram som først analyserer programkoden din og så konverterer den. I denne prosessen gjør kompilatoren følgende:

  1. Parsing: Parsing er sjekk av til programkoden. Dette betyr at koden sjekkes for grammatikk, skrivefeil og feil bruk av spesialtegn som for eksempel og parenteser.

  2. Semantisk analyse: Kompilatoren sjekker om koden følger strukturen og de logiske reglene i programmeringsspråket, og om programmet kan utføres slik det er ment. Blant annet sjekker den om variabler er riktig deklarert og brukt, om funksjoner får riktige typer argumenter, og om operasjoner er logisk tillatt.

  3. Optimalisering: Kompilatoren kan utføre ulike typer optimalisering for å forbedre maskinkoden som blir generert. For eksempel kan den se etter muligheter for å redusere minnebruken eller for å få programmet til å kjøre raskere.

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

  5. Lenking (linking): Hvis programmet består av flere filer, handterer kompilatoren også lenkinga. Da kombinerer den alle de genererte maskinkodefilene i ei enkelt kjørbar fil.

Når kompileringsprosessen er fullført, har du ei kjørbar fil (binær fil) som kan lastes opp og kjøres på Arduino-enheten din. I Arduino-miljøet er kompilatoren en del av programvaren som lar deg utvikle og laste opp kode til Arduino-enheten.