IoT何をいまさら(49) M5Stack、バッテリ切れを測る

JosephHalfmoon

前回、M5Stackの充電状態とかバッテリのレベルとかを測れることが分かったので、今度はバッテリが放電しきってプログラムが実行できなくなるまでの様子を測ってみたいと思います。LCD画面ONとOFFとか、WiFiのON/OFFとかいろいろ比較したい条件があるのですが、まずは「素」のままで測定できるようにします。測定といっても何のことはない、SDカードに時間(ほぼ)とそのときのバッテリレベルを記録していくだけですが。

フル充電を待ちきれなかったのと、とりあえずの動作確認をしたかったので、

十分少々ほど充電したフルじゃない状態

で第1回の測定をしてみました。LCD画面はONのまま、充電も中途半端なのでごく短時間でお亡くなりになること必定。グラフがこちら。縦軸がバッテリレベル、横軸が「だいたい」の時間「分」です。

26分後にバッテリレベル0が報告された後、動作を停止しています。これから分かるのが、

バッテリレベル、0から100といいつつ、実際には5段階

じゃないかということ。前回、そんな感じがしていたのですが、実際そうでした。100、75、50、25、0と。0になっても1回はデータを書き込めているところが運が良かったのか、そんなものなのか。

さて、このグラフは、SDカードに大体の時間とそのときのバッテリレベルを書き込んで描いたものです。そのときに使ったSDカード書き込み関数はこちら。

bool writeLogFile(const char* fnam, int ts, int bat) {
  File f;
  f = SD.open(fnam, FILE_APPEND);
  if (f) {
    String dataString = String(ts);
    dataString += ",";
    dataString += String(bat);
    f.println(dataString);
  }
  f.close();
}

引数にファイル名と、時間のつもりのtsとバッテリレベルのつもりのbatをとってファイルにアペンドしていくだけのもの。ただ、バッテリ切れのギリギリまで動作させるがために、書き込みは 2つのファイルに同じものを書き込んでみています。loop()の中の書き込み部分はこんな感じ。

  if (!M5.Power.isCharging()) {
    String minStr = String(minIDX);
    int batLev = M5.Power.getBatteryLevel();
    writeLogFile(fname1, minIDX, batLev);
    writeLogFile(fname2, minIDX, batLev);
    M5.Lcd.println(minStr);
    minIDX += 1;      
  } else {
    M5.Lcd.println("NO LOGGING.");      
  }

1つのファイルの書き込みの途中で、電圧が下がって落ちてしまってファイルが壊れてしまったとしても、もう一つのファイルが残っている筈なので、落ちる前のところまではデータが残っているだろう、という甘い考えです。

なお、バッテリにチャージしている(USBケーブルで充電中)最中はこのシーケンスは動作せず、USBケーブルを抜くと記録動作を始めるようになっています。

これをloop()の中で、delay()関数で1分待って(時間の精度的には正確でないかもしれませんが、まあバッテリなので分単位で十分かとこれまた甘い考え)、毎分実行されるようにして得たのが上のグラフです。

ま、雰囲気は出てるわな

ということで、今度はバッテリがフルになるまで再充電し、再度、ケーブルを外して記録させています。現在21分目。流石にフル充電したので、今回は25分といわずもっと持ってくれるでしょう。それにつけても、いろいろ条件変えて測ってみたい。

  • LEDのONとOFF
  • WiFiのONとOFF
  • BluetoothのONとOFF

それにSleepも調べておきたい

  • DeepsleepのONとOFF
  • LightsleepのONとOFF

しかし、DeepとLightってどう違うんだ?APIのページには関数の名前だけで、具体的にどこがどう止まって、動いているのはここだけ、といった記述がなかったようだし。これまた調べておかないと。

IoT何をいまさら(48) M5Stack, Powerについて に戻る

IoT何をいまさら(50) M5Stack、LCDのONとOFF に進む