Micropythonでの定期的処理「Timer」の使い方

 

例えば1秒毎にスイッチのON/OFF状態を検出するのに使えるTimer処理。これまでは例えばmqttで5秒ごとにデータを送るのにsleepを使っていましたが、
Timer割込み処理のほうが設計意図に合致しています。

以下の出典とコードでほぼ理解できました。

後の機会に実装を試してみたいと思います。


出典
https://tech-and-investment.com/raspberrypi-pico-15-timer-interrupt/
↑この出典のサンプルコードを引用、コメントを書換え

#codeーーーーーーーーーーーーーーーーーーーーーー

from machine import Pin, Timer
import micropython,time

#割込み処理中の例外処理バッファ領域の確保
micropython.alloc_emergency_exception_buf(100)

# GPIO定義
blink = machine.Pin(16, machine.Pin.OUT)
light = machine.Pin(17, machine.Pin.OUT)

# タイマーオブジェクト生成
blinkTimer   = Timer()
oneShotTimer = Timer()

# 割込発生時の処理を関数で定義・例その1
def blinkFunc(timer):
    global blink    # 関数外定義ピン参照
    # LED状態反転
    if blink.value() == 0 :
        blink.value(1) # 点灯        
    else:
        blink.value(0) # 消灯

# 割込発生時の処理を関数で定義・例その2
# 一定時間後にLEDを点灯
def oneShotFunc(timer):
    global light   # 関数外定義ピン参照
    light.value(1) # 点灯
    
#以上が定義。以下が主ルーチン

# 初期状態の設定 #LEDを消灯
blink.value(0)
light.value(0)

#割込タイマーの設定。起動・その1
# 周期的に実行(周波数指定)
# mode=Timer.PERIODIC
# 割込み周期:freq(Hz:秒単位)
# 割込処理先:callback=関数名
blinkTimer.init(mode=Timer.PERIODIC, freq=1, callback=blinkFunc)

#割込タイマーの設定、起動・その1の別例
# 周期的に実行(周波数指定)、mode指定なし
# 割込み周期:period(msec:ミリ秒単位)
#blinkTimer.init(period=1000, callback=blinkFunc )

#割込タイマーの設定、起動・その2
# mode=Timer.ONE_SHOT
# 3000ms 後に1度だけ実行
oneShotTimer.init(mode=Timer.ONE_SHOT, period=3000, callback=oneShotFunc)

# メイン処理だが、動作記述は必要なく、
# 上述にてタイマーは起動済、タイマー割込発生都度、処理実行。

print ("タイマー処理開始")

#以上