OLED(SSD1306)で美咲フォントを使った漢字表示
先日更新した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を有効にしました。
引数に表示座標、取得したフォントデータ(font)、フォントサイズ、色(=1:ドットオン)を
指定するだけで、簡単にフォント表示出来ます。
お手軽に漢字表示が出来ると思います。
追記
文字が小さいので文字を大きく表示してみました。
改良スケッチ
#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倍と変更出来ます。
« Arduino用フォントライブラリを更新しました | トップページ | Arduino Basicを改良してシリアルコンソール対応 »
「arduino」カテゴリの記事
- Arduino UNO R4 WiFiに関するメモ(2024.03.21)
- Arduino用 美咲フォントライブラリを更新しました(2024.03.21)
- Arduino用ライブラリの自作用のメモ(2024.03.18)
- 豊四季Tiny Basic for micro:bit のマニュアルを更新しました(2020.11.21)
- 豊四季タイニーBASIC for Arduino 機能拡張版 V0.08の更新(2020.07.27)
「表示器制御関連」カテゴリの記事
- Arduino用 美咲フォントライブラリを更新しました(2024.03.21)
- Raspberry Pi Pico(MicroPython)でLEDドットマトリックスを使ってみる(2024.03.14)
- Raspberry Pi Pico MicroPython用のマルチフォントライブラリ(2023.02.09)
- MicroPython(Raspberry Pi pico)で8x8ドットNeoPixcel文字表示(2023.02.08)
- M5Stackで日本語表示(2)(2020.02.04)
« Arduino用フォントライブラリを更新しました | トップページ | Arduino Basicを改良してシリアルコンソール対応 »
コメント