Hoe schrijf ik een functie voor Arduino?

Posted at September 22, 2012

This post is in Dutch because it is only useful for my fellow students.

In deze post leg ik wat basis dingen uit over hoe je functie’s voor je Arduino schrijft. Je schrijft je code voor je Arduino in Java Arduino taal en dat heeft een net iets andere syntax dan wat je misschien gewend bent.

Het antwoord van de eerste huiswerkopdracht voor week 3 staat onderaan.

Functie maken

Standaard hebben alle Arduino scripts twee functie’s: Loop en Setup. Hieruit kunnen we al aflezen hoe een functie eruitziet, dit is hoe je een functie declareert (ofwel maakt):

void setup() {
  // code
}

Woord voor woord:

  • void: laat dit maar even voor wat het is: een functie begint met void.
  • setup: de naam van de functie. Dit moet zonder spatie’s
  • (): hiermee geef je aan dat het een functie is.
  • {: hiermee geef je aan de je de functie opent.
  • // code: dit is een comment, alles wat begint met // wordt niet uitgevoerd.
  • }: hiermee geef je aan de je de functie sluit.

Alles binnen { en } is staat voor wat de functie moet doen.

Bij Arduino mag je alle functie’s maken die je wilt, je mag ze noemen hoe je wilt (je mag niet twee dezelfde namen hebben) en het is hoofdletter gevoelig. Functie’s hebben drie gouden regels:

  • Je kan alle functie’s maken die je wilt, maar je moet de functie’s setup en loop maken in je code (eis van Arduino).
  • Je declareert (maakt, zie hierboven) functie’s nooit in een andere functie (de basis versie in ieder geval).
  • Een functie wordt pas uitgevoerd als je hem uitvoert. De enige uitzonderingen hierop zijn loop en setup, deze voert Arduino zelf uit.

Schone lei

Je hebt waarschijnlijk al wat code van je knightrider, maar het is handig om even clean te beginnen met deze code:

void setup(){
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
}

Je ziet in totaal 6 keer het commando pinMode. Dit commando vertelt dat we in de pinnetjes 2 tot 7 lampjes hebben aangesloten (6 in totaal).

Dit alles staat in de functie setup die we hebben aangemaakt. Setup is een functie die automagisch wordt uitgevoerd zodra je de Arduino aanzet.

Daaronder staat de gemaakte functie loop die niets doet. Deze moeten we toevoegen aan Arduino omdat hij hem uit probeert te voeren.

Onze eigen functie (huiswerk opdracht)

De opdracht voor week 3 is “Schrijf 2 functie’s”: eentje die een lampje aanzet en eentje die meerdere lampjes aanzet. We moeten onze functie’s een naam geven, dus laten we de eerste functie zetLampjeAan noemen.

Ik zal hier de eerste functie uitwerken:

Onder de code hierboven gaan we een nieuwe functie maken:

void zetLampjeAan() {

Nu moet er een lampje worden aangezet. Als we kijken naar het knight rider example zien we deze code terugkomen:

digitalWrite(2, HIGH);

En dit is ook precies de code die je nodig hebt om een lampje aan te zetten. Welk lampje? Het lampje aangesloten op poort 2 van je Arduino (zie de 2 tussen haakjes).

Nu we dit weten zouden we een functie kunnen maken die lampje twee aanzet:

void zetLampjeTweeAan() {
  digitalWrite(2, HIGH);
}

Als je deze functie onderaan de code ergens neer zet en het probeert uit te voeren hebben we een probleem: Lampje twee gaat niet aan.

Dit komt door gouden regel 3: een functie wordt pas uitgevoerd als je hem uitvoert.

Als je nu de functie uitvoert in de setup, kom je in totaal op deze code:

void setup(){
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  // zet lampje twee aan
  zetLampjeTweeAan();
}

void loop() {}

Als je dit uitvoert zal lampje twee gaan branden!

Maar de opdracht luidt zet een lampje aan, dus:

// niet zo
// zetLampjeTweeAan();

Om dit te doen moet je een variabele begrijpen. We kunnen ons zetLampjeTweeAan functie ook zo schrijven:

void zetLampjeTweeAan() {
  int lampje = 2;
  digitalWrite(lampje, HIGH);
}

We maken een nieuwe variabele aan genaamd lampje, het woord int (wat getal betekent in het engels) zegt dat de variabele een getal bevat. Met = 2 zeggen we: het getal wordt 2. Dit geeft hetzelfde resultaat als ons eerdere voorbeeld.

Je kan ook een getal toekennen aan een variabele (2 aan lampje). Een andere manier is via een argument, zie in een eerdere PHP tutorial wat voorbeelden van argumenten.

Het komt erop neer dat als je zo’n fuctie hebt:

void zetLampjeAan(int lampje) {
  digitalWrite(lampje, HIGH);
}

en je hem zo uitvoert:

zetLampjeAan(2)

lampje twee aan gezet wordt. en als je nu zegt:

zetLampjeAan(3)

dan zet hij lampje drie aan!

Je geeft het getal mee aan de functie en dit getal wordt aan de variabele lampje toegekend, dus vanaf het begin is lampje 3 (in dit geval).

Oftewel dit is de totale code van de eerste opdracht:

void setup(){
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);

  zetLampjeAan(2);
}

void loop() {}

void zetLampjeAan(int lampje) {
  digitalWrite(lampje, HIGH);
}

Zorg wel dat je 6 lampjes op poort 2 tot 7 hebt aangesloten (zie de tutorial).

Svp even testen, heb ik niet gedaan namelijk.

Posted at September 22, 2012, under hardware.