04.M5Stack Basicの電池残量表示


04.M5Stack Basicの電池残量表示

充電中かどうか、満充電かどうか、残量%、電池マークを表示します。
M5Stack Basicは、電源管理にIP5306のICを使用しています。その場合、以下等の関数が使用できます。
・M5.Power.begin()
・M5.Power.isCharging()
・M5.Power.isChargeFull()
・M5.Power.getBatteryLevel()
getBatteryLevel()は0/25/50/75/100の値です。
100%でも満充電でない事があります。
さらに5分ぐらい充電すると満充電になります。

放電時間(実測)

電池レベル経過(分)
100%0
75%9
50%25
25%45
0%48
off48

スケッチ


// 電池残量マーク表示
#include <M5Stack.h>        // M5Stack Basicを使用
unsigned long Time;         // 経過mS 符号なし整数(0~2^32-1)
unsigned long LastTime = 0; // 前回の経過mS
int BattLevel = 0;          // 電池レベル 0%とする
int LastBattLevel = -1;     // 前回の電池レベル 0-100以外
int TimeH, TimeM;           // 表示用経過時間 H,M
char buf1[50];              // 表示用文字列
int BattX0 = 293, BattY0 = 0; // 電池マーク左上位置x0,y0
int Batt25W = 5, BattH = 11;  // 容量25%のW,本体H(本体W=Batt25W*4+4)
int BattPW = 3, BattPH = BattH - 2 * 2; // 電池プラス電極w,h

void displayBattLevel() {               // 表示関数
  if (Time - LastTime > 1000) {         // 前回から1Sより後なら
    M5.Lcd.setCursor(0, 5);             // カーソル位置(x,y) 0-319,0-239
    if ((bool)M5.Power.isCharging()) {  // 充電中か
      M5.Lcd.print("CHARG, ");          // true 充電中
      if ((bool)M5.Power.isChargeFull()) { // さらに満充電か
        M5.Lcd.println("FULL    ");     // true 満充電
      } else {                          // 満充電で無い時
        M5.Lcd.println("not FULL");     // false 満充電でない
      }
    } else {                             // 充電中でない時
      M5.Lcd.println("not CHARG      "); // false 充電中でない
    }
    M5.Lcd.println();                    // 改行

    TimeH = (int)((float)Time / 1000 / 3600);  // 時
    TimeM = (int)((float)Time / 1000 / 60 - TimeH * 60 + 0.5);  // 分
    sprintf(buf1, "%4dH%2dM", TimeH, TimeM);  // 開始してからの時分
    M5.Lcd.println(buf1);                     // 表示
    M5.Lcd.println();                         // 改行

    BattLevel = M5.Power.getBatteryLevel();   // バッテリー残量(%)取得
    if (LastBattLevel != BattLevel) {         // もし変化があったら
      Serial.print(BattLevel); Serial.print("% ");  // 充電データ
      Serial.println(buf1);     // 充電データ シリアルモニタに表示
      M5.Lcd.print(BattLevel);  // 0,25,50,75,100,確認できなければ-1
      M5.Lcd.println("% ");     // 表示

      M5.Lcd.fillRect(BattX0, BattY0, Batt25W * 4 + 4, BattH, WHITE);
      //                            表示 電池本体 4角形(始点x,y,W,H[,塗りつぶし色])
      M5.Lcd.fillRect(BattX0 + Batt25W * 4 + 4 , BattY0 + (BattH - BattPH) / 2,
                      BattPW, BattPH, WHITE);                 // 電池プラス極
      M5.Lcd.fillRect(BattX0 + 1, BattY0 + 1, Batt25W * 4 + 2, BattH - 2,
                      BLACK);                                 // 容量部は黒色
      if (BattLevel <= 25) {                                  // もし25%以下なら
        M5.Lcd.fillRect(BattX0 + 2, BattY0 + 2, BattLevel / 25 * Batt25W,
                        BattH - 4, RED);                      // 容量部は赤色
      } else {                                                // それ以外は
        M5.Lcd.fillRect(BattX0 + 2, BattY0 + 2, BattLevel / 25 * Batt25W,
                        BattH - 4, CYAN);                     // 容量部は水色
      }
      LastBattLevel = BattLevel;  // 前回のバッテリレベルとする
    }
    LastTime = Time;              // 前回の時間とする
  }
}

void setup() {
  M5.begin();            // M5ライブラリ初期化
  M5.Power.begin();      // Powerクラス初期化
  M5.Lcd.clear();        // 画面クリアしカーソルを原点に移動
  M5.Lcd.setTextSize(2); // 文字サイズ1-7
}
void loop() {
  Time = millis();        // 開始してからのmS,約50日で0に
  displayBattLevel();     // 表示関数
}