M5SatmpS3、8x8 Puzzle Unit (Unit Puzzle ?)「ガジェットメイドカフェ」と表示。



参考
----

https://github.com/Tamakichi/Arduino-misakiUTF16


いろいろ、注意
----

- 3.2.0


結果
----

![image_original(37).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/6f6d8c5a-3e2e-41fd-811f-9053db8a26ab.jpeg)


プログラム
----



```c++


//NeoPixel8x8_gajetuto_scroll_M5StampS3_1


//インクルド
#include <Arduino.h>
#include <Adafruit_NeoPixel.h>
#include <misakiUTF16.h>


//定義
#define MAX_X 8
#define MAX_Y 8
#define NUM_LEDS 64
#define RGBLED_OUT 13
Adafruit_NeoPixel strip(NUM_LEDS, RGBLED_OUT, NEO_GRB + NEO_KHZ800);

unsigned char Pixel[8][8][3];  //キャラクターRAM(カラー)

long s_buff[8]; //スクロールバッファー


//スクロールバッファーを0で埋める
void kanji_scroll_clr() {
  for (int i = 0; i < 8; i++) {
    s_buff[i] = 0;
  }  //for
}  //kanji_scroll_clr


//スクロールバッファーにフォントをセットする
void kanji_scroll_set(unsigned char *font) {
  for (int i = 0; i < 8; i++) {
    int a;
    a = s_buff[i] & 0xff00;
    a = a | font[i];
    s_buff[i] = a;
  }  //for
}  //kanji_scroll_set


//スクロールバッファーを1ドット左にずらす
void kanji_scroll_1up(unsigned char *font) {
  for (int i = 0; i < 8; i++) {
    s_buff[i] = s_buff[i] << 1;
    font[i] = s_buff[i] >> 8;
  }  //for
}  //kanji_scroll_1up


//ネオピクセルに転送後に表示
void NeoPixe_OUT() {

  int k = 0;
  for (int y = 0; y < MAX_Y; y++) {
    for (int x = 0; x < MAX_X; x++) {

      strip.setPixelColor(k++, strip.Color(
                                 Pixel[y][x][0], Pixel[y][x][1], Pixel[y][x][2]));

    }  //for j
  }    //for i

  strip.show(); //再表示

}  //NeoPixe_OUT


//8x8文字の表示
void ch_8x8_f(unsigned char *font, int c1, int c2, int c3) {

  int i = 0;
  for (int y = 0; y < MAX_Y; y++) {
    int a = font[i++];
    for (int x = 0; x < MAX_X; x++) {

      if (((a << x) & 0x80) != 0) {
        Pixel[y][x][0] = c1;
        Pixel[y][x][1] = c2;
        Pixel[y][x][2] = c3;
      } else {
        Pixel[y][x][0] = 0;
        Pixel[y][x][1] = 0;
        Pixel[y][x][2] = 0;
      }  //if

    }  //for j
  }    //for i

  NeoPixe_OUT();  //RBG LEDに出力

}  //ch_8x8


//フォントの回転
void font270(unsigned char *fontO, unsigned char *fontI) {

  //フォントバッファーをクリア
  for (int i = 0; i < 8; i++) {
    fontO[i] = 0;
  }  //for i

  //回転させる
  for (int i = 0; i < 8; i++) {
    //処理
    //        12345678
    int m = 0b00000001;
    int a = fontI[i];
      for (int j = 0; j < 8; j++) {
        fontO[j] = fontO[j] << 1;
        fontO[j] = fontO[j] | (a & m);a = a >> 1;
      }//for
  }  //for i

}  //font270


  unsigned char font1[] = {
    0b00000000,
    0b00000000,
    0b11111111,
    0b00000000,
    0b00000000,
    0b11111111,
    0b00000000,
    0b00000000
  };


  unsigned char font2[] = {
    0b10000001,
    0b01000010,
    0b00100100,
    0b00011000,
    0b00011000,
    0b00100100,
    0b01000010,
    0b10000001
  };


  unsigned char font3[] = {
    0b00000000,
    0b00000000,
    0b00000000,
    0b00000000,
    0b00000000,
    0b00000000,
    0b00000000,
    0b00000000
  };


//初期化
void setup() {

  //ネオピクセルの設定
  strip.begin();
  strip.show();

  //テスト表示
  ch_8x8_f(font1, 5, 5, 5);  //表示
  delay(1000);

  //テスト表示
  ch_8x8_f(font2, 5, 5, 5);  //表示
  delay(1000);

}  //main


//メインループ
void loop() {

  unsigned char fontI[8];  // フォント格納バッファ
  unsigned char *font;
  font = fontI;

  char str[64] = "ガジェットメイドカフェ";  // 文字列

  kanji_scroll_clr(); //スクロールバッファーのクリア


  kanji_scroll_set(font1);//'='をセット
  for (int i = 0; i < 8; i++) {
      kanji_scroll_1up(font);//スクロール
      ch_8x8_f(font, 5, 5, 5);delay(500);  //0.5秒待つ
  }  //for

  kanji_scroll_set(font2);//'X'をセット
  for (int i = 0; i < 8; i++) {
      kanji_scroll_1up(font);//スクロール
      ch_8x8_f(font, 5, 5, 5);delay(500);  //0.5秒待つ
  }  //for

  //文字列メッセージの表示
  char *ptr = str;
  while (*ptr) {  // 文字列分ループ

    font = fontI;  //tate

    ptr = getFontData(font, ptr, true);  // 1文字分のフォント取得
    if (!ptr)
      break;  // エラーの場合は終了

    //tate 縦スクロールの処理　現在、未使用
    if (1 != 1) {
      unsigned char fontO[8];
      font270(fontO, font);
      font = fontO;
    }  //endif

    kanji_scroll_set(font); //スクロールさせる為のフォントをセット

    //8ドット分スクロールさせる
    for (int i = 0; i < 8; i++) {

      kanji_scroll_1up(font);//スクロール

      ch_8x8_f(font, 5, 5, 5);//表示
      delay(500);  //0.5秒待つ

    }  //for

  }  //while


  kanji_scroll_set(font2); //'X'をセット
  for (int i = 0; i < 8; i++) {
      kanji_scroll_1up(font);//スクロール
      ch_8x8_f(font, 5, 5, 5);delay(500);  //0.5秒待つ
  }  //for

  kanji_scroll_set(font1);//'='をセット
  for (int i = 0; i < 8; i++) {
      kanji_scroll_1up(font);//スクロール
      ch_8x8_f(font, 5, 5, 5);delay(500);  //0.5秒待つ
  }  //for

  kanji_scroll_set(font3);//スペース' 'をセット
  for (int i = 0; i < 8; i++) {
      kanji_scroll_1up(font);//スクロール
      ch_8x8_f(font, 5, 5, 5);delay(500);  //0.5秒待つ
  }  //for

}  //loop


```