M5Stackのバッテリ量を表示する


R2.6.1 バッテリー残量を知る2

 M5Stackを使うのは、就寝時の音楽。その際、M5Stackのバッテリー残量がどのくらいあるのかを知っておくことは重要だ。ということでmp3再生プログラムにバッテリー残量を表示するのが課題になっていた。以前、2つ方法があると自分で書いていました。それを同時に使ってみましたよ。

void displayBatteryLevel() { Wire.beginTransmission(0x75); Wire.write(0x78); Wire.endTransmission(false); Wire.requestFrom(0x75,1); int BattLev = M5.Power.getBatteryLevel(); M5.Lcd.setCursor(0,205); M5.Lcd.setTextColor(TFT_CYAN); if (M5.Power.isCharging()) { M5.Lcd.print(" In charging. BatteryLevel=> "); } else { M5.Lcd.print(" Not in charging. BatteryLevel=> "); } M5.Lcd.print(BattLev); M5.Lcd.print("%"); Wire.endTransmission(true); if (BattLev == 0) M5.Lcd.drawBitmap(0,225,17,9,img0);//empty else if (BattLev == 25) M5.Lcd.drawBitmap(0,222,17,9,img1);// 25% else if (BattLev == 50) M5.Lcd.drawBitmap(0,222,17,9,img2);// 50% else if (BattLev == 75) M5.Lcd.drawBitmap(0,222,17,9,img3);// 75% else if (BattLev == 100) M5.Lcd.drawBitmap(0,222,17,9,img4);//100% M5.Lcd.setTextColor(WHITE,BLACK); }
単純に M5.Power.getBatteryLevel(); だけでもバッテリーレベルは入手できるのだけれど、mp3再生と一緒に使うとビジューという雑音になってしまうので、 Wire.endTransmission(); してやらねばならないのかもしれません。この辺、知識全くありませんので試行錯誤でやっています。

 とにかく、下のような表示ができました。

 ただ、ランチャーからこのプログラムを出したときと、電源ボタンでリセットしたときにはバッテリーレベルを表示してくれますが、曲が終了してプログラムでリセットしたときには−1を返してくれます(^^;)

 これもPower.cppを読み解けば解決できるかな?


R2.5.21 バッテリー残量を知る

 LovyanLauncherを使っていると、左上にバッテリーアイコンが出ており、残量を知ることができる。バッテリー状態は最近のB5Stackであれば取得できる。いろいろ調べてみると、2通りのやり方を見つけた。もっとも、その根本のところは一緒なんだと思う。Power IC IP5306にあたっているのだろうと思う。M5Stack.cppを読めば分かるのだろうけれど、基礎知識がないために読み切れない(^^;)

 知識があると、見えてくるものがあるのだけれど、知識がないと全く見えない!

 それはともかく、極めてシンプルなところで、デバイスビジネス開拓団というページの JosephHalfmoonさんの記事、「IoT何をいまさら(48) M5Stack、Powerについて」で知ることができたやり方。

Wire.begin(); M5.Power.begin();
を宣言したのち、

M5.Power.getBatteryLevel();
でバッテリーレベルを聞く方法。素晴らしい、1行ですよ。

 もう一つは、LovyanLauncher作者のらびやんさんが教えてくださっている方法。 Wire.begin(); を宣言ののち

int8_t getBatteryGauge() { Wire.beginTransmission(0x75); Wire.write(0x78); Wire.endTransmission(false); if ( Wire.requestFrom(0x75, 1)) { return Wire.read(); // 0xF0: empty // 0xE0: 25% // 0xC0: 50% // 0x80: 75% // 0x00: full } return 0xFF; // failure }
という方法ですね。私の最近購入のM5StackGRAYでは問題なくバッテリーレベルを教えてくれます。ところが、同じスケッチを改造しているM5StackGRAYに書き込んでも、うまく動作しません。

 ランチャーから読み込んだ最初はバッテリのレベルを教えてくれます。緑の「Play」表示の左にアイコンと数値が表示されます。128とは0x80で75%の意味。224は0xE0で20%の残量。

 ところが、改造の方は電源を落としたり電源ボタンでリセットすると、0 を返してくれるんですね。ありがとう! 常に満タンです(^^;)

 物理スイッチを入れてるからか? 内部DACを潰しているからか? でも、らびやんさんのランチャーでは改造GRAYでもきちんとバッテリレベルを表示してくれている。さて問題です。どうしましょう?