u8g2_font_unifont_t_japanese1を指定すると、日本語も表示できるそう。

やってみる。
#include <Arduino.h>
#include <U8g2lib.h>
#include <Wire.h>
#define SDA_PIN (26)
#define SCL_PIN (32)
// 日本語対応フォントを使用(例: unifont、フルバッファ使用)
U8G2_SSD1306_72X40_ER_F_HW_I2C u8g2(U8G2_R0, /* reset=*/U8X8_PIN_NONE);
void setup(void){
Wire.begin(SDA_PIN, SCL_PIN);
u8g2.begin();
u8g2.enableUTF8Print(); // UTF-8を扱うために必要
}
void loop(void){
u8g2.clearBuffer();
// 日本語対応フォント(漢字も対応)
u8g2.setFont(u8g2_font_unifont_t_japanese1);
// UTF-8で直接出力(drawStrではなくprintで描画)
u8g2.setCursor(0, 24);
u8g2.print("寿司食いてー!");
u8g2.sendBuffer();
delay(1000);
}
表示がハミ出てセンタリングされて、「司食いてー」と表示されている。フォントサイズ的には2行半くらいは表示できそうな感じ。日本語表示そのものは簡単ね。
表示が切れるのは、u8g2内部の描画バッファは初期化時に72x40に指定されているので、センタリングされて、そこからはみ出るものは切れてしまっているのかな?
ん? そっか、「寿」と「!」がデフォルトのフォントセットに含まれていないようだ。
寿と!を別のフォントに変更すると、ちゃんと「す司食いて」の「て」の前半くらいまで表示された。
u8g2.print("す司食いてーよ");

さて、対応していないグリフの表示について、ChatGPTo4でスケッチ書かせたら、こんなやつしか書けなかったので捨てる。

ChatGPTo4とはオサラバして、Manusに長めのプロンプト作って投げたら、なにやらどっかのサイトにアクセスして、u8g2で使えるカスタムフォントファイルを作成している。
u8g2_font_unifont_myfonts.h
/* Fontname: -gnu-Unifont-Medium-R-Normal-Sans-16-160-75-75-c-80-iso10646-1 Copyright: Copyright (C) 1998-2019 Roman Czyborra, Paul Hardy, Qianqian Fang, Andrew Miller, Johnnie Weaver, David Corbett, et al. License GPLv2+: GNU GPL version 2 or later <http://gnu.org/licenses/gpl.html> with the GNU Font Embedding Exception. Glyphs: 104/57086 BBX Build Mode: 0 */ const uint8_t u8g2_font_unifont_myfonts[1497] U8G2_FONT_SECTION("u8g2_font_unifont_myfonts") = "h\0\3\2\5\5\4\5\6\20\20\0\376\12\376\13\377\1\233\3\63\4\377 \6\0\240G\1!\10A" "\61DqH\4\42\10\205(F\221\271\5#\17F%D\325\323\60$Q\313\60D=\1$\22G%" "D\27\16J\24I\341<FRe\20\63\0%\24G%D\243II)\211\224\64N\23)\211\222\222" "\246\0&\22G%D\265\225\262J(&\221\226\210I&M\1'\7\201\60F\61\4(\14\203\355C" "\225DI\324\[\224\5)\15\203\351C\221EY\324K\224D\0*\15\347dDW\252\264mIS-" "\3+\14\347dD\27\327\206!\213k\0,\11\202\254C\241$\12\0-\7$(E\61\4.\7B" ",D\61\4/\14F%D\[\254\206iXM\1\60\22F%D\245EI\250M\211\22mb\22e" "\22\0\61\13E)D\225II\330\247A\62\17F%D\63$\241\230fZXM\207\1\63\20F%" "D\63$\241\230Fs*\212\311\220\0\64\20F%D\31jIT\311\222,\31\306\264\2\65\17F%" "DqH\253\203\234\246b\62$\0\66\17F%D\65\205i:(\241c\62$\0\67\13F%Dq" "-\246\305\264\11\70\20F%D\63$\241\61\31\222\320\61\31\22\0\71\16F%D\63$\241\61\31\324" "\306h\2:\11\342lD\61\304C\0;\12\42\355C\61\304J\242\0<\11%)D\231u\355\0=" "\11\246\244Dq'\16\3>\11%%D\221v\353\10\77\17F%D\63$\241\230\206\325\34L#\0" "@\22F%D\65eR\242$K\244DJ$-\361\20A\16F%D\245E-\241\70\14\242c\0" "B\16F%D\61(\241qXB\307a\1C\16F%D\63$\241\265\243\230\14\11\0D\16F%" "D\61DY\22\372-\31\42\0E\15F%DqH\253\203\222\266\16\3F\14F%DqH\253\203" "\222v\5G\16F%D\63$\241\265\64\204\66e\11H\13F%D\21:\16\203\350\61I\13E)" "D\61Ha\77\15\2J\16G%D\65\210qOY\224e\33\0K\21F%D\21jIT\311D" "\61\311\242Z\22\6L\11F%D\221\366\327aM\15F%D\21\212\323\20-\36\35\3N\20F%" "D\21n\233\22)\221\224H\211v\14O\14F%D\63$\241\77&C\2P\15F%D\61(\241" "qX\322\256\0Q\26g\345C\63Da\22&a\22&a\22&\211\222H\322\220\13R\20F%D" "\61(\241qX\242Z\222%\241\30S\15F%D\63$\241\331QL\206\4T\12G%Dq\310\342" "\376\6U\13F%D\21\372\307dH\0V\21G%D\221Z\223,\312\242\254\22&i\234\1W\15" "F%D\21zq\231\206h\24\3X\17F%D\21\212I\324&jQK(\6Y\16G%D\221" "\252I\26e\225\64\356\6Z\13F%Dq-\366\232\16\3\[\12\203\361C\61D\375\323\0\134\14F" "%D\221\306\325\70\215\253\1\]\12\203\345C\61\365OC\0^\11fdF\245EI\30\_\7'\344" "Cq\10`\7c\250F\221\25a\16\6%D\63$a\232\14\243MY\2b\16f%D\221\266," "\232\350\270)\13\0c\15\6%D\63$\241\332\61\31\22\0d\14f%D\333\262h\243\67e\11e" "\17\6%D\63$\241\70\14j\61\31\22\0f\14e%D'\205\245A\12{\2g\23f\245C\233" ",Z\222%Y\264\245C\22\212\311\220\0h\14f%D\221\266,\232\350c\0i\13e)D\25\346" "\210\330\247Aj\14\245\245CYG\304>J\221\4k\21f%D\221\266%Q%\23\223,\252%a" "\0l\12e)D#\366O\203\0m\22\7%D\261(Q$ER$ER$ER\1n\13\6" "%D\221,\232\350c\0o\14\6%D\63$\241\217\311\220\0p\16F\245C\221,\232\350\270)K" "\232\2q\14F\245C\263h\243\67eI\13r\13\6%D\221,\232\250v\5s\15\6%D\63$" "\241\354\230\14\11\0t\13E%D\25\226\6)\354*u\12\6%D\21\372MY\2v\14\6%D" "\21\32\223\250\67Q\2w\21\7%D\221J\221\24I\221\24I\221T\261\0x\17\6%D\21\212I" "\224\211Z\224\204b\0y\16F\245C\21zL\42KZ\31\22\0z\12\6%Dq\15{\35\6{" "\16\244\251C\245da\26\25kQ\26\12|\7\301\261C\361A}\17\244\251C!fQ\26\226ja" "\226H\0~\12g$F\243I\221\246\0\177#\20\242\203\221\364;I\347\244\223\16I\66%a\32%" "C\222MI\230NC\62\354\234tN:)\351\7\200$\20\242\203\221\364;I\347\244\223\66i\231\222" "(\211\242C\22\15a\224D\305(YtN:'\235\224\364\3\0\0\0\4\377\377\60D\31,e\204" "\221\243\261\226#Q\16%Y\232D\251\224\304\221\16\346\10\0\60f\33\214%\204\17\15\341\20\16Q\216" "\345`\216\345`\16\346`\16\346h\216N\0\60\374\13Ld\205\21\17\312\260\2S\370&\354\245\203\63" "\34t\60\7\207\203\222\203\71\30\15\[\24fQ\230Ea\26\205Y\64lQ\230\345P\222c\11\0\[" "\377&\17\242\203\235\343\71\64<\344\71\66\34\364\34\32>\246\71\222\346\303A\214Ka\32fa\232\345" "h\222\303)\0\230\337(\17\242\203\237\303I\16f\71\224d\261\226I\312p\321\362x\70\347\361p\316" "\221\64\223\342T\217\302\70\211S\35I\0\377\1\12B=\204\361A\32\2\0";
スケッチはこんな感じ。
#include <Arduino.h>
#include <U8g2lib.h>
#include <Wire.h>
#include "u8g2_font_unifont_myfonts.h"
#define SDA_PIN 26
#define SCL_PIN 32
U8G2_SSD1306_72X40_ER_F_HW_I2C u8g2(U8G2_R0, /* reset=*/U8X8_PIN_NONE); // EastRising 0.42" OLED
const char* japaneseText = "寿司食いてー!";
int textWidth;
int xPos;
void setup(void)
{
Wire.begin(SDA_PIN, SCL_PIN);
u8g2.begin();
u8g2.enableUTF8Print(); // Enable UTF-8 support for Japanese characters
u8g2.setFont(u8g2_font_unifont_myfonts); // Use custom Japanese font
textWidth = u8g2.getUTF8Width(japaneseText);
xPos = u8g2.getDisplayWidth(); // Start text from right edge of the display
}
void loop(void)
{
u8g2.clearBuffer();
u8g2.drawUTF8(xPos, 15, japaneseText);
u8g2.sendBuffer();
xPos--; // Move text to the left by 1 pixel
// If text has scrolled completely off the left, reset its position to the right
if (xPos < -textWidth) {
xPos = u8g2.getDisplayWidth();
}
delay(20); // Adjust this value to change scrolling speed
}
できてるな...
MiniOLED使ってみた - YouTube
https://www.youtube.com/watch?v=BKTkkMN1KRg
しかし、相変わらずAIはいろいろアドバイスをしないとまともなコードを吐けない。方針も間違ったところに入り込んで重箱の隅でグルグル回っている。ターゲットを指定しても、ピンを調べて正しいものを設定することすらできない。サンプルスケッチを与えても、十分なアウトプットができない。
グリフデータを拾ったサイトはここのようだ。4kまでのカスタムフォントを生成できる感じね。
U8g2 Custom Font Generator (CJK Support) for Arduino/ESP32 | Stonez56
https://stonez56.com/u8g2/

マイコンで日本語を表示させるのは、結構限界があるのね。
オリジナル投稿:
M5Stack OLED UNITを使ってみる -2-|kinneko|pixivFANBOX
https://kinneko.fanbox.cc/posts/10311575



