今年はM5Stack Atom Liteで給水ポンプを制御する水やり装置を作ってみようとしましたが、7日経たずに電池が切れたのでどこで電力を消費しているのかと調べてみたところ、M5Stack系はスリープ時も10mA前後消費するという記事をいくつか見つけました。
ちなみに昨年のobniz版の記事はこちらです。
obniz Board 1Yで自動水やりの屋外対応版を工作してみた
そこで自分も、実際に1.2vのニッケル水素電池 3本、おおよび3.7vくらいの電源をAtom Liteにつなぎ、スリープ時に流れている電流を測ってみたので記録しておきます。
こちら、起動時に計測した電流です。44mAほど流れています。
次に、スリープ(Hibernate)時に計測した電流は、6mA強です。こちらは、電源電圧が大きいともう少し大きくなります。
計測した際に使ったスケッチはこちら、一応Hibernateするようにしていますが、とくにオプション有効のままのディープスリープでも流れている電流は同程度でした。
#define TIME_TO_SLEEP 6 * 60 * 60
#define TIME_TO_WATERING 20 * 1000
void setup() {
unsigned long starttime = millis();
esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_OFF);
esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_SLOW_MEM, ESP_PD_OPTION_OFF);
esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_FAST_MEM, ESP_PD_OPTION_OFF);
esp_sleep_pd_config(ESP_PD_DOMAIN_MAX, ESP_PD_OPTION_OFF);
// long long型を指定する
uint64_t sleeptime = TIME_TO_SLEEP * 1000000ULL - (millis() - starttime) * 1000;
esp_sleep_enable_timer_wakeup(sleeptime);
esp_deep_sleep_start();
}
void loop() {
}
ところで、esp_sleep_enable_timer_wakeup
関数の引数は、マイクロ秒を型uint64_t(64bit符号なし整数)で指定しますが、はじめ以下のように「1000000」のままにしていたところ計算結果が32bit整数になってしまいどんなに長い時間を指定しても2分程度で復帰するというミスに少々ハマってしまいました。。
uint64_t sleeptime = TIME_TO_SLEEP * 1000000 - (millis() - starttime) * 1000;
正しくは、以下のようにULLをつけて符号なし64bit整数を式に含めることで長い時刻をちゃんと計算できるようになります。
uint64_t sleeptime = TIME_TO_SLEEP * 1000000ULL - (millis() - starttime) * 1000;