3.3. Liczniki wirtualne

Strona Pomiar czasu omówiła znaczniki czasu oraz nieblokujące pętle sterowane przez time.ticks_diff(). Licznik wirtualny to ich druga strona: oprogramowanie prosi środowisko uruchomieniowe o wywołanie funkcji według harmonogramu, a środowisko wywołuje funkcję zwrotną bez konieczności samodzielnego sprawdzania zegara przez skrypt.

3.3.1. Klasa machine.Timer

machine.Timer tworzy licznik wirtualny. Zachowanie niezależne od portu wymaga specjalnego id -1; wszystko inne – okres, tryb, funkcja zwrotna – ustawia się za pomocą argumentów nazwanych:

from machine import Timer

def tick(t):
    print("tick")

tim = Timer(-1)
tim.init(period=100, callback=tick)   # 10 Hz

Funkcja zwrotna jest wywoływana jak każde zwykłe wywołanie funkcji – może alokować obiekty, używać print() oraz wywoływać inny kod biblioteczny bez żadnych specjalnych ograniczeń.

3.3.2. Tryb okresowy i jednorazowy

Dostępne są dwa tryby:

  • Timer.PERIODIC (domyślny). Funkcja zwrotna uruchamia się co period milisekund, w nieskończoność, dopóki nie zostanie wywołana deinit() lub licznik nie zostanie ponownie zainicjalizowany.

  • Timer.ONE_SHOT. Funkcja zwrotna uruchamia się raz, period milisekund po init(), a następnie licznik się zatrzymuje.

Timer(-1).init(mode=Timer.ONE_SHOT, period=2000, callback=fire)

deinit() zatrzymuje licznik okresowy i anuluje wszelkie oczekujące wywołania zwrotne:

tim.deinit()

3.3.3. Kiedy sięgnąć po licznik

Liczniki wirtualne oraz wzorzec odpytywania z ticks_diff() z Pomiar czasu rozwiązują ten sam problem z przeciwnych kierunków. Odpytywana pętla sprawdza zegar w każdej iteracji i działa, gdy minie wystarczająco dużo czasu; licznik prosi środowisko uruchomieniowe o wybudzenie skryptu, gdy minie wystarczająco dużo czasu.

  • Odpytywany ticks_diff. Wszystko pozostaje w jednym miejscu – pętla jest właścicielem pomiaru czasu, nie ma dodatkowych funkcji zwrotnych do śledzenia. Najlepszy do krótkiej, dobrze zdefiniowanej pracy, która wiąże ze sobą kilka zadań sterowanych czasem.

  • Licznik wirtualny. Przenosi harmonogram poza ciało pętli. Najlepszy, gdy zadanie okresowe jest niezależne od głównego przepływu (dioda LED sygnalizująca pracę, okresowa próbka z sensora) i pozwala głównej pętli poświęcić czas na inną pracę.

Oba podejścia używają tego samego zegara bazowego i dają tę samą dokładność przy okresach rzędu milisekundy lub większych. Żadne z nich nie nadaje się do precyzyjnego przełączania pinów ani generowania przebiegów o czasach poniżej milisekundy – opóźnienie funkcji zwrotnej jest rzędu taktu planisty, a nie nanosekund.