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

Arduino 上手教程

2. 设备开发 & 案例程序

5. 扩展模块

6. 应用案例

Unit HEX / NeoHEX Arduino 使用教程

1. 准备工作

2. 注意事项

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

3. 案例程序

  • 本教程中使用的主控设备为 CoreS3,可搭配 Unit HEX 或 Unit NeoHEX。两款灯板均连接到 CoreS3 的 Port B,LED Signal 为 G9,驱动 37 颗 RGB 灯珠。
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
#include <M5Unified.h>
#include <FastLED.h>

constexpr uint8_t LED_COUNT  = 37;
constexpr uint8_t LED_BRIGHT = 10;
constexpr uint8_t DATA_PIN   = 9; // CoreS3 Port B LED Signal (G9)
constexpr uint16_t UI_BG     = 0x1082;
constexpr uint16_t UI_PANEL  = 0x2104;
constexpr uint16_t UI_HEADER = 0x0349;
constexpr uint16_t UI_MUTED  = 0xBDF7;
CRGB leds[LED_COUNT];
M5Canvas canvas(&M5.Display);
uint8_t hue = 0;
uint32_t last_frame = 0;
uint32_t last_ui = 0;

uint16_t color565(const CRGB& color)
{
    return (static_cast<uint16_t>(color.r & 0xF8) << 8) |
           (static_cast<uint16_t>(color.g & 0xFC) << 3) | (color.b >> 3);
}

void drawStatus(const CRGB& sample)
{
    char led_count[8] = {};
    char brightness[8] = {};
    snprintf(led_count, sizeof(led_count), "%u", LED_COUNT);
    snprintf(brightness, sizeof(brightness), "%u", LED_BRIGHT);

    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 HEX / NEOHEX", 160, 16);
    canvas.setFont(&fonts::Font2);
    canvas.setTextColor(UI_MUTED, UI_HEADER);
    canvas.drawString("RGB LIGHTING  /  STATUS", 160, 33);

    canvas.fillRoundRect(12, 54, 296, 82, 6, UI_PANEL);
    canvas.drawRoundRect(12, 54, 296, 82, 6, TFT_MAGENTA);
    canvas.fillCircle(52, 95, 25, color565(sample));
    canvas.setTextDatum(textdatum_t::middle_left);
    canvas.setTextColor(TFT_WHITE, UI_PANEL);
    canvas.drawString("RAINBOW RGB EFFECT", 94, 82);
    canvas.setTextColor(UI_MUTED, UI_PANEL);
    canvas.drawString("37 RGB PIXELS", 94, 105);
    canvas.drawString("RAINBOW COLOR FLOW", 94, 123);

    canvas.fillRoundRect(12, 148, 92, 48, 5, UI_PANEL);
    canvas.fillRoundRect(114, 148, 92, 48, 5, UI_PANEL);
    canvas.fillRoundRect(216, 148, 92, 48, 5, UI_PANEL);
    canvas.setTextDatum(textdatum_t::middle_center);
    canvas.setTextColor(UI_MUTED, UI_PANEL);
    canvas.drawString("LEDS", 58, 161);
    canvas.drawString("BRIGHT", 160, 161);
    canvas.drawString("MODE", 262, 161);
    canvas.setTextColor(TFT_WHITE, UI_PANEL);
    canvas.drawString(led_count, 58, 181);
    canvas.drawString(brightness, 160, 181);
    canvas.drawString("AUTO", 262, 181);

    canvas.fillRect(0, 214, 320, 26, UI_HEADER);
    canvas.setTextColor(TFT_WHITE, UI_HEADER);
    canvas.drawString("HEX + NEOHEX  |  CASCADE READY", 160, 227);
    canvas.pushSprite(0, 0);
}

void setup()
{
    M5.begin();
    Serial.begin(115200);
    canvas.setColorDepth(16);
    canvas.createSprite(320, 240);
    FastLED.addLeds<WS2812B, DATA_PIN, GRB>(leds, LED_COUNT)
        .setCorrection(TypicalLEDStrip);
    FastLED.setBrightness(LED_BRIGHT);
    drawStatus(leds[LED_COUNT / 2]);
}

void loop()
{
    if (millis() - last_frame < 20) {
        return;
    }
    last_frame = millis();
    fill_rainbow(leds, LED_COUNT, hue, 7);
    FastLED.show();
    hue++;
    if (millis() - last_ui >= 250) {
        last_ui = millis();
        drawStatus(leds[LED_COUNT / 2]);
    }
}

4. 编译上传

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

5. 彩虹灯效

  • 程序运行后,Unit HEX 和 Unit NeoHEX 均会显示连续变化的彩虹效果,主控屏幕显示灯珠数量、亮度和灯效状态。多块灯板级联时,请为每块灯板提供足够的 5V 电源,并相应增加 LED_COUNT 数值。
Page Tools
PDF
On This Page