MicroPythonで経過時間の測定をしてみよう

マイクロビットのMicroPythonでプログラムが開始してから、何らかのアクション(今回はボタンAを押す)が実行された時の経過時間を表示したいとします。


MakeCodeであれば、



経過時間の計測用のずっとブロックと、ボタンA用のずっとブロックといった形でずっとブロックを2つ使ったり、



ボタンAのイベントを切り分ける事ができますが、MicroPythonでは基本的にずっとブロックに該当するwhile True:は一回しか使用できません。

ビジュアル言語のMakeCodeからテキスト言語のMicroPythonに書き換えてみよう


from microbit import *

# 経過時間(秒)を記録する為の変数
elapsed = 0

while True:
    elapsed += 1
    sleep(1000)

のようにしたいところですが、この書き方ですと、ボタンAのようなイベントを追加することが出来ません。


経過時間を計測しつつ、何らかのイベントを追加するためには一時停止(MicroPythonではsleep)ではない方法で時間の計測を行う必要があります。


計測を行うためにutimeライブラリのticks_msを使ってみます。

utime -- 時間関連の関数 — MicroPython 1.13 ドキュメント#utime.ticks_ms


ticks(ティックス)というのは、システムが刻む最小の時間単位を指し、Python3のutimeの1ticksは1ミリ秒(0.001秒)になるそうです。


ticks_msを使ったコードでは下記の二点を意識します。

・開始時間を必ず取得しておく。

・計測時間を確認したい時に(今の時間 - 開始時間)の値を取得する


この二点を加味したコードは下記のようになります。

from microbit import *
import utime

# 計測開始の合図
display.scroll("start.")

# スタート時の時間を記録
start_time = utime.ticks_ms()

while True:
    if button_a.was_pressed():
        display.clear()
        # 経過の秒数を表示
        # (今の時間 - 開始時間)で経過時間を知る
        # 1000で割ることで「秒」に変換
        elapsed = int((utime.ticks_ms() - start_time) / 1000)
        display.scroll(str(elapsed) + "s")
        break

今回のコードではボタンAを押した時に始めて経過時間を計算しますが、もし5秒以上経過していないとボタンAを押しても有効にならないといった事をしたければ、while True:の下の行に

elapsed = int((utime.ticks_ms() - start_time) / 1000)

をする必要があります。

京都の東本願寺で開催されているプログラミング教室で講師をしています。
詳しくはTera schoolを御覧ください。
同じカテゴリーの記事
マインクラフト用ビジュアルエディタを開発しています。

詳しくはinunosinsi/mcws_blockly - githubをご覧ください。