Skip to article frontmatterSkip to article content

5. Knipperende LED

Schakeling: LED aangesloten op pin 0

In dit voorbeeld gebruiken we een timer om de LED periodiek aan- en uit te schakelen: we krijgen zo een knipperende LED.

Programma:

from microbit import *
import utime

led = pin0

period = 2000 # ms
on_period = period // 2

timer_limit = 0 # gives immediate time_out
state = 0

while True:
    now = utime.ticks_ms()
    if utime.ticks_diff(now, timer_limit) > 0: # now > timer_limit?
        if state == 0
            state = 1
            led.write_digital(1)
            timer_limit = utime.ticks_add(now, on_period)
        else:
            state = 0
            led.write_digital(0)
            timer_limit = utime.ticks_add(now, period - on_period)

Toelichting. Dit programma heeft dezelfde opzet als het programma voor het aan- en uitzetten van de LED met één enkele aan/uit-knop. (Vergelijk deze.). De schakelaar-event is nu vervangen door een timer-event. Als de timer afloopt (now > timer_limit) schakelen we de led aan of uit, afhankelijk van de toestand. Daarbij zetten we direct timer_limit voor de volgende timer-event: de timer is altijd actief. (Dit is een periodieke timer.)

De tikken kunnen “rond tellen”: als utime.ticks_ms() de maximale waarde bereikt heeft, begint deze weer bij 0 te tellen. Dit betekent dat de vergelijking tussen now en timer_limit wat ingewikkelder is dan een vergelijking tussen 2 “normale” getallen. Door het verschil now - timer_limit te schrijven als utime.ticks_diff(now, timer_limit) los je dat probeem op. Op eenzelfde manier schrijf je now + on_period als utime.ticks_add(now, on_period).

N.B.: now > timer_limit kun je ook schrijven als now - timer_limit > 0 ; voor deze laatste vorm kun je dan de diff-functie gebruiken.

Toestandsdiagram knipperende LED

Toestandsdiagram knipperende LED

In dit toestandsdiagram is (ten opzichte van de LED aan/uit schakeling) de knop-event vervangen door een timer-event.

Opdracht 1. Bouw de schakeling, laad het programma op de microbit, en demonstreer de werking.

Opdracht 2. Verander de periode van de knipperende LED, bijvoorbeeld naar 1000ms (of nog kleiner). Wat is het effect? Wat is het effect als je de periode verkleint tot 10 ms?

Opdracht 3. Verander on_period als fractie van period, bijvoorbeeld naar 1/8. Wat is het effect? Wat is het effect als je dit combineert met een periode van 10 ms?