先日更新したArduino用フォントライブラリを使って、OLED(SSD1306)ディスプレイでの
漢字表示をやってみました。
OLEDは、0.96インチ ドライバSSD1306搭載 I2C接続タイプを使いました。

0.96インチに8x8ドットの文字はちょっと小さいですが、表示出来ました。

OLED制御には、AdafruitGFX、Adafruit SSD1306ライブラリを使っています。
AdafruitGFX、Adafruit SSD1306の使い方(インストール含む)については、
下記のお勧め参考文献を参照すると良いです。大変丁寧に解説されていています。
お勧め参考文献
・Qiita - ArduinoでOLEDディスプレイを試す
その他関連サイト
・adafruit/Adafruit_SSD1306
・adafruit/Adafruit-GFX-Library
・Learn The Adafruit_GFX library
サンプルスケッチ
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306_128_64.h>
#include <misakiUTF16.h>
Adafruit_SSD1306 OLED(128, 64, &Wire, -1); // OLEDドライバ作成
uint8_t font[8]; // フォント格納バッファ
void setup() {
Serial.begin(115200);
if(!OLED.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("Cannot work."));
for(;;);
}
OLED.clearDisplay();
// "あ"の描画
getFontData(font, "あ"); // "あ"のフォントを取得
OLED.drawBitmap(0, 0, font,8,8,1); // フレームバッファにフォント書き込み
OLED.display(); // 画面更新
// 文字列の表示
char *str="Abcあいうえお、埼玉 " // 文字列
"日本語表示できるかな? "
"Arduinoで漢字表示"
"出来ますよ!";
char *ptr = str; // 文字列参照位置
uint16_t x = 0, y = 8; // 表示位置
while(*ptr) { // 文字列分ループ
ptr = getFontData(font, ptr,true); // 1文字分のフォント取得
if (!ptr)
break; // エラーの場合は終
OLED.drawBitmap(x,y,font,8,8,1); // フレームバッファにフォント書き込み
if (128-8 > x) { // 表示位置更新
x+=8;
} else {
x=0;
y+=8;
}
}
OLED.display(); // 画面更新
}
void loop() {
// put your main code here, to run repeatedly:
}
サンプルスケッチのAdafruit SSD1306用ヘッダファイル"Adafruit_SSD1306_128_64.h"は
オリジナルの "Adafruit_SSD1306.h" をコピーして修正したものです。
Adafruit SSD1306ライブラリ、ヘッダファイルを修正することを前提としているため、
オリジナル版を残し、用途別のコピー&名前変更して使っています。
修正は、単に #define SSD1306_128_32 をコメントアウトして、
#define SSD1306_128_64を有効にしました。
フォントの表示はdrawBitmap()関数を使っています。
引数に表示座標、取得したフォントデータ(font)、フォントサイズ、色(=1:ドットオン)を
指定するだけで、簡単にフォント表示出来ます。
Arduinoのフラシュメモリの制約で教育漢字しかサポートしていませんが、
お手軽に漢字表示が出来ると思います。
追記文字が小さいので文字を大きく表示してみました。

改良スケッチ
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306_128_64.h>
#include <misakiUTF16.h>
Adafruit_SSD1306 OLED(128, 64, &Wire, -1); // OLEDドライバ作成
uint8_t font[8]; // フォント格納バッファ
// ビットマップの拡大描画
void drawBitmapEx(int16_t x, int16_t y, const uint8_t *bitmap, int16_t w, int16_t h,
uint16_t color,uint16_t bgcolor, uint16_t ex) {
int16_t i, j,b=(w+7)/8;
for( j = 0; j < h; j++) {
for(i = 0; i < w; i++ ) {
if(*(bitmap + j*b + i / 8) & (128 >> (i & 7))) {
// ドットあり
if (ex == 1) OLED.drawPixel(x+i, y+j, color); //1倍
else OLED.fillRect(x + i * ex, y + j * ex, ex, ex, color); // ex倍
} else {
// ドットなし
if (ex == 1) OLED.drawPixel(x+i, y+j, bgcolor);
else OLED.fillRect(x + i * ex, y + j * ex, ex, ex, bgcolor);
}
}
}
}
void setup() {
Serial.begin(115200);
if(!OLED.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("Cannot work."));
for(;;);
}
OLED.clearDisplay();
// "あ"の描画
int16_t ex = 2; // 文字倍率
getFontData(font, "あ"); // "あ"のフォントを取得
drawBitmapEx(0, 0, font,8,8,1,0,ex); // フレームバッファにフォント書き込み
OLED.display(); // 画面更新
// 文字列の表示
char *str="Abcあいうえお、埼玉 " // 文字列
"日本語表示できるかな? ";
char *ptr = str; // 文字列参照位置
uint16_t x = 0, y = 8*ex; // 表示位置
while(*ptr) { // 文字列分ループ
ptr = getFontData(font, ptr,true); // 1文字分のフォント取得
if (!ptr)
break; // エラーの場合は終
drawBitmapEx(x,y,font,8,8,1,0,ex); // フレームバッファにフォント書き込み
if (128-8*ex > x) { // 表示位置更新
x+=8*ex;
} else {
x=0;
y+=8*ex;
}
}
OLED.display(); // 画面更新
}
void loop() {
// put your main code here, to run repeatedly:
}
スケッチの変数 ex = 2 の値を変更することで3倍、4倍と変更出来ます。
最近のコメント