M5Paper温度計ロガーを無理やりDeepSleepしちゃう
で簡易版の温度チェッカー+SDカードへログ取りまでは作ったのですが、やっぱりDeepSleepしてバッテリーの減りを抑えたい!
とゆーわけで、かなり無理やりですが、なんとかかんとか実現してみました。
今までの問題点として
①DeepSleep復帰後にはCPUがリセットされてしまうので、前の情報すっかり忘れてしまう(NTPの時間情報など)
②NTPを取得するにはWiFiに接続しないといけない
の二点が大きな問題でした。
解決策
としては…
・外部記憶(SDカード)を使って時間情報とか残しておいたら?
ということが考えられますね。
SDカードは何度も使っている実績のある方法なので(前回もログ取りでつかったし)以前のルーチンの使いまわしでいけちゃいそう。
M5Stack系にもともと入っている不揮発メモリを使うって手のほうがクールっぽいけれどつかったことないので、まずはSDでやっつけてみましょう……。
SDにtm構造体(時間情報を保存している構造体)の内容を保存しておいて、再起したときには、どのくらいDeepSleepしたかの睡眠時間は分かっているので、それを加算すればいいじゃない。ってわけ。
というところまではよかったのですが、SDから取り出したtm構造体の情報をtime関数等が現実に使っているM5Paper内部の情報へのセットの仕方がわからない……。ライブラリの中までしらべるのめんどうくさいなあ(めんどくさがりw)
かといって、睡眠開始時間をSDに保存して、それプラス睡眠時間を自前で計算するのももっとめんどくさい……(単なる60秒で1分くりあがり、で、かける24時間ぐらいならいいけれど、カレンダーとか実装しようとしたらめんどくささMAX! 太陽暦きらい!><)
なーのーでぇー
投げやりモード
だいたいそういうところはもうちょっとライブラリのバージョンがあがって使いやすくなったらワタシが苦労しなくてもできるようになるはず!(他力本願)
基本的に、電源投入時はSDカードを入れてのログ取りをお家なりWiFiに接続できている状態で行われていたという前提にしちゃいます。そうすれば、少なくとも一度はSD内に時間情報が書き込まれたログ行があるはず。
NTPの時間取得が上手くいっていない(WiFi接続ができていない=M5Paperが現実の時間がわからない)状態の時は、通常時刻を書くところに「Maybe +60sec after…」といれちゃおう。という、かなり投げやりで無理やりな解決法を取ることにしました。
電池切れになるまで、(DeepSleep時は寝てるけれど)常に動いているという前提なので、SD内のログの前の方を見れば、その時点での時刻は分かるはずなので、それから何行か、で、見る人がしらべてね。ということですね。
プログラムはこんなかんじ
だいぶ変更(追加)点が多いのでGitHubで。見ていただければわかるけれど、めっちゃ無理やりですw (はずかしーw)
テスト用に3秒間隔にして高速実行した画面がこんなかんじ
だいじぶ、ちゃんと今年(21年)の表示になってます(そこかw)
その他も一応想定通りのようです。
バッテリー駆動状態にすると
こうなりました。かすれて見えますねー。最新の行だけは綺麗にでているので、これで現在時刻と気温の状態がわかるということにしましょう。
ちなみに、行の左端にバッテリーの%表示もいれておきました。
バッテリー表示をよく見ると
どうやら電源に接続しているときには1%と表示される模様。と、いうことは……。
そこで電源接続されているかどうかの判定ができそうです。
で、やってみたのがこの版。
いちおう、動作テストはできたので、明日以降、長時間ログを取って試してみようと思います♪
まだ謎な不具合
これ、全分を画面分を
canvas.createCanvas(540,960);
してしまって、
canvas.pushCanvas(0,0,UPDATE_MODE_DU4);
なかんじに、左上の原点(0,0)座標からまるっとUPDATEして画面を書き換え(書き足し)してしまっているので、電池的にもメモリ的にももったいない書き換え方になっています。
なので、最新の書き換えたい行部分領域だけの、
canvas.createCanvas(540,16)
のようにして、UPDATEする場所を指定するようにしたら、綺麗にできるんじゃないかしらん?
と、やってみたのがコレ
うヴぁー><
過去の情報がかすれるどころか、最新のも読めなくなっちゃいました><
ちょっとやり方を間違えている気がするので、この方法はもうちょっと調査してから設定してみよーとおもいます><
いちおう、最新版はこちらに置いておきマース☆