Arduino Hello World
logo

Arduino Hello World

Module 1 Module 2 Module 3 Module 4 Module 5 Module 6 Module 7

   Iteratie


Bij een iteratie (herhaling) wordt een deel van het programma meerdere keren uitgevoerd.

Je hebt er een specifiek stukje code voor nodig, een while() of een for() functie.

Bij while() wordt het programma gepauzeerd en de code van de while()-lus herhaalt zolang de voorwaarde waar is. Bij for() wordt de code een vast aantal keren herhaald, bijvoorbeeld 10 keer, en dan stop je.

Kijk nog eens naar de basistructuur van een Arduino sketch. De loop() fase is eigenlijk een verborgen while()-lus. Die wordt oneindig keren herhaald.

  Opdracht 1

Maak de schakeling met een drukknop:

Kopieer beide codes in een nieuwe sketch, onderzoek het verschil tussen een if...else() en een while() functie. Let op wat er gebeurt met de tijd wanneer je de drukknop indrukt. Open hiervoor de serial monitor.

Drukknop met if...else() en timer

// Fase 1: declaratie en initialisatie fase (wordt eenmalig doorlopen bij opstarten)
int knopPin = 2;  // Drukknop aangesloten op digitale pin 2
int knopStatus = 0;  // Variabele die de status van de drukknop opslaat
long timer = 0;  // Variabele om de tijd in op te slaan, datatype long omdat dit snel grote getallen worden

// Fase 2: setup fase (wordt eenmalig doorlopen bij opstarten)
void setup() {
  pinMode(knopPin, INPUT);  // Zet knopPin als input
  pinMode(LED_BUILTIN, OUTPUT);  // Zet de interne led, pin 13 als uitgang
  Serial.begin(9600);  // Start de seriële communicatie
}

// Fase 3: loop fase (wordt blijvend herhaald)
void loop() {
  knopStatus = digitalRead(knopPin);   // Lees de status van de knop en stockeer in knopStatus

  if (knopStatus) == HIGH) {  // Indien de drukknop is ingedrukt
    digitalWrite(LED_BUILTIN, HIGH);  // Zet de led aan
  } else{
    digitalWrite(LED_BUILTIN, LOW);  // Zoniet, zet led uit
  }
  timer= millis ();   // Start tijd met de functie millis() en stockeer in timer
  Serial.println (timer); // Print de verstreken tijd in ms
}

Drukknop met while() en timer

// Fase 1: declaratie en initialisatie fase (wordt eenmalig doorlopen bij opstarten)
int knopPin = 2;  // Drukknop aangesloten op digitale pin 2
int knopStatus = 0;  // Variabele die de status van de drukknop opslaat
long timer = 0;  // Variabele om de tijd in op te slaan, datatype long omdat dit snel grote getallen worden

// Fase 2: setup fase (wordt eenmalig doorlopen bij opstarten)
void setup() {
  pinMode(knopPin, INPUT);  // Zet knopPin als input
  pinMode(LED_BUILTIN, OUTPUT);  // Zet de interne led, pin 13 als uitgang
  Serial.begin(9600);  // Start de seriële communicatie
}

// Fase 3: loop fase (wordt blijvend herhaald)
void loop() {
  while (digitalRead(knopPin) == HIGH) {  // Wanneer de drukknop is ingedrukt
    digitalWrite(LED_BUILTIN, HIGH);  // Zet de led aan
   }
   timer= millis ();   // Start tijd met de functie millis() en stockeer in timer
   Serial.println (timer); // Print de verstreken tijd in ms
   digitalWrite (LED_BUILTIN, LOW);   // Indien de knop niet is ingedruk, led uit
}

 
 


millis()

In bovenstaande oefening gebruiken een nieuwe functie om tijd te registreren. Lees de documentatie van de functie millis(). De functie heeft geen extra info (parameters) nodig.

millis ()

Herinner je opdracht 3 bij de functie delay() waarbij de vraag was:

Kan 2 leds laten knipperen met de delay() functie waarbij LED 1 pinkt elke 700ms en LED 2 elke 1200ms pinkt?

Met een delay() functie lukt dat niet, maar met een millis() functie kan dat wel.

Wil je weten hoe dat moet?

De oplossing vind je bij de Arduino examples. Ga naar File > Examples > 02.Digital > BlinkWithoutDelay.