Funksjoner

Funksjoner

I Biblioteker skrev vi en lang skisse som inneholdt mange gjentagelser. Det gjør koden vanskelig å vedlikeholde (eventuelle små endringer må gjøres flere steder). I dette kapittelet skal vi derfor se nærmere på hvordan vi ved hjelp av egne funksjoner kan optimalisere koden fra et vedlikeholdsperspektiv.

Argument og returverdi

Alle skissene våre inneholder setup-funksjonen og loop-funksjonen. Vi kan legge til flere funksjoner hvis vi ønsker det. Ved å legge inn gjentakende kode i en egen funksjon, og deretter kalle opp den funksjonen ved behov, kan vi redusere størrelsen på skissen betydelig. Vi slipper også å skrive samme ting flere ganger.

En funksjon har alltid et navn. Den har eventuelt argumenter (de står i så fall i parentes) og eventuelt en returverdi. Argumentene er variabler som sendes til funksjonen. Funksjonen gjør noe med argumentene den mottar, og svarer ved behov med en returverdi.

Argumentene sendes til funksjonen, og returverdien sendes tilbake fra funksjonen.

Void loop() er et eksempel på en funksjon som vi allerede har brukt mange ganger. Navnet på funksjonen er loop, og den mangler argument (det står ingenting i parentes). Den har heller ingen returverdi. Ordet void betyr tom, og skal tolkes som at returverdien er tom.

void loop()

Innefra loop-funksjonen har vi flere ganger kalt opp delay-funksjonen. Den har et argument, men ingen returverdi. Argumentet lagres i en usignert long-variabel og angir hvor mange millisekunders forsinkelse delay-funksjonen skal forårsake. 

delay(1000);

Innefra loop-funksjonen har vi også flere ganger kalt opp funksjonen digitalWrite. Den har ingen returverdi, men den har to argumenter:

  • hvilken GPIO-pinne som skal påvirkis (int)
  • om GPIO-pinnen skal settes til HIGH eller LOW (boolean).
digitalWrite(13, HIGH);

Matematikkeksempel

Vi trenger ikke skrive noen funksjon for å summere to heltall, men vi skriver en likevel for å vise tydelig hva en funksjon gjør. Vi begynner med å lage en ny skisse (MathFunction.ino). I setup-funksjonen starter vi som vanlig en seriell kommunikasjon med Arduinoen.

Vi lager deretter en ny funksjon som vi kaller adder. Den skal ha to argumenter (de to verdiene vi vil summere) og én returverdi (summen). Vi bruker long som variabeltype for både argumentene og returverdien. Selve koden skriver vi nederst i skissen (etter loop-funksjonen).

Del av MathFunction.ino

I loop-funksjonen kan vi nå kalle opp vår egen funksjon adder og sende med to heltall som argumenter. Svaret lagrer vi i en long-variabel som vi kaller answer. Det svaret kan vi deretter skrive til Seriell overvåker. Vi legger også inn en forsinkelse på ett sekund. Den ferdige skissen ser slik ut:

MathFunction.ino

Verdiene i skissen blir sendt frem og tilbake på følgende måte:

Verdiene blir sendt til og fra vår egen funksjon.

Effektivisere kode med funksjoner

Som vi nevnte innledningsvis kan koden i Biblioteker effektiviseres ved å legge inn den gjentagende koden i en egen funksjon. Vi kopierer derfor skissen til en ny skisse (FruitPickers4.ino) og lager en egen funksjon som vi kaller updateStatus, som skal ha to argumenter (ingen returverdier). Det ene argumentet er en int med verdien for hvor mange epler som skal legges til for Alice. Det andre argumentet er samme ting for Bob. Deretter klipper vi ut den gjentagende koden og legger den inn i funksjonen vår

Del av FruitPickers4.ino

Inne i if-setningene som styrer hva som skal skje når noen trykker på knappene, legger vi i stedet inn et kall til updateStatus-funksjonen. På denne måten slipper vi å skrive kode flere ganger. Den ferdige skissen ser slik ut:

FruitPickers4.ino

Sist endret: 2017-09-08