简体中文
English
简体中文
日本語

Arduino 上手教程

2. 设备开发 & 案例程序

5. 扩展模块

6. 应用案例

Unit DigiClock Arduino 使用教程

1. 准备工作

2. 注意事项

引脚兼容性
由于每款主机的引脚配置不同,为了让用户更方便地使用,M5Stack 官方提供了引脚兼容性表,方便用户查看,请根据实际引脚连接情况修改案例程序。

3. 案例程序

  • 本教程中使用的主控设备为 CoreS3,搭配 Unit DigiClock。Unit DigiClock 采用 I2C 通信,默认地址为 0x30,设备连接到 CoreS3 的 Port A 后对应的引脚为 G2 (SDA)、G1 (SCL)。
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
#include <M5Unified.h>
#include <M5UNIT_DIGI_CLOCK.h>

constexpr uint8_t DIGI_ADDRESS = M5UNIT_DIGI_CLOCK_DEFAULT_ADDR;
constexpr uint8_t BRIGHTNESS   = 8;
constexpr uint16_t UI_BG       = 0x1082;
constexpr uint16_t UI_PANEL    = 0x2104;
constexpr uint16_t UI_HEADER   = 0x0349;
constexpr uint16_t UI_MUTED    = 0xBDF7;

M5UNIT_DIGI_CLOCK digiClock;
M5Canvas canvas(&M5.Display);
uint32_t last_update = 0;
uint16_t minute_value = 0;

void drawCard(int16_t x, const char* label, const char* value, uint16_t value_color)
{
    canvas.fillRoundRect(x, 148, 142, 50, 5, UI_PANEL);
    canvas.drawRoundRect(x, 148, 142, 50, 5, UI_MUTED);
    canvas.setTextDatum(textdatum_t::middle_left);
    canvas.setFont(&fonts::Font2);
    canvas.setTextSize(1);
    canvas.setTextColor(UI_MUTED, UI_PANEL);
    canvas.drawString(label, x + 10, 162);
    canvas.setTextColor(value_color, UI_PANEL);
    canvas.drawString(value, x + 10, 183);
}

void drawStatus(const char* value)
{
    char brightness[8] = {};
    snprintf(brightness, sizeof(brightness), "%u / 8",
             static_cast<unsigned>(BRIGHTNESS));

    canvas.fillScreen(UI_BG);
    canvas.fillRect(0, 0, 320, 42, UI_HEADER);
    canvas.setTextDatum(textdatum_t::middle_center);
    canvas.setFont(&fonts::Font4);
    canvas.setTextSize(1);
    canvas.setTextColor(TFT_WHITE, UI_HEADER);
    canvas.drawString("UNIT DIGICLOCK", 160, 16);
    canvas.setFont(&fonts::Font2);
    canvas.setTextColor(UI_MUTED, UI_HEADER);
    canvas.drawString("DIGITAL TIME  /  STATUS", 160, 33);

    canvas.fillRoundRect(12, 54, 296, 78, 6, UI_PANEL);
    canvas.drawRoundRect(12, 54, 296, 78, 6, TFT_CYAN);
    canvas.setTextColor(UI_MUTED, UI_PANEL);
    canvas.drawString("DISPLAY VALUE", 160, 70);
    canvas.setFont(&fonts::Font4);
    canvas.setTextColor(TFT_CYAN, UI_PANEL);
    canvas.drawString(value, 160, 101);

    drawCard(12, "MODE", "CLOCK", TFT_WHITE);
    drawCard(166, "BRIGHTNESS", brightness, TFT_ORANGE);

    canvas.fillRect(0, 214, 320, 26, UI_HEADER);
    canvas.setFont(&fonts::Font2);
    canvas.setTextColor(TFT_WHITE, UI_HEADER);
    canvas.drawString("RUNNING  |  UPDATE EVERY 1 s", 160, 227);
    canvas.pushSprite(0, 0);
}

void setup()
{
    auto cfg = M5.config();
    M5.begin(cfg);
    Serial.begin(115200);
    canvas.setColorDepth(16);
    canvas.createSprite(320, 240);

    const int sda = M5.getPin(m5::pin_name_t::port_a_sda);
    const int scl = M5.getPin(m5::pin_name_t::port_a_scl);
    if (!digiClock.begin(&Wire, sda, scl, DIGI_ADDRESS)) {
        drawStatus("----");
        while (true) {
            delay(1000);
        }
    }
    digiClock.setBrightness(BRIGHTNESS);
    char blank[] = "----";
    digiClock.setString(blank);
    drawStatus("----");
}

void loop()
{
    if (millis() - last_update < 1000) {
        return;
    }
    last_update = millis();

    char value[6] = {};
    snprintf(value, sizeof(value), "%02u:%02u",
             static_cast<unsigned>(minute_value / 60),
             static_cast<unsigned>(minute_value % 60));
    digiClock.setString(value);
    Serial.printf("DigiClock: %s\n", value);
    drawStatus(value);
    minute_value = (minute_value + 1) % (24 * 60);
}

4. 编译上传

  • 复制粘贴上述例程代码到项目代码区,选中设备端口(详情请参考 程序编译与烧录),点击 Arduino IDE 左上角编译上传按钮,等待程序完成编译并上传至设备。

5. 数码管显示

  • 程序启动后,Unit DigiClock 的数码管会每秒更新一次,主控屏幕和串口监视器同步显示发送的数据。
Page Tools
PDF
On This Page