ESP-WROOM-02でTFTに漢字を表示する

漢字フォントを切り替える


この漢字ライブラリ(フォントドライバー)の素晴らしいところは、様々な種類のフォントを使えることです。
FONTX形式のフォントファイルは、こ ちらこちらで 公開されています。
私はこ ちらで公開されている「IPAフォント」をFONTX形式に変換したILフォント(ILFONT03.zip)を利用させて頂いてい ます。

以下の様にメモリーが許せば、ゴシックと明朝の2つのフォントを読み込んで表示することもできます。


ゴシックと明朝の2つのROMフォントを使うスケッチは以下のようになります。
フォントファイルはスケッチの一部としてFLASHメモリ上に展開されます。
さすがにスケッチサイズは大きくなります。

最大1044464バイトのフラッシュメモリのうち、スケッチが888080バイト(85%)を使っています。
最大81920バイトのRAMのうち、グローバル変数が28896バイト(35%)を使っていて、ローカル変数で53024バイト使うことができ ます。
/*
 * RomFontを使ったFont切り替えサンプル
 * フォントファイルはこちら
 * http://ayati.cocolog-nifty.com/blog/2012/08/ipalx322416-64a.html
*/

#include <Adafruit_GFX.h>    // https://github.com/adafruit/Adafruit-GFX-Library
#include <Fontx.h>              // https://github.com/h-nari/Fontx
#include <Humblesoft_GFX.h>     // https://github.com/h-nari/Humblesoft_GFX
#include <Humblesoft_ILI9341.h> // https://github.com/h-nari/Humblesoft_ILI9341

IMPORT_BIN("/fontx/ILGH16XB.FNT", ILGH16XB); //16ドット半角ゴシックフォント
IMPORT_BIN("/fontx/ILGZ16XB.FNT", ILGZ16XB); //16ドット全角ゴシックフォント
IMPORT_BIN("/fontx/ILMH16XB.FNT", ILMH16XB); //16ドット半角明朝フォント
IMPORT_BIN("/fontx/ILMZ16XB.FNT", ILMZ16XB); //16ドット全角明朝フォント
extern const uint8_t ILGH16XB[], ILGZ16XB[], ILMH16XB[], ILMZ16XB[];

/*
 * TFT   ESP8266
 * -------------
 * CS    IO2
 * RESET RST
 * D/C   IO15
 * MOSI  IO13
 * SCK   IO14
 * LED   3V3
 * MISO  N/C
 */
Humblesoft_ILI9341 tft = Humblesoft_ILI9341();
RomFontx font_gothic(ILGH16XB,ILGZ16XB);
RomFontx font_mincyo(ILMH16XB,ILMZ16XB);

void setup() {
  tft.begin();
  tft.setRotation(3);
  tft.fillScreen("BLACK");

  tft.setTextSize(1);
  tft.setFont(&font_gothic);
  tft.print("16ドットゴシック\n");
  tft.print("日本語表示\n");

  tft.setFont(&font_mincyo);
  tft.print("16ドット明朝\n");
  tft.print("日本語表示\n\n");

  tft.setTextSize(2);
  tft.setFont(&font_gothic);
  tft.print("16ドットゴシック\n");
  tft.print("日本語表示\n");
 
  tft.setFont(&font_mincyo);
  tft.print("16ドット明朝\n");
  tft.print("日本語表示\n\n");

}

void loop() {
}



あらかじめSPIFFS ファイルシステムアップローダーを使ってフォントファイルをSPIFFS領域にアップロードしておくことで、
ファイルシステム上のフォントファイルを使うことができます。


スケッチサイズはぐっと小さくなりますが、ポータビリティは低下します。
SPIFFS ファイルシステムアップローダーの使い方はこ ちらに 詳しく紹介されています。

最大1044464バイトのフラッシュメモリのうち、スケッチが317076バイト(30%)を使っています。
最大81920バイトのRAMのうち、グローバル変数が29652バイト(36%)を使っていて、ローカル変数で52268バイト使うことができ ます。
//*
 * FsFontを使ったFont切り替えサンプル
 * フォントファイルはこちら
 * http://ayati.cocolog-nifty.com/blog/2012/08/ipalx322416-64a.html
*/

#include <FS.h>
#include <Adafruit_GFX.h>    // https://github.com/adafruit/Adafruit-GFX-Library
#include <Fontx.h>              // https://github.com/h-nari/Fontx
#include <FsFontx.h>            // https://github.com/h-nari/Fontx
#include <Humblesoft_GFX.h>     // https://github.com/h-nari/Humblesoft_GFX
#include <Humblesoft_ILI9341.h> // https://github.com/h-nari/Humblesoft_ILI9341

/*
 * TFT   ESP8266
 * -------------
 * CS    IO2
 * RESET RST
 * D/C   IO15
 * MOSI  IO13
 * SCK   IO14
 * LED   3V3
 * MISO  N/C
 */
Humblesoft_ILI9341 tft = Humblesoft_ILI9341();
FsFontx font_gothic("/ILGH16XB.FNT","/ILGZ16XB.FNT");
FsFontx font_mincyo("/ILMH16XB.FNT","/ILMZ16XB.FNT");

void setup() {
  delay(1000);Serial.begin(9600);
  if(!SPIFFS.begin()) {
    Serial.println("SPIFFS failed.");
    while(1) { }
  }
  Dir dir = SPIFFS.openDir("/");
  int cnt = 0;
  while(dir.next()){
    File f = dir.openFile("r");
    Serial.printf("[%d] %-12s %12u\n",++cnt,f.name(), f.size());
    f.close();
  }
  Serial.printf("%d files found.\n",cnt);
 
  tft.begin();
  tft.setRotation(3);
  tft.fillScreen("BLACK");

  tft.setTextSize(1);
  tft.setFont(&font_gothic);
  tft.print("16ドットゴシック\n");
  tft.print("日本語表示\n");

  tft.setFont(&font_mincyo);
  tft.print("16ドット明朝\n");
  tft.print("日本語表示\n\n");

  tft.setTextSize(2);
  tft.setFont(&font_gothic);
  tft.print("16ドットゴシック\n");
  tft.print("日本語表示\n");
 
  tft.setFont(&font_mincyo);
  tft.print("16ドット明朝\n");
  tft.print("日本語表示\n\n");

}

void loop() {
}



16ドットフォントではなく、24ドットフォントを使えば、きれいで大きな文字を表示することができます。
16ドットフォントと24ドットフォントを同時に使うこともできます。


24ドットフォントを使うスケッチは以下のようになります。
/*
 * Font切り替えサンプル
 * フォントファイルはこちら
 * http://ayati.cocolog-nifty.com/blog/2012/08/ipalx322416-64a.html
*/

#include <Adafruit_GFX.h>    // https://github.com/adafruit/Adafruit-GFX-Library
#include <Fontx.h>              // https://github.com/h-nari/Fontx
#include <Humblesoft_GFX.h>     // https://github.com/h-nari/Humblesoft_GFX
#include <Humblesoft_ILI9341.h> // https://github.com/h-nari/Humblesoft_ILI9341

//IMPORT_BIN("/fontx/ILGH16XB.FNT", ILGH16XB); //16ドット半角ゴシックフォント
//IMPORT_BIN("/fontx/ILGZ16XB.FNT", ILGZ16XB); //16ドット全角ゴシックフォント
IMPORT_BIN("/fontx/ILGH24XB.FNT", ILGH24XB); //24ドット半角ゴシックフォント
IMPORT_BIN("/fontx/ILGZ24XB.FNT", ILGZ24XB); //24ドット全角ゴシックフォント
extern const uint8_t ILGH24XB[], ILGZ24XB[];

/*
 * TFT   ESP8266
 * -------------
 * CS    IO2
 * RESET RST
 * D/C   IO15
 * MOSI  IO13
 * SCK   IO14
 * LED   3V3
 * MISO  N/C
 */
Humblesoft_ILI9341 tft = Humblesoft_ILI9341();
RomFontx font_gothic(ILGH24XB,ILGZ24XB);

void setup() {
  delay(100);
  tft.begin();
  tft.setRotation(3);
  tft.fillScreen("BLACK");
  tft.setTextSize(1);

  tft.setFont(&font_gothic);
//  tft.print("16ドットゴシック\n");
  tft.print("24ドットゴシック\n");
  tft.print("日本語表示\n\n");
}

void loop() {
}

続く....