Funktioner

Funktioner

I Bibliotek skrev vi en lång sketch som innehöll mycket upprepningar. Det gör koden svår att underhålla (eventuella småändringar måste göras på flera ställen). I detta kapitel ska vi därför se närmare på hur vi med hjälp av egna funktioner kan optimera koden ur underhållsperspektiv.

Argument och returvärde

I alla våra sketcher finns setup-funktionen och loop-funktionen. Vi kan lägga till fler funktioner än så om vi önskar. Genom att lägga kod som upprepas i en egen funktion och anropa den funktionen vid behov kan vi skala ned sketchstorleken rejält. Vi slipper också skriva samma sak flera gånger. 

En funktion har alltid ett namn. Den har eventuellt några argument (de står i så fall inom parentesen) och eventuellt ett returvärde. Argumenten är variabler som skickas till funktionen. Funktionen gör något med argumenten som den får och svarar vid behov vad den kom fram till med ett returvärde. 

 Argumenten skickas till funktionen och returvärdet skickas tillbaka från funktionen.

Void loop() är ett exempel på en funktion som vi redan har använt många gånger. Namnet på funktionen är loop och den saknar argument (det står inget inom parentesen). Den har inte heller något returvärde. Ordet void betyder tom och ska tolkas som att returvärdet är tomt.

void loop()

Inifrån loop-funktionen har vi flera gånger anropat delay-funktionen. Den har ett argument men inget returvärde. Argumentet lagras i en osignerad long-variabel och anger hur många millisekunders fördröjning som delay-funktionen ska orsaka. 

delay(1000);

Inifrån loop-funktionen har vi också flera gånger anropat funktionen digitalWrite. Den har inget returvärde, men den har två argument:

  • vilket GPIO-stiftnummer som ska påverkas (int)
  • om GPIO-stiftet ska ställas på HIGH eller LOW (boolean).
digitalWrite(13, HIGH);

Matematikexempel

Vi behöver inte skriva någon funktion för att summera två heltal, men vi skriver en sådan ändå för att tydligt visa vad en funktion gör. Vi börjar med att skapa en ny sketch (MathFunction.ino). I setup-funktionen startar vi som vanligt en seriell kommunikation med Arduinon. 

Vi skapar sedan en ny funktion som vi kallar adder. Den ska ha två argument (de två värdena som vi vill summera) och ett returvärde (summan). Vi använder long som variabel­typ för både argumenten och returvärdet. Själva koden skriver vi längst ned i sketchen (efter loop-funktionen).

Del av MathFunction.ino

I loop-funktionen kan vi nu anropa vår egen funktion adder och skicka med två heltal som argument. Svaret lagrar vi i en long-variabel som vi kallar answer. Det svaret kan vi sedan skriva ut i Serial monitor. Vi lägger även med en fördröjning på en sekund. Den färdiga sketchen ser ut på följande sätt.

MathFunction.ino

Värdena i vår sketch kommer att skickas fram och tillbaka på följande sätt.

Sättet vi skickar värden till och från vår egen funktion.

Effektivisera kod med funktioner

Som vi nämnde inledningsvis går det att effektivisera koden i Bibliotek genom att lägga den upprepande koden i en egen funktion. Vi kopierar därför sketchen till en ny sketch (FruitPickers4.ino) och skapar en egen funktion som vi kallar updateStatus med två argument (inget returvärde). Det ena argumentet är en int med värdet för hur många äpplen som ska läggas till hos Alice. Det andra argumentet är samma sak för Bob. Sedan klipper vi ut den upprepande koden och lägger den i vår funktion. 

Del av FruitPickers4.ino

Inne i if-satserna som styr vad som ska hända när någon klickar på knapparna lägger vi i stället anrop till updateStatus-funktionen. På detta sätt slipper vi skriva samma kod flera gånger. Den färdiga sketchen ser ut på följande sätt. 

FruitPickers4.ino

Senast ändrad: 2017-01-23