Arduino lessen/les 9

Uit Lab
Naar navigatie springen Naar zoeken springen
Arduino lessen
  1. Blink - digitale uitvoer
  2. Button - digitale invoer
  3. Dimmer - PWM
  4. Dimmer - analoge invoer
  5. Seriële uitvoer naar host
  6. Analoge sensoren
  7. Beweging: servo
  8. Button - event
  9. Tijd - timers
  10. Blink - met timer

Tijd

Bij het meten en besturen van de fysieke omgeving speelt tijd een grote rol. De Arduino heeft verschillende manieren om met tijd om te gaan. Zo hebben we in eerdere voorbeelden de functie delay() gebruikt om een bepaalde tijd te wachten. In deze les maken we kennis met andere functies die met tijd te maken hebben.

De functie millis() geeft aan hoeveel milliseconden verstreken zijn sinds de laatste "reset" van de Arduino. Met behulp van deze functie kun je onder andere een tijdstip vast leggen, of de duur van een tijdsinterval. Voor een computer duurt een milliseconde relatief lang: in die tijd voert een Arduino duizenden instructies uit, of een PC miljoenen. Maar voor mensen en voor de fysieke wereld die zij ervaren is een milliseconde een maat die meer dan voldoende nauwkeurig is.

Het resultaat van millis() is een unsigned long, met een maximale waarde van 2^32-1 ofwel 4.294.967.295. Dit betekent dat de teller na ca. 49 dagen terugschiet naar 0. Dit overflow-probleem behandelen we later in deze les. Voor de meeste toepassingen is dat geen probleem. Je moet er wel om denken dat je variabelen met een milliseconde-waarde ook als unsigned long definieert.

Opdracht 1

Het onderstaande programma is een variant van Blink, waarbij er geen gebruik gemaakt wordt van de delay()-functie. Een nadeel van het gebruik van delay() is dat de Arduino tijdens die vertraging niet anders kan doen. In het bijzonder reageert het programma niet meer op gebeurtenissen in de buitenwereld, zoals het indrukken van een drukknop.

const int ledPin =  13;    // the number of the LED pin

int ledState = LOW;        // ledState used to set the LED
long nextEvent = 0;        // next time to reverse LED
 
long interval = 1000;      // interval (in msec) for blink

void setup() {
  pinMode(ledPin, OUTPUT); // set the digital pin as output    
}

void loop()
{ 
  if (millis() > nextEvent) {
    nextEvent = millis() + interval;  // next time to reverse LED
 
    if (ledState == LOW)  // reverse ledState
      ledState = HIGH;
    else
      ledState = LOW;

    digitalWrite(ledPin, ledState); // set the LED 
  }
}

Opmerkingen bij dit programma:

  • we kunnen de ledState ook zonder if-statement omkeren:
    • ledState = 1 - ledState (ga dit na, met LOW is 0, HIGH is 1)
    • we hebben dat hier niet gedaan in verband met de onderstaande opdracht.
  • bovenstaand programma gebruikt hetzelfde interval voor de aan-periode van de LED als voor de uit-periode.

Opdracht. Verander het programma zodat je een verschil kunt maken tussen de aan-periode en de uit-periode.

Opdracht 2

Maak met behulp van een LED, een button en de seriële uitvoer een reactiesnelheidmeter. Bepaal hoe snel de knop ingedrukt wordt nadat de LED is gaan branden. Probeer ook of het verschil maakt wanneer je de tijd meet na het uitdoven van de LED.

Opdracht 3

P.M. (reactieve systemen; overflow)