ソースに絡まるエスカルゴ

貧弱プログラマの外部記憶装置です。

【M5StickC Plus/Arduino】M5StickC Plusでおみくじを作ってみる

 以前の記事でM5StickC Plusの環境構築をしました。

 今回はそのM5StickC Plusを使って簡単な「おみくじ」を作ってみた備忘録になります。

 では、始めます。


1:日本語フォントを導入する
 おみくじとして「大吉」や「凶」といった文字を表示させたいのですが、ArduinoにもM5Stackのライブラリにも日本語のフォントはありません。
 なので日本語フォントを導入する必要があります。

 今回は以下のefontという日本語を含んだフォントを導入していきます。

 ちなみにこのフォントはソースコードの中に含まれているため、フォントデータを別途SDカードなどに保存する必要なく扱えるという利点があります(その分コンパイル後のサイズは大きくなります)。

 では実際にefontをArduino IDEに導入していきます。

 Arduino IDEを起動させてメニューの「スケッチ」→「ライブラリをインクルード」→「ライブラリの管理」を選択します。
f:id:rikoubou:20210315165534p:plain

 ライブラリマネージャの画面が表示されるので検索欄に「efont」と入力して出てきた「efont Unicode Font Data」を選択して「インストール」ボタンを押してインストールします。
f:id:rikoubou:20210315165821p:plain

 これでefontが導入できました。


2:M5StickC Plus用のファイルを作成する
 efontにはM5StickCには対応していますがM5StickC Plusには対応していないので、M5StickC Plus用のライブラリファイルを新たに作成します。

 先ほどインストールしたefontのライブラリがあるフォルダを開きます。デフォルトのArduino IDEの設定だと以下のパスに保存されているはずです。

C:\Users\[ユーザ名]\Documents\Arduino\libraries\efont_Unicode_Font_Data

「efont_Unicode_Font_Data」内にある「src」フォルダを開いたところにある「efontM5StickC.h」のファイルをコピーして「efontM5StickCPlus.h」という名前に変更します。
f:id:rikoubou:20210315170747p:plain

 新たに作成した「efontM5StickCPlus.h」をエディタで開き、6行目を以下のように修正します。

 // 変更前
#include <M5StickC.h>

 // 変更後
#include "M5StickCPlus.h"

 これで「efontM5StickCPlus.h」のファイルをincludeすることでM5StickC Plusでもefontを使えるようになります。


3:おみくじのスケッチを書き込む
 efontが使えるようになったので、実際におみくじのスケッチを書き込みます。

 おみくじのスケッチは以下の通りです。

・M5StickCPlus_text_omikuji.ino

/**
 * M5StickC Plusおみくじ
 */
#include <M5StickCPlus.h>
#include "efont.h"
#include "efontM5StickCPlus.h"
#include "efontEnableJaMini.h"

const int MAX_ARRAY = 7;
const uint16_t BG_COLOR = BLACK; // 画面の背景色

// 運勢の構造体
struct _unsei {
  char *str;
  int x;
  int y;
  int fontSize;
};

// 運勢の構造体配列(文字列, x座標, y座標, フォントサイズ倍率)
const struct _unsei OMIKUJI_ARRAY[MAX_ARRAY] = {
  {"大\n吉", 10, 10, 7},
  {"吉", 10, 60, 7},
  {"中\n吉", 10, 10, 7},
  {"小\n吉", 10, 10, 7},
  {"末\n吉", 10, 10, 7},
  {"凶", 10, 60, 7},
  {"大\n凶", 10, 10, 7}
};

bool btn_flg = false; // ボタンフラグ

void setup() {
  M5.begin();
  M5.Axp.ScreenBreath(10);           // 7-12で明るさ設定
  M5.Lcd.setRotation(0);             // 縦画面
  M5.Lcd.setTextColor(WHITE, BLACK); // 文字色を白、文字背景色を黒に設定
  M5.Lcd.fillScreen(BG_COLOR);       // 背景塗りつぶし
}

void loop() {
  M5.update();
  M5.Beep.update();

  // ボタンAが押された時
  if (M5.BtnA.wasPressed()) {
    ringBeep(3000, 100); // ブザーを鳴らす
    btn_flg = !btn_flg;
  }

  // btn_flgがfalseの時
  if (!btn_flg) {
    // 運勢をランダムに表示
    int number = random(0, MAX_ARRAY);
    showUnsei(number);
  }
}

// ブザーを鳴らす関数
void ringBeep(int pwm, int delaytime) {
  M5.Beep.tone(pwm, delaytime);
}

// 運勢を表示する関数
void showUnsei(int number) {
  M5.Lcd.fillScreen(BG_COLOR); // 背景塗りつぶし

  // 運勢を取り出して表示
  _unsei unsei = OMIKUJI_ARRAY[number];
  printEfont(unsei.str, unsei.x, unsei.y, unsei.fontSize);
}

 特に難しいことはやってないですが一応少し解説すると、大吉~大凶までの7種類を構造体の配列として持ち、乱数で0~6を発生させて「M5」と書かれたボタンが押されたところで表示を止めるという感じです。何となくボタンが押された時にブザーで音を鳴らすようにもしています。


 以上がM5StickC Plusでおみくじを作ってみた備忘録です。

 簡単ですがフォントの導入と文字の表示、ボタン制御、ブザーで音を鳴らすということをまとめたものができたので良かったです。
 今回おみくじを作ってみてM5StickC Plusはかなり色々できて楽しいことがわかったので、また何か面白いものを作ってみたいですね。


・参考資料