#続・m5stackでストップウォッチを作る
前回記事の続きになります。
m5stackでストップウォッチを作る
https://qiita.com/zasshyu6/items/c0bd9bb592192b3c80e7
##前回の振り返り
-
5usec
周期でタイマをカウント - マルチスレッドで動かすと色々と不具合が発生
- 4secぐらいでリセットがかかる(
vTaskDelay()
をかけると止まらない) - ボタンを押してもタイマが止まらない時がある
- 4secぐらいでリセットがかかる(
前回記事を読んでいただいて以下のご指摘を受けました
- 'core1'で二つタスクが回ってるので
WDT
で引っかかっているのでは?-
esp_task_wdt_feed()
関数を時間切れ前までに呼ぶといい
-
##試すこと
- マルチスレッドで止まらないように作る
- ボタンで止まるようにプログラムを変更
- ついでに画面ちらつきが気になるので直してみる
全部修正したmain.cppをgithubに上げました。
https://github.com/zasshyu66/m5stack_Study/tree/master/StopWatch3
####マルチスレッドで止まらないように作る
esp_task_wdt_feed()
関数を調べてみたらどうやらESP-IDF
の関数だった模様
arduino
からは呼び出せない上に、WDT
にアクセスする方法が見当たらなかったので別の方法を考えてみます
-
Core0
でThread1
,Core1
でloop
を動かす- 4secくらいでやはり止まる。
-
vTaskDelay(1)
をThread1
に入れる- 前回と同様にしっかり動く。
loop
は別処理で監視周期呼び出しがあるのでこれで二つのtaskが監視周期をもつことになる - ちなみに
vTaskDelay(0)
だとビルドは通るが4secくらいでリセットがかかります
- 前回と同様にしっかり動く。
loop
の監視周期を外そうとか、CONFIG_FREERTOS_HZ
を変更するとか、監視やクロック関連をいじるのも視野に入れましたが、ファイル管理の面で手間がかかるため却下しました。
ESP-IDF
を使う理由ができたかもしれない・・・
####ボタンで止まるようにプログラムを変更
これはチャタリング防止の部分のバグでした
マルチスレッド関係なかった
チャタリング防止を修正で完了
####画面ちらつきが気になるので直してみる
画面のちらつきが気になる・・・ので直したい
以下の記事が出てきました。
M5Stackでいろいろやってみた。
https://togetter.com/li/1214295?page=3
TFT_eSPI library
のSprite
を使えばいいらしいが・・・どうやって使えばいいんだ・・・
色々調べてみたらplatformio
がサンプルを出してくれていた
TFT_eSPI by Bodmer
https://platformio.org/lib/show/1559/TFT_eSPI/examples?file=Print_Smooth_Font.ino
TFT_eSPI library
が基本的に公式のLCD API
とほぼ同じ使い方ができる
Sprite
とは・・・
大きいのは文字の設定が文字の色と背景色を選択できること
LCD API
の場合はほんとに上書きだけなので文字が重なるのだが、TFT_eSPI library
だと背景色と文字の描写なのでそのまま上書きできる
だから文字位置を覚えておけばそこから改行して書き直せばよいだけになるので考え方がだいぶ楽になります
##次にやること
次にパルスカウンターを作ります。
エンコーダを買いたかったけど千石電商に売ってたのは一回転で24plsのものだけだった・・・
でも買えたのでそれを使ってパルスカウントと回転速度を表示するプログラムを作ります
・・・余談ですが今回の調べものや記事を書いている途中でマウスのホイールが壊れました
まさかホイールの回転を見るスイッチにつながってる軸が折れるとは思わなかった