前回、M5StickCのpython開発環境についてまとめました。↓
それでは、今回より、「M5StickCでヌードボールペン&オオタニサンHR速報WEBスクレイピング機能付き時計」の作成に取り掛かりたいと思います。
まずは、「時計表示」の部分を作成しようと思います。
Thonny IDEを使用し、micropythonでプログラムを作っていきます。
なお、「ui FLOW」があればM5Stackで使用できるmicropythonの各種ライブラリが簡単に見つけられるので、こちらも準備しておいたほうが良いです。(詳細は上記過去記事で紹介しています。)
時計の構成
ボタンで呼び出し
今回作成しようとしている時計は、他にも2つ程機能を付け足したいので、Aボタン、Bボタンで機能を呼び出すような仕組みにしようと思います。
しかし、時計表示のプログラムは永久ループ処理が必要(多分。。)なので、ボタンで呼び出しは出来ても、再度ボタンイベントで違う機能を呼び出す、といった事が出来なくなります。ループを抜け出すのに物理ボタンのイベントが使えないっぽいです。(多分。。。)
したがって、ボタン操作以外でループ処理を切断する仕組みを考えます。
今回の場合、それを6軸センサ(加速度、ジャイロ)で実装する事にしました。
傾けると、ループを抜けるようにして、ボタンイベントを受け付けるようにしてみます。
では、プログラムを記述しておきます。
micropython
時計プログラム
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
from m5stack import * import imu from m5ui import * from uiflow import * imu0 = imu.IMU() lcd.clear(lcd.BLACK) #rtc.setTime(2021, 7, 15, 13, 22, 0) def buttonA_wasReleased(): lcd.clear(lcd.BLACK) label0 = M5TextBox(20, 120, "00", lcd.FONT_DejaVu24, 0xFFFFFF, rotate=270) label1 = M5TextBox(20, 83, ":", lcd.FONT_DejaVu24, 0xFFFFFF, rotate=270) label2 = M5TextBox(20, 67, "00", lcd.FONT_DejaVu24, 0xFFFFFF, rotate=270) while True: label0.setText(str(rtc.now()[3])) label1.setText(':') label2.setText(str(rtc.now()[4])) wait_ms(2) if 0 > imu0.ypr[1]: lcd.clear(lcd.BLACK) break btnA.wasReleased(buttonA_wasReleased) |
初めに、必要なライブラリをインポートしています。
imu0 = imu.IMU() は、6軸センサのインスタンスを作成しています。
コメントアウトしているrtc…は、一度読み込むと設定した時刻がM5StickCに記憶され、2次バッテリがへたるまではその時刻を基準に時刻を進めてくれます。ちなみに、一度読み込めば、後はコメントアウトしておかないと都度設定した時刻からカウントが始まってしまいます。
続いて関数に入りますが、これはAボタンのイベントです。
Aボタンがおされると時計表示させ、ループ処理内でRTCの時刻を元に時刻のカウントを進めています。
labe10等の変数には、時刻表示の位置、色、大きさ、向き、等を格納しています。
これはuiflowで確認すると調整しやすいです。
if 0 > imu0.ypr[1]: の部分が、6軸センサーを利用したロール角(ypr)の検知で、この値が0以下になれば、ループを抜けて画面を消去する動作にしています。(ボタン入力受付が可能になる)
引数の[1]は、x,y,z,の基準となる軸の設定となります。
動作確認
以上でごく簡単な時計(時間と分表示のみ)が完成します。
Thonny IDEからプログラムを実行すると、下のような感じになります。↓
次回は、ヌードボールペンの作成に入ります。