Blink Without Delay: de sketch die je beter eerst eens goed bekijkt.

Ik heb vragen gekregen over "BlinkWithoutDelay", wat dat betekent en waarom ik het daar telkens over heb.

Ik heb het daar zelfs over in elke post op het Arduino forum, want heb het deel van mijn handtekening (sign off) gemaakt.
Dat heb ik gedaan omdat het een heel goede manier is om tijdafhankelijke handelingen te doen, zonder alle andere handelingen te stoppen.
Want dat is wat de delay() functie doet.
Het zet vrijwel alles wat je Arduino doet stil, op de hartslag en het adem halen (bij wijze van spreken) na.

Arduino gaat vooral over leren, en daarom worden er met de Arduino IDE veel voorbeelden meegeleverd.
Om een start te maken met het leren, word er delay() toegepast.
Want bij je eerste stapjes ben je geholpen met niet al te complexe code.
Maar als je wat verder geraakt, zal de code ook al vanzelf complexer worden, en dan is 1 van de eerste hindernissen de delay() functie.
Met het voorbeeld BlinkWithoutDelay, word je een alternatief aangereikt zonder delay().
Het is vrijwel altijd beter (dus er zijn uitzonderingen) om delay() niet te gebruiken.
Alle uitleg daarover is eigenlijk al te vinden in dat voorbeeld, maar dat voorbeeld is zoals bij alle meegeleverde voorbeelden die ik heb gezien wel in het Engels.
Ik raad iedereen aan om eens die BlinkWithoutDelay sketch te bekijken.

En ermee te spelen.
Want van alleen kijken zul je weinig opsteken.
Speel er mee door wat dingen te veranderen in die sketch, en kijk wat dat voor resultaat heeft.
Dat geldt voor alle voorbeelden, want die zijn daar juist voor gemaakt.
Dan pas ben je echt aan het leren.

Je vindt die sketch in je Nederlandstalige IDE hier:

Nadeel van deze manier is dat ie nog langzaam "wegloopt", zeker wanneer je veel doet als de tijd is bereikt zoals bijvoorbeeld een gamescherm updaten. Zou je zo een geluidstoon produceren dan is die niet zuiver de gewenste toonhoogte maar een tikje lager. Dus tip: tel je interval op bij vorige moment, en niet bij de huidige uitlezing van millis()! Ik leer m standaard zo aan mijn leerlingen:

#define INTERVAL 1000
#define LEDPIN 13
unsigned long nextTick;

void setup(){
  pinMode(LEDPIN,OUTPUT);
  nextTick=millis()+INTERVAL;
}

void loop() {
  if (millis()>nextTick) {
    nextTick+=INTERVAL;
    digitalWrite(LEDPIN, !digitalRead(LEDPIN));
  }
}

Hallo. je verliest nog steeds ongeveer 500 microseconden per minuut. Gebruik om dezelfde code micros te hebben in plaats van millis.
Groeten.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.