Arduino lessen/les 9: verschil tussen versies
k (Eelco heeft de pagina Arduino lessen/les 9a hernoemd naar Arduino lessen/les 9 zonder een doorverwijzing achter te laten) |
(→Tijd) |
||
(Een tussenliggende versie door dezelfde gebruiker niet weergegeven) | |||
Regel 1: | Regel 1: | ||
{{Zijbalk Arduino lessen}} | {{Zijbalk Arduino lessen}} | ||
== | == 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 <code>delay()</code> gebruikt om een bepaalde tijd te wachten. In deze les maken we kennis met andere functies die met tijd te maken hebben. | 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 <code>delay()</code> gebruikt om een bepaalde tijd te wachten. In deze les maken we kennis met andere functies die met tijd te maken hebben. | ||
De functie <code>millis()</code> geeft aan hoeveel milliseconden verstreken zijn sinds de laatste "reset | De functie <code>millis()</code> 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 <code>millis()</code> is een <code>unsigned long</code>, 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 <code>unsigned long</code> definieert. | Het resultaat van <code>millis()</code> is een <code>unsigned long</code>, 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 <code>unsigned long</code> definieert. |
Huidige versie van 27 aug 2015 om 07:18
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)