<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="nl">
	<id>https://infvo.nl/lab/index.php?action=history&amp;feed=atom&amp;title=Arduino%2FTimers</id>
	<title>Arduino/Timers - Bewerkingsoverzicht</title>
	<link rel="self" type="application/atom+xml" href="https://infvo.nl/lab/index.php?action=history&amp;feed=atom&amp;title=Arduino%2FTimers"/>
	<link rel="alternate" type="text/html" href="https://infvo.nl/lab/index.php?title=Arduino/Timers&amp;action=history"/>
	<updated>2026-04-26T12:59:16Z</updated>
	<subtitle>Bewerkingsoverzicht voor deze pagina op de wiki</subtitle>
	<generator>MediaWiki 1.43.3</generator>
	<entry>
		<id>https://infvo.nl/lab/index.php?title=Arduino/Timers&amp;diff=32&amp;oldid=prev</id>
		<title>Eelco: 1 versie</title>
		<link rel="alternate" type="text/html" href="https://infvo.nl/lab/index.php?title=Arduino/Timers&amp;diff=32&amp;oldid=prev"/>
		<updated>2014-03-26T21:06:27Z</updated>

		<summary type="html">&lt;p&gt;1 versie&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;nl&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Oudere versie&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Versie van 26 mrt 2014 21:06&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;nl&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(geen verschil)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Eelco</name></author>
	</entry>
	<entry>
		<id>https://infvo.nl/lab/index.php?title=Arduino/Timers&amp;diff=31&amp;oldid=prev</id>
		<title>Eelco op 6 okt 2013 om 17:45</title>
		<link rel="alternate" type="text/html" href="https://infvo.nl/lab/index.php?title=Arduino/Timers&amp;diff=31&amp;oldid=prev"/>
		<updated>2013-10-06T17:45:17Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nieuwe pagina&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Zijbalk Arduino}}&lt;br /&gt;
== Timers  ==&lt;br /&gt;
&lt;br /&gt;
== Reactieve programma&amp;#039;s ==&lt;br /&gt;
Een programma dat een robot, een auto, of een ander apparaat aanstuurt moet voldoende snel reageren op de verschillende invoer-sensoren. Ook bij een interactief programma zoals een browser speelt dit een rol. In het geval van een interactief programma betekent &amp;quot;niet snel genoeg&amp;quot; dat een gebruiker zich begint te ergeren. Maar voor een programma dat een apparaat bestuurt kan dit betekent dat er echt (fysiek) iets kapot gaat. De robot (of een auto) reageert te laat op een obstakel, en botst er hard tegenaan. Als er op &amp;quot;te laat&amp;quot; een grote straf staat spreken we van een (hard) real time system. Het liefst willen we in zo&amp;#039;n geval kunnen garanderen dat elke reactie op tijd komt.&lt;br /&gt;
&lt;br /&gt;
Een programma dat vooral bestaat uit reacties op een aantal inputs noemen we ook wel een *reactief programma*.&lt;br /&gt;
&lt;br /&gt;
===Timers (1) ===&lt;br /&gt;
&lt;br /&gt;
Bekijk het onderstaande programma:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
    void loop () {&lt;br /&gt;
      if (button_pushed(0)) {&lt;br /&gt;
        led_on(0);&lt;br /&gt;
        delay(2000);&lt;br /&gt;
        led_off(0); &lt;br /&gt;
      }&lt;br /&gt;
      if (button_pushed(1)) {&lt;br /&gt;
        led_on(1);&lt;br /&gt;
        delay(2000);&lt;br /&gt;
        led_off(1);&lt;br /&gt;
      }     &lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
De bedoeling van dit programma is dat zodra er een knop ingedrukt wordt, de bijbehorende LED aangaat gedurende 2 seconden, waarna deze weer uitgaat.&lt;br /&gt;
&lt;br /&gt;
: De functies &amp;lt;code&amp;gt;button_pushed()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;led_on()&amp;lt;/code&amp;gt;, en &amp;lt;code&amp;gt;led_off()&amp;lt;/code&amp;gt; werken we hier niet verder uit.&lt;br /&gt;
&lt;br /&gt;
Maar het programma werkt niet helemaal zoals bedoeld: als je een knop indrukt terwijl een LED brandt, gebeurt er niets. Gedurende de `delay(2000)` is het programma &amp;quot;doof&amp;quot; voor dergelijke invoer. &lt;br /&gt;
&lt;br /&gt;
We kunnen dergelijke problemen voorkomen door het programma anders op te zetten: het indrukken van een knop resulteert in een *event*; eventueel kunnen we dergelijke events bufferen. We proberen elke event snel af te handelen; bij het afhandelen van een event mogen we *niet wachten*. We mogen geen &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; gebruiken, maar ook bijvoorbeeld niet wachten op de invoer van een randapparaat, of op het resultaat van een database-query.&lt;br /&gt;
&lt;br /&gt;
In plaats van de &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt; moeten we ervoor zorgen dat we een event krijgen op het moment dat de LED uitgeschakeld moet worden. Dit kan door middel van een &amp;quot;timer&amp;quot;: een conditie die aangeeft dat een bepaalde tijdsduur verstreken is. Een dergelijke timer kunnen we maken in software, aan de hand van de milliseconde-klok. De Arduino-hardware beschikt ook over een aantal timers; deze worden onder andere gebruikt voor de genoemde milliseconde-klok. Ook de &amp;quot;analoge output&amp;quot;, in de vorm van pulsbreedtemodulatie (pulse widt modulation) maakt gebruik van een hardware-timer.&lt;br /&gt;
&lt;br /&gt;
De functie &amp;lt;code&amp;gt;millis()&amp;lt;/code&amp;gt; geeft het aantal milliseconden aan sinds de laatste reset van de Arduino, in de vorm van een &amp;lt;code&amp;gt;unsigned long&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: Het resultaat van &amp;lt;code&amp;gt;millis()&amp;lt;/code&amp;gt; is een &amp;lt;code&amp;gt;unsigned long&amp;lt;/code&amp;gt;: een 32-bits getal. De maximale waarde daarvan is 2^32-1, ofwel ca. 4*10^9 (ruim 4 miljard). Verder doortellen resulteert in &amp;quot;overflow&amp;quot;: de teller begint weer bij 0. De teller maakt dan een sprong terug: het lijkt dan alsof de tijd terugloopt. Voor een 32-bits milliseconden-timer treedt deze overflow op na `2^32/(1000*60*60*24)` dagen (1000 msec/sec, 60 sec/min, 60 min/uur, 24 uren/dag). Dit is bijna 50 dagen (49,71). In het dagelijks gebruik zul je niet snel tegen dit probleem aanlopen, maar als je een vaste opstelling met een Arduino maakt, bijvoorbeeld voor een home-control toepassing, dan moet je daarmee zeker rekening houden. (Denk bijvoorbeeld aan een thermostaat waarmee je een CV-installatie bestuurt.)&lt;br /&gt;
&lt;br /&gt;
Met behulp van deze &amp;lt;code&amp;gt;millis()&amp;lt;/code&amp;gt;-functie kunnen we het programma op de volgende manier opzetten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
    const infinitum = 4294967295ul; // 2^32-1, max unsigned long&lt;br /&gt;
    unsigned long led_timeout_0 = infinitum;&lt;br /&gt;
    unsigned long led_timeout_1 = infinitum;&lt;br /&gt;
&lt;br /&gt;
    void loop () {&lt;br /&gt;
      if (button_pushed(0)) {&lt;br /&gt;
        led_on(0);&lt;br /&gt;
        led_timeout_0 = millis() + 2000;&lt;br /&gt;
      }&lt;br /&gt;
      if (millis() &amp;gt; led_timeout_0) {&lt;br /&gt;
        led_off(0);&lt;br /&gt;
        led_timeout_0 = infinitum; &lt;br /&gt;
      }&lt;br /&gt;
      if (button_pushed(1)) {&lt;br /&gt;
        led_on(1);&lt;br /&gt;
        led_timeout_1 = millis() + 2000;&lt;br /&gt;
      }&lt;br /&gt;
      if (millis() &amp;gt; led_timeout_1) {&lt;br /&gt;
        led_off(1);&lt;br /&gt;
        led_timeout_1 = infinitum; &lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Merk op:&lt;br /&gt;
* de volgorde van de verschillende &amp;lt;code&amp;gt;if&amp;lt;/code&amp;gt;-statements doet er in dit geval niet toe.&lt;br /&gt;
* je kunt een timer ook gebruiken voor een periodiek event, bijvoorbeeld elke 2 seconden. Dit kun je gebruiken om elke twee seconden een LED om te schakelen. Zie het voorbeeld hieronder.&lt;br /&gt;
* een timer voor een niet-periodieke reactie in de toekomst (zoals hierboven) heet ook wel een *one-shot*. (ref).&lt;br /&gt;
&lt;br /&gt;
Het volgende programma is ontleend aan &amp;lt;code&amp;gt;BlinkWithoutDelay&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
    const unsigned long infinitum = 4294967295ul; // 2^32-1&lt;br /&gt;
    const int ledPin = 13;&lt;br /&gt;
&lt;br /&gt;
    unsigned long ledTimeOut = infinitum;&lt;br /&gt;
    int ledState = LOW;  // == 0&lt;br /&gt;
&lt;br /&gt;
    void setup () {&lt;br /&gt;
      pinMode(ledPin, OUTPUT); // initially, LOW&lt;br /&gt;
      ledTimeOut = millis() + 1000;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    void loop () {&lt;br /&gt;
       if (millis() &amp;gt; ledTimeOut) {&lt;br /&gt;
         if (ledState == LOW) {&lt;br /&gt;
           ledState = HIGH;&lt;br /&gt;
         } else {&lt;br /&gt;
           ledState = LOW;&lt;br /&gt;
         }&lt;br /&gt;
         digitalWrite(ledPin, ledState); // switch LED&lt;br /&gt;
         ledTimeOut = millis() + 1000;&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Opmerkingen:&lt;br /&gt;
* de omgekeerde waarde van een &amp;quot;logische&amp;quot; waarde &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; voorgesteld door 0 en 1, krijg je door de expressie &amp;lt;code&amp;gt;1-x&amp;lt;/code&amp;gt;. (Ga dit na.) Dit betekent dat we het binnenste &amp;lt;code&amp;gt;if&amp;lt;/code&amp;gt;-statement kunnen vervangen door: &amp;lt;code&amp;gt;ledState = 1 - ledState&amp;lt;/code&amp;gt;.&lt;br /&gt;
** in het geval van een logische waarde in de vorm van een Boolean, wordt dit: &amp;lt;code&amp;gt;ledState = !ledState`&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;!&amp;lt;/code&amp;gt; staat in C voor de Boolean &amp;#039;&amp;#039;&amp;#039;not&amp;#039;&amp;#039;&amp;#039;-operator).&lt;br /&gt;
&lt;br /&gt;
Opdrachten:&lt;br /&gt;
* pas het programma aan zodat een LED 1 seconde aan staat, en 2 seconden uit.&lt;br /&gt;
* gebruik twee LEDs en twee schakelaars: de LEDs knipperen regelmatig, het indrukken van de ene schakelaar halveert de knipperfrequentie, en indrukken van andere verdubbelt de knipperfrequentie.&lt;br /&gt;
&lt;br /&gt;
== Vervolg ==&lt;br /&gt;
&lt;br /&gt;
* Hoe kun je omgaan met overflow? (Dit is van belang voor timers die sneller verlopen dan de milliseconden-timer, die gebruik maken van een kortere representatie (8 of 16 bits), of die echt lang moeten kunnen lopen.)&lt;br /&gt;
* combineren van timers.&lt;br /&gt;
* timers in hardware. Aftellen naar 0 (voor alle timers gelijk).&lt;br /&gt;
* timers en interrupts.&lt;br /&gt;
* opmerking over logische (Boolean) waarden en condities in C (en C++).&lt;/div&gt;</summary>
		<author><name>Eelco</name></author>
	</entry>
</feed>