Arduino UNO R4 WiFiのLEDマトリックスに、漢字を表示させたくなった 

 

 タイトルのまんま。 Arduino UNO R4 WiFiボードの12×8ドットのLEDマトリックスに、漢字を表示させてみただけ。

漢字のフォントデータは、8×8ドットで第二水準の漢字まで表現している「恵梨沙フォント」を参考に、とりあえず必要な漢字だけをドット化している。

 

 なぜ新幹線の車内電光掲示板のテロップにしたかは、特に意味がない。 ただふと思いついただけ。

なぜ"三河安城駅"なのかも特に意味がない。 新幹線の車内で寝てふと目を覚ますとだいたい目に入るのは三河安城駅のテロップのイメージが強い。

ただそれだけ。

 

 tsukaeki配列変数内のコメントアウトしている所を変えてコンパイルし直せば、別の駅名になる。

興味があればぜひ。

#include "Arduino_LED_Matrix.h"

//スクロール時間
#define SCROLL_TIME 100   //ミリ秒
unsigned long tm = 0;

int idx = 0, max_idx;
byte matrix_buff[200];  //文字列をドットに変換用

//表示文字列
static const byte tadaima[] PROGMEM = {
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x47, 0xf8, 0x40, 0x42, 0x51, 0x11, 0x11,  // た
  0x00,
  0x00, 0x47, 0xf8, 0x40, 0x42, 0x51, 0x91, 0x91,  // だ
  0x00,
  0x00, 0x3c, 0x02, 0x00, 0x00, 0x00, 0x20, 0x1c,  // い
  0x00,
  0x00, 0x52, 0x55, 0x55, 0xff, 0x54, 0x52, 0x00,  // ま
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00  // Space
};

static const byte ekitsuka[] PROGMEM = {
  0xfa, 0xaa, 0xf9, 0xae, 0x01, 0xfe, 0x94, 0xf3,  // 駅
  0x00,
  0x00, 0x48, 0xf2, 0x55, 0x4d, 0x51, 0x11, 0x00,  // を
  0x00,
  0x91, 0x5e, 0x01, 0xbf, 0xb5, 0xff, 0xb5, 0x3f,  // 通
  0x00,
  0x91, 0x5e, 0x01, 0x3d, 0xe1, 0xad, 0xe9, 0x3d,  // 過
  0x00,
  0x02, 0x05, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,  // 。
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00 
};

static const byte shinkansen_eki[][8] PROGMEM = {
  { 0x01, 0x41, 0x49, 0x49, 0x49, 0x49, 0x41, 0x01 },  // 三 0
  { 0xa1, 0x56, 0x80, 0xbc, 0xa4, 0xbc, 0x81, 0xff },  // 河 1
  { 0x71, 0x51, 0x55, 0x7b, 0xd2, 0x5d, 0x51, 0x71 },  // 安 2
  { 0x22, 0xfe, 0x25, 0x7e, 0x49, 0x4e, 0xfe, 0xc9 },  // 城 3
  { 0x03, 0x7d, 0x57, 0xd5, 0x57, 0x7c, 0x05, 0x07 },  // 島 4
  { 0x1e, 0xfe, 0x1e, 0x59, 0x55, 0xf2, 0x55, 0x59 },  // 岐 5
  { 0x02, 0x02, 0x7e, 0xda, 0x5b, 0x7a, 0x0e, 0x02 },  // 阜 6
  { 0xa4, 0xa4, 0x89, 0xff, 0x84, 0xa4, 0x89, 0xff },  // 羽 7
};

static const byte tsukaeki[] PROGMEM = {
  0, 1, 2, 3,    // 三河安城
//  0, 4,          // 三島
//  5, 6, 7, 4,    // 岐阜羽島
};

void setup() {
  int i1;
  max_idx = 0;
  //ただいま---- をSet
  for(i1 = 0; i1 < sizeof(tadaima); i1++){
    matrix_buff[max_idx] = tadaima[i1];
    max_idx++;
  }
  //駅名をSet
  for(i1 = 0; i1 < sizeof(tsukaeki); i1++){
    for(int i2 = 0; i2 < 8; i2++){
      matrix_buff[max_idx] = shinkansen_eki[tsukaeki[i1]][i2];
      max_idx++;
    }
    matrix_buff[max_idx] = 0x00;
    max_idx++;
  }
  //通過... をSet
  for(i1 = 0; i1 < sizeof(ekitsuka); i1++){
    matrix_buff[max_idx] = ekitsuka[i1];
    max_idx++;
  }
}

void loop() {
  int ic1, ic2;

  //スクロール時間が経過したらスライドさせる。末端に到達したら始めに戻る
  if(tm + SCROLL_TIME <= millis()) {
    if (idx < max_idx)
      idx++;
    else{
      idx = 0;
    }

    //経過時間を再計測
    tm = millis();
  }

  //12x8LED View
  for(ic1 = 0; ic1 < 8; ic1++){
    for(ic2 = 0; ic2 < 12; ic2++){
      turnLed(ic1 * 12 + ic2 , matrix_buff[idx + ic2] >> (7 - ic1) & 0x01);
      delayMicroseconds(20);  //これを入れないとLEDがちらつく
    }
  }
}