Functies

Functies

Wanneer je al je code in de setup() en loop() zou plaatsen, zal je al snel het overzicht verliezen. Om je code beter te organiseren, kan je gebruik maken van functies. Functies zijn blokken code die je kunt hergebruiken door ze aan te roepen met hun naam.

De grote voordelen van functies zijn:

  • Hergebruik: je kan dezelfde functie meerdere keren aanroepen zonder de code opnieuw te moeten schrijven.
  • Overzichtelijkheid: je kan je code opdelen in kleinere, beter beheersbare stukken.
  • Modulariteit: je kan functies afzonderlijk testen en debuggen. Eens geschreven en gecontroleerd, hoef je niet meer te weten hoe ze precies werken.

setup() en loop() zijn zelf ook functies! Net als de ingebouwde Arduino functies zoals digitalWrite(), analogRead() en delay() die je al eerder gebruikte.

Functie aanmaken en aanroepen

Een functie bestaat uit vier hoofdonderdelen:

  1. Het return type: dit geeft aan welk type waarde de functie teruggeeft. Als de functie geen waarde teruggeeft, gebruik je void.
  2. De naam van de functie: dit is hoe je de functie later zult aanroepen. Afspraak: namen van functies beginnen met een kleine letter en gebruiken camelCase (bv. mijnFunctie). Kies een duidelijke naam die aangeeft wat de functie doet.
  3. Ronde haakjes (), met eventueel parameters tussen de haakjes: parameters zijn variabelen die je aan de functie kunt doorgeven om deze te gebruiken binnen de functie.
  4. Een blok code tussen accolades {}: dit is de code die uitgevoerd wordt wanneer de functie wordt aangeroepen.

Een functie aanmaken doe je dus als volgt:

type naam() {
    // code
}

Bijvoorbeeld:

void hallo() {
    Serial.println("Hallo!");
}

Om de functie aan te spreken gebruik je de naam van de functie, gevolgd door ronde haakjes. Arduino springt dan naar de functie, voert de code binnen de functie uit, en keert daarna terug naar de plek waar de functie werd aangeroepen.

naam();

Hier is een voorbeeld van een eenvoudige functie:

void hallo() {
    Serial.println("Hallo!");
}
void setup() {
    Serial.begin(9600);
}
void loop() {
    hallo();
}

Functies met parameters

Soms is het nodig meer informatie door te geven aan een functie. Dit kan met behulp van parameters. Parameters zijn variabelen die je tussen de ronde haakjes van de functiedefinitie plaatst. Je kunt meerdere parameters definiëren, gescheiden door komma's. Elke parameter heeft een type en een naam. Wanneer je de functie aanroept, geef je de bijbehorende argumenten, i.e. de specifieke waarden, door.

Hier is een voorbeeld van een functie met een parameter naam:

void halloNaam(String naam) {
    Serial.print("Hallo, ");
    Serial.println(naam);
}

Bij het aanroepen geef je een tekstwaarde mee als argument:

halloNaam("Felix");
halloNaam("Lucas");

Zoals je ziet, wordt de waarde die je doorgeeft aan de parameter naam gebruikt binnen de functie om een gepersonaliseerde begroeting te printen. De functie zelf heeft geen idee welke naam zal worden doorgegeven; ze weet alleen dat ze een tekstwaarde (String) zal ontvangen, en noemt deze voor de duur van de functie naam. Pas wanneer je de functie aanroept, geef je de daadwerkelijke waarde door die je wilt gebruiken, hier: "Felix" en "Lucas".

Functies die een waarde teruggeven

Soms wil je dat een functie een waarde teruggeeft nadat deze is uitgevoerd, zodat je deze verderop kan gebruiken. In dat geval geef je het type van de teruggegeven waarde op als het return type van de functie, en gebruik je het sleutelwoord return om de waarde terug te geven. Hier is een voorbeeld van een functie die een geheel getal teruggeeft:

int kwadraat(int getal) {
    return getal * getal;
}

Zowel het type van de parameter (int getal) als het return type (int) zijn hier int, wat betekent dat de functie een geheel getal verwacht en ook een geheel getal teruggeeft.

Je kunt deze functie aanroepen en de teruggegeven waarde opslaan in een variabele:

int resultaat = kwadraat(5); // resultaat krijgt de waarde 25
Serial.println(resultaat);    // Print 25

Gekende voorbeelden nauwkeuriger bekeken

De functie delay(ms) heeft één parameter ms. Deze is van het type unsigned long, wat betekent dat je een natuurlijk getal (0 of groter) moet doorgeven dat het aantal milliseconden aangeeft om te wachten. Het return type is void, omdat deze functie geen waarde teruggeeft. Ze pauzeert alleen de uitvoering van de code voor de opgegeven tijd.

De functie digitalWrite(pin, HIGH) heeft twee parameters: pin (het nummer van de Arduino pin) en HIGH of LOW (de waarde om te schrijven). Het return type is void, omdat deze functie geen waarde teruggeeft. Ze zet alleen de opgegeven Arduino pin hoog of laag.

De functie analogRead(pin) heeft één parameter pin (het pinnummer). Het return type is int, omdat deze functie een geheel getal teruggeeft dat de gemeten analoge waarde op die pin vertegenwoordigt (tussen 0 en 1023).

Samenvatting termen

TermOmschrijvingVoorbeeld
FunctieEen blok code dat een specifieke taak uitvoert en kan worden hergebruikt.void hallo() { ... }
ParameterEen variabele die wordt gebruikt om informatie door te geven aan een functie.String naam in void halloNaam(String naam){}
ArgumentDe daadwerkelijke waarde die wordt doorgegeven aan een functieparameter bij het aanroepen van de functie."Felix" in halloNaam("Felix")
TypeHet soort gegevens dat een variabele of functie kan bevatten of teruggevenint, void, bool
Return typeHet type waarde dat een functie teruggeeft na uitvoering.int in int kwadraat(int getal)

Voorbeelden

void tafelVan(int nummer) {
    for (int i = 1; i <= 10; i++) {
        Serial.print(nummer);
        Serial.print(" x ");
        Serial.print(i);
        Serial.print(" = ");
        Serial.println(nummer * i);
    }
}
 
void setup() {
    Serial.begin(9600);
    tafelVan(5);
    tafelVan(7);
}
int Leds[] = {2, 3, 4, 5, 6};
void setup() {
    for(int led : Leds) {
        pinMode(led, OUTPUT);
    }
}
void loopLicht() {
    for(int led : Leds) {
        digitalWrite(led, HIGH);
        delay(500);
        digitalWrite(led, LOW);
    }
}
void loop() {
    loopLicht();
}