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 |
off | 48 |
スケッチ
// 電池残量マーク表示
#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(); // 表示関数
}