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 ("タイマー処理開始")
#以上