いきなりですが、M5StickC PlusライブラリのDeepSleep/LightSleepにバグが有り未だに修正されてません。
M5StickCで作ったDeepSleepを使うスケッチが巧く動かず帰ってこない事態になりかなり慌てました。
USB接続時にはDeepSleepにならない機能を付けてたのでその時は違うスケッチを書き込んで逃げれましたが。
DeepSleepが動くようにする
調べると回避する方法が見つかりました、DeepSleepが使えないと今後の使い方では使いにくくなるから一安心。
https://github.com/m5stack/M5StickC-Plus/issues/1
どうやらSleepに入るための前準備の関数「SetSleep」の実装バグのようです。
SetSleepの実装
プログラムの頭の方に修正されたコードを記述。
これでホームボタン等で強制復帰が可能となる。
void xSetSleep(void) //version M5stick-C plus
{
M5.Axp.Write1Byte(0x31, M5.Axp.Read8bit(0x31) | ( 1 << 3));
M5.Axp.Write1Byte(0x90, M5.Axp.Read8bit(0x90) | 0x07);
M5.Axp.Write1Byte(0x12, M5.Axp.Read8bit(0x12) & ~(1<<1) & ~(1<<2) & ~(1<<3));
}
スリープへ遷移
スリープへの移行は下記のコードで可能になる。
AXP192::DeepSleep関数の中でSetSleepを呼び出しているために必要部分を実装した。
//--- AXP192::DeepSleep(uint64)t time_in_us) の必要部分を抜き出し
xSetSleep(); // 修正版SetSleep
esp_sleep_enable_timer_wakeup(SLEEP_SEC(10)); // 10秒後に復帰
esp_deep_sleep(SLEEP_SEC(10));