「えだまめ」しているラズパイ

30年ぶりに半田ごて握ってラズパイ勉強中。

ESP8266(WROOM-02) で WiFiマイクロターミナルを作る その(4) 日本語フォント表示

◯やりたいこと

その(3)で準備した漢字フォントを実際に表示してみる

◯やったこと

漢字フォントのフラッシュメモリへのアップロードや表示ライブラリのインストールはその(3)で終了していますので、今回は実際にそのフォントをOLEDに表示してみます。

作ってみたスケッチは以下の通り。

// Standerd Library
#include              <Arduino.h>
#include              <Wire.h>

// Include Library
/* OLED (SSD1306) */
#include              <Adafruit_SSD1306.h>
#include              <espfonts.h>

// Global Value
/* I2C */
#define I2C_SDA       2         // D2
#define I2C_SCK       0         // D0
#define I2C_CLK       50000     // fSCL=50KHz

/* OLED */
#define OLED_ADR      0x3C      // I2C ADDRESS
#define SCREEN_WIDTH  128       // OLED display width, in pixels
#define SCREEN_HEIGHT 64        // OLED display height,in pixels
#define OLED_RESET    -1        // Reset pin # (or -1 if sharing Arduino reset pin)

Adafruit_SSD1306      display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

/* ESP FONT */
extern espfonts ESPfonts;

///// ハードウエア 初期設定
void setup() {
  // I2C 初期化
  Wire.begin   (I2C_SDA, I2C_SCK);
  Wire.setClock(I2C_CLK);

  // OLED(SSD1306) 初期化
  display.begin(SSD1306_SWITCHCAPVCC, OLED_ADR);
  display.clearDisplay();

  // ESP FONT 初期化
  ESPfonts.init();
  ESPfonts.open();

  // 漢字描画
  String msg;
  msg = "0Aa東京都";
  // 8x8
  ESP_print( 0, 0,0,"漢字ターミナル");
  // 10x10  
  ESP_print(64, 0,1,msg);
  // 12x12
  ESP_print( 0, 9,2,msg);
  // 14x14
  ESP_print(64, 9,3,msg);

  msg = "0A東京";
  // 16x16
  ESP_print( 0,22,4,msg);
  // 20x20
  ESP_print(64,22,5,msg);

  msg = "0Aa東京都";
  // 24x24
  ESP_print( 0,40,6,msg);
  
  display.display();
}

void loop() {
}

//
void ESP_print(uint8_t x, uint8_t y, uint8_t fnt, String str) {
  // 漢字フォント表示
  if (fnt>=0 && fnt<=6) {
    // String->char変換
    int str_len = str.length() + 1;
    char msg[str_len];
    str.toCharArray(msg, str_len);

    // フォント指定
    ESPfonts.setFontSizeAsIndex(fnt);
    uint8_t fontB[ESPfonts.getLength()];
    
    // 文字列表示
    char *ptr = msg;
    while(*ptr) {
      // フォントパターン取得
      ptr = ESPfonts.getFontData(fontB, ptr);
      if (!ptr) break;

      // フォントサイズ取得
      uint8_t fontW = ESPfonts.getWidth();
      uint8_t fontH = ESPfonts.getHeight();
    
      // 改行チェック(スクロールなし)
      if (x+fontW >= SCREEN_WIDTH) {
        x=0;
        y+=fontH;
      }
      // フォント描画
      display.drawBitmap(x,y,fontB,fontW,fontH,WHITE);
      x+=fontW;
    }
  }
}

ESP_print()と言う関数を作って7つの各フォントを半角文字と一緒に表示させてみました。

x座標(0-127)、y座標(0-63)、利用フォント(0-6)、文字列(string)を指定して呼び出すとドット座標(x、y)を左上角とした位置に指定されたフォントで文字列を表示します。
Tamakichiさんのライブラリはとてもよく出来ていて、びっくりするほど簡単に漢字フォントを表示することができました。半角全角もライブラリ側で判断してフォントを選んでくれますし、7種類のフォントを自由に選べる点もすごい。ホント感謝です。

◯やってみて

これでWiFiコンソールを漢字化するノウハウが手に入りましたのでさっそくその(1)、(2)で作成したコンソールの漢字化に着手していきます。

◯その後

無事漢字ターミナル化に成功です。

まあアルファベット表記の方がカッコいいという意見もありますが…。

ただ7つのサイズの漢字文をWiFi経由でターミナル出力できるのはとても助かります。