pdf-icon

Arduino入門

2. デバイス&サンプル

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

アクセサリー

6. アプリケーション

PaperColor Wakeup スリープ・ウェイクアップ

PaperColor スリープ・ウェイクアップに関する API とサンプルプログラムです。

サンプルプログラム

コンパイル要件

  • M5Stack ボードマネージャバージョン >= 3.2.7
  • 開発ボードオプション = M5PaperColor
  • M5Unified ライブラリバージョン >= 0.2.15
  • M5GFX ライブラリバージョン >= 0.2.21
  • M5PM1 ライブラリバージョン >= 1.0.1

RTC ウェイクアップ ESP32-S3

RTC 割り込み信号を使用して ESP32-S3 をウェイクアップします。このプロセス中、M5PM1 電源管理チップはスタンバイ状態を維持します。

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
#include <M5Unified.h>

M5Canvas canvas(&M5.Display);

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

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

    canvas.setFont(&fonts::FreeSansBold18pt7b);
    canvas.setTextColor(RED);
    canvas.drawString("Press Top BtnA", w / 2, h / 2 - 20);

    canvas.setTextColor(GREEN);
    canvas.drawString("Sleep 5s, then wakeup", w / 2, h / 2 + 20);

    canvas.pushSprite(0, 0);
}

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

    M5.Display.setEpdMode(epd_mode_t::epd_quality);

    canvas.createSprite(M5.Display.width(), M5.Display.height());
    drawEpdSleepScreen();
}

void loop(void)
{
    M5.update();

    if (M5.BtnA.wasPressed()) {
        M5.Power.timerSleep(5);
    }

    delay(10);
}

このサンプルでは、PaperColor のスリープ・ウェイクアップ部分に M5Unified ライブラリの Power_Class を使用しています。詳細な API については以下を参照してください:

M5PM1 Timer タイマーウェイクアップ

デバイス起動後、ボタン A をクリックすると 10 秒タイマーによる電源オンイベントが設定され、その後デバイスはシャットダウンしてウェイクアップを待ちます。

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
#include <M5Unified.h>
#include <M5PM1.h>
#include <Wire.h>

static constexpr uint32_t POWERON_SECONDS = 10;
static constexpr uint32_t POWEROFF_SECONDS = 10;

M5PM1 pm1;
M5Canvas canvas(&M5.Display);

static bool pm1_ready = false;

static void drawScreen(const char* status)
{
    const int w = M5.Display.width();
    const int h = M5.Display.height();

    canvas.fillSprite(WHITE);
    canvas.setTextDatum(top_left);
    canvas.setTextColor(BLACK);

    canvas.setFont(&fonts::FreeSansBold12pt7b);
    canvas.drawString("M5PM1 TIMER", 16, 24);

    canvas.setFont(&fonts::FreeSansBold9pt7b);
    canvas.setTextColor(BLUE);
    canvas.drawString("BtnA: power on after 10s", 16, 86);

    canvas.setTextColor(pm1_ready ? GREEN : RED);
    canvas.drawString(status, 16, h - 40);

    canvas.pushSprite(0, 0);
}

void setup(void)
{
    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());

    m5pm1_err_t err = pm1.begin(&M5.In_I2C, M5PM1_DEFAULT_ADDR, M5PM1_I2C_FREQ_100K);
    pm1_ready       = (err == M5PM1_OK);

    if (pm1_ready) {
        pm1.setLdoEnable(true);
    }

    if (pm1_ready) {
        Serial.println("PM1 init ok");
        drawScreen("PM1 ready");
    } else {
        Serial.printf("PM1 init failed: %d\n", (int)err);
        drawScreen("PM1 init failed");
    }
}

void loop(void)
{
    M5.update();

    if (!pm1_ready) {
        delay(20);
        return;
    }

    if (M5.BtnA.wasPressed()) {
        Serial.printf("BtnA: timer power on in %lu s\n", POWERON_SECONDS);
        m5pm1_err_t err = pm1.timerSet(POWERON_SECONDS, M5PM1_TIM_ACTION_POWERON);
        if (err != M5PM1_OK) {
            Serial.printf("timerSet POWERON failed: %d\n", (int)err);
            drawScreen("BtnA failed");
        }
        delay(1000);
        pm1.shutdown();
    }
    delay(20);
}

PaperColor - M5PM1 の詳細については以下を参照してください:

On This Page