2025年5月8日木曜日

LCD Unitを使ってみよう!

先日、LCD Unitのファームウェアをアップデートしましたが実際に使用していなかったので、M5StickC Plus2に接続して表示させてみました

基本的にはサンプルデザインを流用して記述しました。サンプル記述では、メッセージ表示後に丸と四角のランダムパターンを表示します

// #include <M5StickCPlus2.h>
// #include <M5GFX.h>
#include <Arduino.h>
#include <M5UnitLCD.h>
#include <M5Unified.h>

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

  // M5 UnitLCD display setting.
  // cfg.external_display.unit_lcd = true;

  #if defined(__M5GFX_M5UNITLCD__)       // setting for Unit LCD.
    cfg.unit_lcd.pin_sda = GPIO_NUM_32;  // Grove I2C SDA pin
    cfg.unit_lcd.pin_scl = GPIO_NUM_33;  // Grove I2C SCL pin
    cfg.unit_lcd.i2c_addr = 0x3E;        // I2C Adress
    cfg.unit_lcd.i2c_freq = 400000;
    cfg.unit_lcd.i2c_port = I2C_NUM_0;
  #endif

  M5.begin(cfg);

  // Get the number of available displays
  int display_count = M5.getDisplayCount();

  for (int i = 0; i < display_count; ++i) {
    M5.Displays(i).setRotation(3);
    int textsize = M5.Displays(i).height() / 60;
    if (textsize == 0) { textsize = 1; }
    M5.Displays(i).setTextSize(textsize);
    Serial.printf("No.%d\n", i);
    M5.Displays(i).printf("No.%d\n", i);
  }


  // If an external display is to be used as the main display, it can be listed in order of priority.
  //  M5.setPrimaryDisplayType( m5::board_t::board_M5UnitLCD );
  M5.Display.print("primary display\n");


  int index_unit_lcd = M5.getDisplayIndex(m5::board_t::board_M5UnitLCD);
  M5.Displays(index_unit_lcd).print("This is  M5 UnitLCD display\n");
  M5.delay(10000);
}


// When creating a function for drawing, it can be used universally by accepting a LovyanGFX type as an argument.
void draw_function(LovyanGFX* gfx) {
  int x = rand() % gfx->width();
  int y = rand() % gfx->height();
  int r = (gfx->width() >> 4) + 2;
  uint16_t c = rand();
  gfx->fillRect(x - r, y - r, r * 2, r * 2, c);
}


void loop(void) {
  M5.delay(1);

  for (int i = 0; i < M5.getDisplayCount(); ++i) {
    int x = rand() % M5.Displays(i).width();
    int y = rand() % M5.Displays(i).height();
    int r = (M5.Displays(i).width() >> 4) + 2;
    uint16_t c = rand();
    M5.Displays(i).fillCircle(x, y, r, c);
  }

  for (int i = 0; i < M5.getDisplayCount(); ++i) {
    draw_function(&M5.Displays(i));
  }
}

なお、#include <Arduino.h>を宣言していないと、上記記述の14行目~17行名で構造体 config_tにunit_lcdが無いといった趣旨のエラーが発生します。勉強不足で、嵌まってしましいましたよ。

参考にさせて頂きましたサイト:

0 件のコメント:

コメントを投稿