pdf-icon

Arduino入門

2. デバイス&サンプル

5. 拡張モジュール&サンプル

アクセサリー

6. アプリケーション

PaperColor Battery バッテリー

PaperColor バッテリー状態読み取りに関する API とサンプルプログラムです。

サンプルプログラム

コンパイル要件

  • M5Stack ボードマネージャバージョン >= 3.2.7
  • 開発ボードオプション = M5PaperColor
  • M5Unified ライブラリバージョン >= 0.2.15
  • M5GFX ライブラリバージョン >= 0.2.21
  • Adafruit_NeoPixel ライブラリバージョン >= 1.15.4
cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
#include <M5Unified.h>
#include <Adafruit_NeoPixel.h>

static constexpr uint32_t REFRESH_INTERVAL_MS = 60000;

M5Canvas canvas(&M5.Display);
uint32_t last_refresh_ms = 0;
Adafruit_NeoPixel pixels(2, 21, NEO_GRB + NEO_KHZ800);
bool has_last_vbus_state = false;
bool last_has_vbus = false;

static void setPowerLed(bool has_vbus)
{
    const uint32_t color = has_vbus ? pixels.Color(0, 255, 0) : pixels.Color(0, 0, 255);
    pixels.setPixelColor(0, color);
    pixels.setPixelColor(1, color);
    pixels.show();
}

static void drawPowerScreen()
{
    const int w = M5.Display.width();
    const int h = M5.Display.height();

    const int batteryLevel = M5.Power.getBatteryLevel();
    const int batteryVoltage = M5.Power.getBatteryVoltage();
    const int vbusVoltage = M5.Power.getVBUSVoltage();
    const bool hasVbus = (vbusVoltage > 1000);

    canvas.fillSprite(WHITE);
    canvas.setTextDatum(top_center);

    canvas.setFont(&fonts::FreeSansBold24pt7b);
    canvas.setTextColor(BLACK);
    canvas.drawString("Power Status", w / 2, 26);

    canvas.setFont(&fonts::FreeSansBold18pt7b);
    canvas.setTextColor(BLUE);
    canvas.drawString("Refresh: 1 min", w / 2, 90);

    canvas.setTextColor(hasVbus ? GREEN : RED);
    canvas.drawString(hasVbus ? "Input Power: ON" : "Input Power: OFF", w / 2, 160);

    char buf[64];
    canvas.setTextColor(TFT_DARKCYAN);
    snprintf(buf, sizeof(buf), "Battery: %d%%", batteryLevel);
    canvas.drawString(buf, w / 2, 230);

    canvas.setTextColor(MAGENTA);
    snprintf(buf, sizeof(buf), "Voltage: %d mV", batteryVoltage);
    canvas.drawString(buf, w / 2, 290);

    canvas.setTextColor(BLACK);
    if (vbusVoltage >= 0) {
        snprintf(buf, sizeof(buf), "VBUS: %d mV", vbusVoltage);
    } else {
        snprintf(buf, sizeof(buf), "VBUS: N/A");
    }
    canvas.drawString(buf, w / 2, 350);

    canvas.pushSprite(0, 0);

    setPowerLed(hasVbus);

    Serial.printf("Power info refreshed: input=%d, level=%d%%, bat=%dmV, vbus=%dmV\n", hasVbus ? 1 : 0, batteryLevel,
                  batteryVoltage, vbusVoltage);
}

void setup()
{
    auto cfg = M5.config();
    cfg.clear_display = false;
    M5.begin(cfg);
    Serial.begin(115200);

    M5.Display.setEpdMode(epd_mode_t::epd_quality);
    canvas.createSprite(M5.Display.width(), M5.Display.height());
    pixels.begin();
    pixels.setBrightness(80);
    pixels.clear();
    pixels.show();

    drawPowerScreen();
    last_refresh_ms = millis();
    last_has_vbus = (M5.Power.getVBUSVoltage() > 1000);
    has_last_vbus_state = true;
}

void loop()
{
    M5.update();

    const bool has_vbus_now = (M5.Power.getVBUSVoltage() > 1000);
    if (!has_last_vbus_state || has_vbus_now != last_has_vbus) {
        last_has_vbus = has_vbus_now;
        has_last_vbus_state = true;
        last_refresh_ms = millis();
        drawPowerScreen();
        delay(20);
        return;
    }

    const uint32_t now = millis();
    if (now - last_refresh_ms >= REFRESH_INTERVAL_MS) {
        last_refresh_ms = now;
        drawPowerScreen();
    }

    delay(20);
}

このプログラムは、画面にバッテリー電圧、残量参考パーセンテージ、入力電圧情報を表示し、1 分間隔でリフレッシュします。

API

PaperColor の電源部分は M5Unified ライブラリの Power_Class を使用しています。関連する API の詳細は以下のドキュメントを参照してください:

On This Page