ESP32 ( ESP-WROOM-32 )で有機EL ( OLED ) SSD1331 に文字を表示させる方法 ( SPIFFS編 )

最終更新日:2018/08/02

いろいろな方々から質問があったので、ここでは、ESP32 ( ESP-WROOM-32 )の SPI 通信で、OLED ( 有機EL ) SSD1331 モジュールに文字を表示させる、最も簡単な方法を紹介します。
SPIFFS を使った方法です。
簡単と言っても、初めて使う方は手順が沢山あります。

ここでは 8×16 または 16×16 の文字を表示させます。
フリーの日本語フォント、東雲フォントを使いますが、半角の英語アルファベットも表示できます。

スポンサーリンク

使用する主なボード

ESP32開発ボード

例えば、私のお勧めボード、ESPr Developer 32 などがあります。

ESPr Developer 32
スイッチサイエンス(Switch Science)

OLED SSD1331 モジュール( SPI )

接続方法

SPI通信接続で以下のように接続してください。

最新版 Arduino – ESP32 のインストール

Arduino core for the ESP32 は最新版をインストールしておいてください。
2018/07/10より前のものはバグが多いので、古いバージョンの Arduino – ESP32 は必ずフォルダごと削除してから再インストールしてください。
インストール方法は以下の記事を参照してください。

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

SPIFFS メモリサイズを大きくしておく

デフォルトのSPIFFSサイズでは、東雲フォントファイル群を保存できません。
予め、SPIFFS のパーティションテーブルを変更する必要があります。
変更方法は以下の記事を参照してください。

ESP-WROOM-32 ( ESP32 ) SPIFFS メモリサイズを大きくする方法

東雲フォント、UTF8→Shift_JIS変換テーブルをダウンロード

現在、こちらの記事にあるように、東雲フォントを保守開発していた /efont/ さんのページがリンク切れを起こしているので、一時的に GitHub の以下のページにフォントを置いておきました。

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

ZIPファイルをダウンロードして、解凍してください。
その中の以下のファイルを使います。

Utf8Sjis.tbl

私の自作ファイルです。
UTF-8 コードを Shift_JISコードに変換する為のテーブルファイルです。

shnmk16.bdf

全角日本語、東雲フォントファイルです。
16×16 pixel です。

shnm8x16.bdf

半角東雲フォントファイルです。
英語アルファベットはこれを使います。
8×16 pixel です。

SPIFFS ファイルアップローダープラグインで、フォントファイルをアップロードする

Arduino core for the ESP32 のプラグイン、SPIFFSファイルアップローダーを予めインストールしておきます。
アップロード方法は以下の記事を参照してください。

ESP-WROOM-32 ( ESP32 ) SPIFFS アップローダープラグインの使い方

これを使って、前項の3つのフォント関連ファイルを SPIFFS にアップロードしておいてください。

自作ライブラリのインストール

以下の3つの私の自作ライブラリを Arduino – IDE にインストールしておいてください。
GitHubページからZIPファイルをダウンロードしていただき、そのZIPファイルごとArduino – ESP32 にインストールできます。
そのインストール方法は以下の記事を参照してください。
GitHubにある ZIP形式ライブラリ のインストール方法 ( Arduino IDE )

 

ESP32_SSD1331

SSD1331 をドライブする自作ライブラリです。

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

ESP32_SPIFFS_UTF8toSJIS

Utf8Sjis.tbl ファイルを使って、UTF-8コードからShift_JIS に変換する自作ライブラリです。

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

ESP32_SPIFFS_ShinonomeFNT

Shift_JISコードから東雲フォントを抽出する自作ライブラリです。

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

 

文字表示だけの単純なスケッチ

半角英字アルファベットのみの単純なスケッチです。

“Hello World” の所を日本語に替えれば、日本語表示できます。
ただし、縦横サイズが1の場合、1行に半角英字は12文字まで。
全角は6文字までです。

【ソースコード】 (※無保証 ※PCの場合、ダブルクリックすればコード全体を選択できます)

#include "ESP32_SSD1331.h"
#include "ESP32_SPIFFS_ShinonomeFNT.h"
#include "ESP32_SPIFFS_UTF8toSJIS.h"

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

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 DC_OLED =  21; //OLED DC(Data/Command)
const uint8_t RST_OLED =  4; //OLED Reset
const uint8_t CS1_OLED = 15; //CS (Chip Select ピン)

ESP32_SSD1331 ssd1331(SCLK_OLED, MISO_OLED, MOSI_OLED, CS1_OLED, DC_OLED, RST_OLED);
ESP32_SPIFFS_ShinonomeFNT SFR;

void setup() {
  Serial.begin(115200);
  ssd1331.SSD1331_Init();
  ssd1331.Display_Clear(0, 0, 95, 63);

  SFR.SPIFFS_Shinonome_Init3F(UTF8SJIS_file, Shino_Half_Font_file, Shino_Zen_Font_file);
  Serial.println();

  String test_str;
  uint8_t test_buf[12][16] = {};
  uint16_t test_sj_length;

  uint8_t H_Size, V_Size; //水平サイズ:H_Size(1,2,4)  垂直サイズ:V_Size(1,2,4)
  uint8_t X0, X1, Y0, Y1; //ディスプレイ表示座標位置
  uint8_t red, green, blue; //256color, Max red=7, green=7, blue=3

  test_str = "Hello World";
  H_Size = 1; V_Size = 1;
  X0 = 0; Y0 = 0;
  red = 7; green = 7; blue = 3;
  test_sj_length = SFR.StrDirect_ShinoFNT_readALL(test_str, test_buf);
  ssd1331.HVsizeUp_8x16_Font_DisplayOut(H_Size, V_Size, test_sj_length, X0, Y0, red, green, blue, test_buf);

  test_str = "0123456789ab";
  H_Size = 1; V_Size = 1;
  X0 = 0; Y0 = 16;
  red = 7; green = 0; blue = 0;
  test_sj_length = SFR.StrDirect_ShinoFNT_readALL(test_str, test_buf);
  ssd1331.HVsizeUp_8x16_Font_DisplayOut(H_Size, V_Size, test_sj_length, X0, Y0, red, green, blue, test_buf);

  test_str = "Hello!";
  H_Size = 2; V_Size = 2;
  X0 = 0; Y0 = 32;
  red = 0; green = 7; blue = 0;
  test_sj_length = SFR.StrDirect_ShinoFNT_readALL(test_str, test_buf);
  ssd1331.HVsizeUp_8x16_Font_DisplayOut(H_Size, V_Size, test_sj_length, X0, Y0, red, green, blue, test_buf);
}

void loop() {
}

コンパイル書き込み実行

では、Arduino IDE でコンパイル書き込み実行させてみてください。
下図の様に表示されればOKです。

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

スイッチサイエンス ESPr Developer 32 Type-C SSCI-063647
スイッチサイエンス
¥2,420(2024/04/20 00:52時点)
ZEROPLUS ロジックアナライザ LAP-C(16032)
ZEROPLUS
¥22,503(2024/04/20 10:45時点)
Excelでわかるディープラーニング超入門
技術評論社
¥2,068(2024/04/19 19:50時点)

コメント

タイトルとURLをコピーしました