ESP32 で 日本語漢字フォント をカラー OLED に表示させ、4行同時スクロール ( SSD1331 使用)

記事公開日:2017年6月1日
最終修正日:2017年8月2日

スポンサーリンク

Arduino core for ESP32 が大幅アップデートされました。
それに伴い、自作ライブラリもアップデートしましたので、最新版をダウンロードしてください。

こんばんは。

ESP-WROOM-32 ( ESP32 ) でようやく 16×16 ピクセル ( ドット )の 日本語漢字フォントを表示させることができました。

そして、ESP8266 では不可能だった、16×16日本語漢字フォントの4行同時スクロールができるようになりました。

そして、日本語をディスプレイに表示させる関数をライブラリ化して、だいぶ簡素化できました。

例のごとく、日本語漢字フォントはライセンスが Public Domain でフリーの東雲(しののめ)フォントを使っています。
極小のディスプレイや電子工作ではとても重宝する、すばらしいフォントです。
かなり複雑な漢字も判読できますので、日本語表示については個人的に非の打ちどころがありません。

では、この表示方法を解説します。

使うもの

ここ3回ほどの記事では以下のようなほとんど同じデバイスしか使っていません。

ESP32 – DevKitC ( ESP-WROOM-32 開発ボード )

カラー OLED SSD1331 モジュール

Amazon.co.jpでは現在中国販売店しかありません。
値段が安いところもありますが、品質は正直分かりません。
スイマセン。


秋月電子通商さんにもありますが、少々高いです。

http://akizukidenshi.com/catalog/g/gM-11560/

SparkFun マイクロSDカードスロット・ピッチ変換基板

micro SDHC カード

私が使って動作確認が取れている micro SDHC カードは以下のものです。

1/4W 10kΩ程度の固定抵抗 2つ

ブレッドボード、ジャンパーワイヤーパソコン、USBケーブル等

接続する

前回までの記事と全く同じです。
micro SDHC カードスロットは VSPI 接続。
OLED SSD1331 は HSPI 接続です。

もし、micro SDHC カードの読み取りや書き込み不良があれば、SCK や CSピンもプルアップしてみてください。

HSPI_VSPI_20

東雲(しののめ)フォントについて

当ブログでは何度も紹介してきましたが、改めてこの電子工作的にとても素晴らしい東雲フォントをちょこっと紹介します。

16×16 ピクセル(ドット)のフォントは、殆どの日本語漢字を表現できる最も小さいものだと思います。
8×8 ピクセルの美咲フォントもありますが、複雑な漢字は判読が難しいので、この東雲フォントが最適です。

ライセンスは Public Domain で、 フリーです。
古川泰之さん作の、12、14、16 のサイズを持つビットマップフォントで、/efont/ (電子書体オープンラボ) が保守開発をしたものです。
現在は活動を停止しているようです。
オリジナルは以下のページにあります。

東雲 ビットマップフォントファミリー

ただ、この圧縮ファイルはtar.bz2形式のために別途解凍ソフトが必要です。
解凍しにくいと思われますので、後の項目で述べているGitHubのページで再配布させていただきます。
使うファイルは以下の通りです。

全角ゴシック: shnmk16.bdf
半角ゴシック: shnm8x16r.bdf

半角ゴシックの shnm8x16r.bdf というファイル名は長すぎてエラーになる可能性があるので、ファイル名を8文字以下に変更して使って下さい。
例えば、”r” を削除して、

shnm8x16.bdf

とします。

これらのビットマップフォントファイルは BDF形式のテキスト形式で構成されています。
その他、詳しくは以下のページを参照してください。

OLED ( 有機EL ) SSD1306 に16×16ドットのフリーの日本語漢字、東雲フォントを表示させてみました

Arduino IDE の設定など

Arduino IDE は1.8.2 以降を使用してください。
1.8.1 以下の場合は、シリアルモニターの日本語漢字表示は Shift_JIS コードになっています。
1.8.2 以降は UTF-8 コードを出力するだけでシリアルモニターに日本語漢字を表示できます。

また、Arduino core for the ESP32 のインストール方法は以下のページを参照してください。

Arduino core for the ESP32 のインストール方法

自作ライブラリのダウンロード

Arduino core for ESP32 が大幅アップデートされました。
それに伴い、自作ライブラリもアップデートしましたので、最新版をダウンロードしてください。

Arduino core for the ESP32 用に私が自作したライブラリは GitHub の以下のページにあります。
ZIP ファイルをダウンロードしてインストールしてください。
ZIPファイルからそのまま Arduino IDE にインストールする方法は以下のページを参照してください。

GitHubにある ZIP形式ライブラリ のインストール方法

ESP32_SD_UTF8toSJIS Beta ver 1.21

GitHub の以下のページにあります。

https://github.com/mgo-tec/ESP32_SD_UTF8toSJIS

ESP8266 のライブラリを基に、ESP32 用に改良しました。
これは、UTF-8 文字コードから Shift_JIS へ変換するテーブルファイルが必要です。
それは以下のものです。

Utf8Sjis.tbl

これは後で述べるリンクからダウンロードできます。

Arduino IDE のスケッチ(ソースコード)に入力した日本語漢字は UTF-8 コードの文字列になるので、それを Shift_JIS  文字コードに変換するライブラリです。
String クラスなどの文字列は全て UTF-8 になるので、2バイト~3 バイトで構成された文字コードです。
Shift_JIS コードに変換することで、全て2バイト以下になります。
半角のASCII コードはそのまま出力します。

ESP32_SD_ShinonomeFNT Beta ver 1.21

GitHub の以下のページにあります。

https://github.com/mgo-tec/ESP32_SD_ShinonomeFNT

これもまた、ESP8266 のライブラリを基に改変しました。
UTF-8コードのString 文字列から直接東雲フォントをSDカードから読み込めるようにしました。
よって、上記の ESP32_SD_UTF8toSJIS ライブラリをインクルードしています。

以前の ESP8266 のライブラリよりもフォント読み込みは格段に簡単になったと思います。

ESP32_SSD1331 Beta ver1.3

前々回の記事でアップしたライブラリですが、今回 Beta ver 1.3 にバージョンアップしました
GitHub の以下のページにあります。

https://github.com/mgo-tec/ESP32_SSD1331

文字フォントを右から左へスクロールする関数をできるだけ簡素化してみました。

必要なフォントおよびテーブルファイル

GitHub の以下のページにあります。

https://github.com/mgo-tec/SDcard_sample_filses

ZIPファイルをダウンロードして、解凍してください。
font フォルダの中の以下の3つのファイルが必要です。

これらを micro SDHC カードのルートに /font というフォルダを作成し、そこにコピーしておいてください。

Utf8Sjis.tbl

UTF-8 から Shift_JIS へ変換するためのテーブルファイルです。
私の自作のバイナリファイルです。
ライセンスは MIT です。
著作権表記してあれば、自由に使うことができます。

shnmk16.bdf

16×16 東雲フォント(全角)

shnm8x16.bdf

8×16 東雲フォント(半角)
上記でも述べましたが、ファイル名の ”r” を削除して、8文字に収めたものです。

文字列表示サンプルスケッチの入力

では、まず、ただ単に文字列を OLED ディスプレイに表示するだけのスケッチを紹介します。
SSD1331 は 96 x 64 pixel なので、全角16×16ドットフォントは横に6文字しか表示できません。
半角 8×16 ならば12文字表示できます。

ブラウザからスケッチをコピーしたら、必ず一旦保存してください。そうしないと正しく表示されませんので要注意!!
#include "ESP32_SD_ShinonomeFNT.h"
#include "ESP32_SD_UTF8toSJIS.h"
#include "ESP32_SSD1331.h"

const char* UTF8SJIS_file = "/font/Utf8Sjis.tbl"; //UTF8 Shift_JIS 変換テーブルファイル名を記載しておく
const char* Shino_Zen_Font_file = "/font/shnmk16.bdf"; //全角フォントファイル名を定義
const char* Shino_Half_Font_file = "/font/shnm8x16.bdf"; //半角フォントファイル名を定義

const uint8_t CS_SD = 5; //SD card CS ( Chip Select )

const uint8_t SCLK_OLED =  14; //SCLK
const uint8_t MOSI_OLED =  13; //MOSI (Master Output Slave Input)
const uint8_t MISO_OLED =  12; //これは実際は使っていない。MISO (Master Input Slave Output)
const uint8_t CS_OLED = 15;
const uint8_t DC_OLED =  16; //OLED DC(Data/Command)
const uint8_t RST_OLED =  4; //OLED Reset

ESP32_SSD1331 ssd1331(SCLK_OLED, MISO_OLED, MOSI_OLED, CS_OLED, DC_OLED, RST_OLED);

ESP32_SD_ShinonomeFNT SFR(CS_SD, 24000000);

void setup() {
  Serial.begin(115200);
  ssd1331.SSD1331_Init(); //OLED SSD1331 初期化

  //※この関数を使う場合はStrDirect_ShinoFNT_readALL関数を使う場合限定。
  //3つのファイルを同時に開くため、後でクローズすることが必要。
  SFR.SD_Shinonome_Init3F(UTF8SJIS_file, Shino_Half_Font_file, Shino_Zen_Font_file);

  uint8_t font_buf[12][16];
  uint16_t sj_length;
  String str = "日本語漢字!";
  
  sj_length = SFR.StrDirect_ShinoFNT_readALL(str, font_buf); //String 文字列から一気にフォント変換
  ssd1331.SSD1331_8x16_Font_DisplayOut(sj_length, 0, 0, 7, 7, 3, font_buf); //OLED SSD1331 へ出力
  
  str = "ESP-WROOM-32";
  sj_length = SFR.StrDirect_ShinoFNT_readALL(str, font_buf); //String 文字列から一気にフォント変換
  ssd1331.SSD1331_8x16_Font_DisplayOut(sj_length, 0, 16, 7, 0, 0, font_buf); //OLED SSD1331 へ出力

  str = "半角もイケる";
  sj_length = SFR.StrDirect_ShinoFNT_readALL(str, font_buf); //String 文字列から一気にフォント変換
  ssd1331.SSD1331_8x16_Font_DisplayOut(sj_length, 0, 32, 0, 7, 0, font_buf); //OLED SSD1331 へ出力

  str = "アカサタナハマヤラワン";
  sj_length = SFR.StrDirect_ShinoFNT_readALL(str, font_buf); //String 文字列から一気にフォント変換
  ssd1331.SSD1331_8x16_Font_DisplayOut(sj_length, 0, 48, 0, 0, 3, font_buf); //OLED SSD1331 へ出力

  SFR.SD_Shinonome_Close3F(); //StrDirect_ShinoFNT_readALL関数を使う場合、必ず閉じておく
}

void loop() {

}

ただ単にディスプレイに東雲フォントを表示するだけならば、ESP8266 でやっていた時よりも格段に簡単にしました。

【解説】

●1-3行目:
自作ライブラリのインクルードです。
ESP32_SD_ShinonomeFNT.h 内で ESP32_SDUTF8toSJIS.h をインクルードしていますが、このライブラリが必要ということで、あえてここでもインクルードしています。
2重インクルードしないように設定していますので、ご安心を。

●5-7行目:
テーブルファイルやフォントファイルをここで定義します。

●9-16行目:
ESP32-DevKitC の GPIO ピン設定です。
OLED SSD1331 は HSPI ピンアサインです。

●18行目:
自作ライブラリ ESP32_SSD1331 のクラス宣言です。
このライブラリの使い方は以前の記事を参照してください。

●20行目:
自作の ESP32 用 東雲フォントライブラリのクラス宣言です。
micro SDHC カードのCS ( Chip Select )ピンと SPI クロック周波数を設定できます。
ここでは、SPIモードの理論上最大値と思われる24MHz としています。

●24行:
SSD1331 の初期化です。
初期化の内容は過去の記事を参照してください。

●28行目:
この関数は、ESP32_SD_ShinonomeFNTライブラリの初期化なのですが、3つのファイルを同時に開いているので注意です。
Arduino core for the ESP32 では、2017/5/31 時点で同時に4つまでしかファイルを開けません。
(以下記事参照)
ESP32 ( ESP-WROOM-32 ) で micro SDHC メモリカードを使う場合の注意点

この3つ同時に開く必要があるライブラリ関数は、
StrDirect_ShinoFNT_readALL
だけです。
この関数を使い終わった後には、49行目にあるように3つのファイルをクローズしておかないと、新しいファイルを開く時に開けないことがありますので要注意です。

●34行目:
この関数が今回初登場した関数で、String 文字列をいちいち Shift_JIS コード変換しなくても、そのまま東雲フォントを読み込んで、font_buf に格納できるようになりました。
Shift_JIS コードのバイト数を返します。
そのバイト数が全て半角に換算した文字数です。

●35行目:
8×16ドットフォントを OLED SSD1331 ディスプレイに表示する関数です。

SSD1331_8x16_Font_DisplayOut(半角換算文字数, 始点X0, 始点Y0, 赤, 緑, 青, フォントbuf);

色は256色カラーで、
赤:0-7
緑:0-7
青:0-3
で指定して混ぜます。
半角換算文字数は12を超えないようにしてください。

●49行目:
開いた3つのファイルをまとめてクローズします。
これを忘れないようにしてください。

以上、これをコンパイル実行してみてください。
下図の様に表示されればOKです。

ブラウザからスケッチをコピーしたら、必ず一旦保存してください。そうしないと正しく表示されませんので要注意!!

ESP32_shinonome_font_01

どうでしょうか。
ESP8266 のときよりも格段に表示しやすくなったと思います。

電光掲示板風スクロール方法

次に、文字列1行を右から左へスクロールするスケッチです。

ブラウザからスケッチをコピーしたら、必ず一旦保存してください。そうしないと正しく表示されませんので要注意!!
#include "ESP32_SD_ShinonomeFNT.h"
#include "ESP32_SD_UTF8toSJIS.h"
#include "ESP32_SSD1331.h"

const char* UTF8SJIS_file = "/font/Utf8Sjis.tbl"; //UTF8 Shift_JIS 変換テーブルファイル名を記載しておく
const char* Shino_Zen_Font_file = "/font/shnmk16.bdf"; //全角フォントファイル名を定義
const char* Shino_Half_Font_file = "/font/shnm8x16.bdf"; //半角フォントファイル名を定義

const uint8_t CS_SD = 5; //SD card CS ( Chip Select )

const uint8_t SCLK_OLED =  14; //SCLK
const uint8_t MOSI_OLED =  13; //MOSI (Master Output Slave Input)
const uint8_t MISO_OLED =  12; //これは実際は使っていない。MISO (Master Input Slave Output)
const uint8_t CS_OLED = 15;
const uint8_t DC_OLED =  16; //OLED DC(Data/Command)
const uint8_t RST_OLED =  4; //OLED Reset

ESP32_SSD1331 ssd1331(SCLK_OLED, MISO_OLED, MOSI_OLED, CS_OLED, DC_OLED, RST_OLED);

ESP32_SD_ShinonomeFNT SFR(CS_SD, 24000000);
ESP32_SD_UTF8toSJIS u8ts;

const uint16_t MaxTxt = 100; //Shift_JISコードの最大数

uint8_t sj_txt[MaxTxt]; //Shift_JISコード格納
uint16_t Scrolle_speed = 10; //文字列スクロールインターバル時間
uint32_t scl_LastTime = 0;
uint8_t Fnt_buf[2][16]; //フォント格納
uint16_t sj_length = 0; //Shift_JISコードの長さ
uint8_t scl_cnt = 0; //フォントのスクロールカウント数(ドット単位)
uint16_t SJ_cnt = 0; //Shift_JISコードカウント
bool fnt_read_flag = true; //フォントを読み込むか否かのフラグ
uint8_t ZorH = 0; //全角ならば 2 , 半角ならば 1 を格納
uint8_t dummy_cnt = 0; //全角ならば次のフォントを読み込むかどうかのカウント

void setup() {
  Serial.begin(115200);
  ssd1331.SSD1331_Init(); //OLED SSD1331 初期化
  
  SFR.SD_Shinonome_Init2F(Shino_Half_Font_file, Shino_Zen_Font_file); //ライブラリ初期化。2ファイル同時に開く
  u8ts.ESP32_SD_UTF8toSJIS_Init(UTF8SJIS_file); //ライブラリ初期化

  String str1 = "やっとESP32で日本語フォント表示ができたよ~ん!!!";
  
  sj_length = u8ts.UTF8_to_SJIS(str1, sj_txt); //String 文字列をSift_JISコードに変換

  scl_LastTime = millis();
}

void loop() {
  if(millis() - scl_LastTime > Scrolle_speed){
    if(fnt_read_flag == true){
      //フォントを読み込んだら、SJ_cnt を1つ進める
      ZorH = SFR.Sjis_inc_FntRead(sj_txt, sj_length, &SJ_cnt, Fnt_buf);
    }
    //半角の場合、scl_cntが 8 になったら次のフォントを読み込む。全角の場合は16までスクロールする
    fnt_read_flag = ssd1331.Scroller_8x16_RtoL(0, ZorH, Fnt_buf[dummy_cnt], &scl_cnt, &dummy_cnt, 7, 7, 3);
    scl_LastTime = millis();
  }
}

【解説】

●1-20行:
ここまでは前のスケッチと同じです。

●21行目:
ESP32_SD_ShinonomeFNT.h 内で ESP32_SD_UTF8toSJIS.h をインクルードしていますが、ここでは、UTF8コードから Shift_JISコードへ独立して変換する必要があるため、ここでクラス宣言します。

●23行:
Shift_JIS コード配列の最大数を決めます。
とりあえず、半角100文字分としておきます。

●25-34行:
ここでは、文字列を電光掲示板のようにスクロールさせる変数を初期化しています。
scl_cnt はスクロールカウントを1ドットずつカウントします。
カウントが7まで進んだら半角分進みます。
SJ_cnt は Shift_JISコードの sj_txt 配列のカウントです。
要するに、半角の場合、scl_cnt が7まで進んだら SJ_cnt を1つ進めてフォントを読み込むという感じにします。
読み込む場合は fnt_read_flag が true になります。
ZorH は読み込んだフォントが全角ならば 2 半角ならば 1 になります。
半角ならば、フォントのdummy_cnt がゼロのままで、全角ならば半角分スクロールしたら 1 になります。
これらの変数は毎回繰り返してもメモリに保持しておかなければならないので、グローバル変数領域で宣言する必要があります。

●40行:
ここでは、2ファイルだけ開くので、この関数を使います。

●41行:
ESP32_SD_UTF8toSJIS ライブラリを初期化します。
ここで3つ目のファイルとして、UTF8toSjis.tbl ファイルを開きます。

●45行:
今回新たに登場した関数で、String 文字列から一気に Shift_JIS コードへ変換して、コード長を返します。

●51行:
ここで文字列のスクロール速度を調整します。

●52-58行:
54行目では、SJ_cnt カウントに値する Shift_JIS コードを読み取り、フォントに変換します。
全角ならば ZorH に2を返し、半角ならば1を返します。
57行の Scroller_8x16_RtoL 関数が呼び出される度に、scl_cnt が1つずつ進み、フォントが1ドットずつ移動します。
これは以前の記事でも紹介した、グラフィックアクセラレーションコマンドを使ってスクロールしています。
全角ならば dummy_cnt を0~1まで進めて全角文字を表示させます。
全角の場合、16ドット移動したら、fnt_read_flag にtrue を返し、次のフォントを読み込みます。

以上です。
いかがでしょうか。
ESP8266 のときよりか、格段にスクロール関数が簡単になったと思いませんか?
私的にもとても面倒だったので、これで作業がはかどります。

では、これをコンパイル実行させてみてください。
下図の動画のように表示されればOKです。

ブラウザからスケッチをコピーしたら、必ず一旦保存してください。そうしないと正しく表示されませんので要注意!!

 4行同時にスクロールしてみる

では、上記のものを応用して、今まで出来なかった、4行同時スクロールしてみたいと思います。
以下のスケッチを入力してみてください。

ブラウザからスケッチをコピーしたら、必ず一旦保存してください。そうしないと正しく表示されませんので要注意!!
#include "ESP32_SD_ShinonomeFNT.h"
#include "ESP32_SD_UTF8toSJIS.h"
#include "ESP32_SSD1331.h"

const char* UTF8SJIS_file = "/font/Utf8Sjis.tbl"; //UTF8 Shift_JIS 変換テーブルファイル名を記載しておく
const char* Shino_Zen_Font_file = "/font/shnmk16.bdf"; //全角フォントファイル名を定義
const char* Shino_Half_Font_file = "/font/shnm8x16.bdf"; //半角フォントファイル名を定義

const uint8_t CS_SD = 5; //SD card CS ( Chip Select )

const uint8_t SCLK_OLED =  14; //SCLK
const uint8_t MOSI_OLED =  13; //MOSI (Master Output Slave Input)
const uint8_t MISO_OLED =  12; //これは実際は使っていない。MISO (Master Input Slave Output)
const uint8_t CS_OLED = 15;
const uint8_t DC_OLED =  16; //OLED DC(Data/Command)
const uint8_t RST_OLED =  4; //OLED Reset

ESP32_SSD1331 ssd1331(SCLK_OLED, MISO_OLED, MOSI_OLED, CS_OLED, DC_OLED, RST_OLED);

ESP32_SD_ShinonomeFNT SFR(CS_SD, 24000000);
ESP32_SD_UTF8toSJIS u8ts;

const uint16_t MaxTxt = 100; //Shift_JISコードの最大数

uint8_t sj_txt[4][MaxTxt]; //Shift_JISコード格納
uint16_t Scrolle_speed[4] = {0, 2, 4, 6}; //文字列スクロールインターバル時間
uint32_t scl_LastTime[4] = {0, 0, 0, 0};
uint8_t Fnt_buf[4][2][16]; //フォント格納
uint16_t sj_length[4] = {0, 0, 0, 0}; //Shift_JISコードの長さ
uint8_t scl_cnt[4] = {0, 0, 0, 0}; //フォントのスクロールカウント数(ドット単位)
uint16_t SJ_cnt[4] = {0, 0, 0, 0}; //Shift_JISコードカウント
bool fnt_read_ok[4] = {true, true, true, true}; //フォントを読み込むか否かのフラグ
uint8_t ZorH[4] = {0, 0, 0, 0}; //全角ならば 2 , 半角ならば 1 を格納
uint8_t dummy_cnt[4] = {0, 0, 0, 0}; //全角ならば次のフォントを読み込むかどうかのカウント

void setup() {
  Serial.begin(115200);
  ssd1331.SSD1331_Init(); //OLED SSD1331 初期化

  //※この関数を使う場合はStrDirect_ShinoFNT_readALL関数を使う場合限定。
  //3つのファイルを同時に開くため、後でクローズすることが必要。
  SFR.SD_Shinonome_Init3F(UTF8SJIS_file, Shino_Half_Font_file, Shino_Zen_Font_file);

  uint8_t font_buf[12][16];
  SFR.StrDirect_ShinoFNT_readALL("16x16 日本語", font_buf); //String 文字列から一気にフォント変換
  ssd1331.SSD1331_8x16_Font_DisplayOut(12, 0, 16, 7, 7, 3, font_buf); //OLED SSD1331 へ出力
  SFR.SD_Shinonome_Close3F(); //StrDirect_ShinoFNT_readALL関数を使う場合、必ず閉じておく
  delay(2000);
  
  SFR.SD_Shinonome_Init2F(Shino_Half_Font_file, Shino_Zen_Font_file); //ライブラリ初期化。2ファイル同時に開く
  u8ts.ESP32_SD_UTF8toSJIS_Init(UTF8SJIS_file); //ライブラリ初期化

  String str1 = "やっとESP32で日本語フォント表示ができたよ~ん!!!123456789";
  String str2 = "●■▲×→⇔↑⇒↓←※ぁぃぅぇぉゃゅょャュョァィゥェォ";
  String str3 = "アカサタナハマヤラワンァィゥェォャュョabcdefghijklmnアイウエオカキクケコ";
  String str4 = "JIS第2水準-弌鯖鰺鰯鰤齋堯槇遙凜熙¥abcdefgxyz ";
  
  sj_length[0] = u8ts.UTF8_to_SJIS(str1, sj_txt[0]); //String 文字列をSift_JISコードに変換
  sj_length[1] = u8ts.UTF8_to_SJIS(str2, sj_txt[1]);
  sj_length[2] = u8ts.UTF8_to_SJIS(str3, sj_txt[2]);
  sj_length[3] = u8ts.UTF8_to_SJIS(str4, sj_txt[3]);

  delay(10);
  
  for(int i=0; i<4; i++){
    scl_LastTime[i] = millis();
  }
}

void loop() {
  font_scroll(0, 0, 7, 7, 3);
  font_scroll(1, 16, 0, 0, 3);
  font_scroll(2, 32, 0, 7, 0);
  font_scroll(3, 48, 7, 0, 0);
}

void font_scroll(uint8_t num, uint8_t y0, uint8_t red, uint8_t green, uint8_t blue){
  if(millis() - scl_LastTime[num] > Scrolle_speed[num]){
    if(fnt_read_ok[num] == true){
      //フォントを読み込んだら、SJ_cnt を1つ進める
      ZorH[num] = SFR.Sjis_inc_FntRead(sj_txt[num], sj_length[num], &SJ_cnt[num], Fnt_buf[num]);
    }
    //半角の場合、scl_cntが 8 になったら次のフォントを読み込む。全角の場合は16までスクロールする
    fnt_read_ok[num] = ssd1331.Scroller_8x16_RtoL(y0, ZorH[num], Fnt_buf[num][dummy_cnt[num]], &scl_cnt[num], &dummy_cnt[num], red, green, blue);
    scl_LastTime[num] = millis();
  }
}

変数をすべて配列にして、4行同時スクロールに挑戦です。
では、これをコンパイル書き込み実行してみてください。

ブラウザからスケッチをコピーしたら、必ず一旦保存してください。そうしないと正しく表示されませんので要注意!!

ESP8266 の時には、2行以上スクロールさせると遅くて使い物にならなかったのですが、ESP32 と SSD1331 のグラフィックアクセラレーションコマンドのおかげで、4行同時でも文句ない速さでスクロールしてくれました。
以下の動画をご覧ください。

いかがでしょうか。
今までのESP8266 のプログラムでは4行同時スクロールなどは、とても無理だったのですが、ここまで速くスクロールしてくれました。
OLED SSD1331 の SPI クロックは 150ns と遅い方なのに、これだけ速いというのは驚きです。
ESP32 の計算速度が速いということもありますが、一番影響が大きいのは、SSD1331 のグラフィックアクセラレーションコマンドだと思います。

これが出来て何がスゴイのかというと、WEBから取得した記事のテキストを4行同時スクロールできるということです。
つまり、この小さいディスプレイで、4つの記事を同時に読むことができるのです。
これは画期的ですね。
ツイートを表示させることも可能かと思います。

では、4つ同じ速度だと見た目的に面白くないので、ちょっと時間差をつけてみます。
26行目を以下のように変えてみて下さい。

uint16_t Scrolle_speed[4] = {0, 2, 4, 6};

そしてコンパイル実行してみると、こんな感じになります。

いかがでしょうか。
見た目にオモシロイですね。
ただ、一番上の行は速度がアップして、速すぎて読めないですが・・・。

まとめ

以上、ESP32 – DevKitC ( ESP-WROOM-32 開発ボード ) と OLED ( 有機EL ) SSD1331 を使った、日本語漢字フォントの表示についてでした。

東雲フォントというのは、アマチュア電子工作家の私にとって、とても素晴らしいフォントだと思います。
開発された古川泰之さんや /efont/ の皆さまには敬意を表したいです。
ありがとうございました。
m(_ _)m

そして、ESP8266 ( ESP-WROOM-02 )のときには出来なかった4行同時スクロールが問題なく出来るようになって、改めて ESP32 のポテンシャルの凄さや、安いながらもSSD1331 の素晴らしさを実感しています。

では、次回は今までやってきた、NTP時計や WEB 天気予報、Yahoo ニュースをひとまとめにして表示させてみたいと思います。

ではまた・・・。

mgo-tec電子工作 関連コンテンツ ( 広告含む )

スポンサーリンク

Amazon.co.jp 当ブログのおすすめ







投稿者:

mgo-tec

Arduino , ESP32 ( ESP-WROOM-32 ) , ESP8266 ( ESP-WROOM-02 )等を使って、主にスマホと連携した電子工作やプログラミング記事を書いてます。ライブラリも作ったりしてます。趣味、独学でやってますので、動作保証はしません。 電子回路やプログラミングの専門家ではありません。 畑違いの仕事をしてます。 でも、少しだけ電気の知識が必要な仕事なので、電気工事士や工事担任者等の資格は持ってます。

コメントを残す

メールアドレスが公開されることはありません。

*画像の文字を入力してください。(スパム防止の為)