U8g2庫支持中文顯示,但需要手動添加中文字體或使用內置的有限中文字符。以下是具體實現方法:
方法一 使用U8g2內置的中文字體(不推薦)
缺點:內置字體支持的漢字較少,可能無法顯示所有需要的字符。不推薦。
U8g2庫內置了一些中文字體,但覆蓋的漢字有限(通常為常用符號或少量漢字)。例如:
#include <U8g2lib.h>
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);void setup() {u8g2.begin();
}void loop() {u8g2.clearBuffer();u8g2.setFont(u8g2_font_unifont_t_chinese2); // 使用內置中文字體(部分漢字)u8g2.drawStr(0, 20, "你好"); // 顯示中文u8g2.sendBuffer();delay(1000);
}
方法二 使用XBM格式顯示中文(不推薦)
缺點:位圖方式,占用資源,僅適合固定內容,無法動態修改文本,不推薦
如果只需要顯示少量固定漢字,可以將其轉換為 XBM位圖,直接渲染:
- 使用 LCD Assistant(在線工具)將漢字轉換為XBM格式。
- 在代碼中引用XBM數據:
#include <U8g2lib.h>
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);// 定義中文字符的XBM位圖(示例:"你好")
static const unsigned char hello_bits[] U8X8_PROGMEM = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ... // 具體數據由工具生成
};void setup() {u8g2.begin();
}void loop() {u8g2.clearBuffer();u8g2.drawXBM(0, 20, 16, 16, hello_bits); // 顯示XBM位圖u8g2.sendBuffer();delay(1000);
}
方法三 自定義中文字體(推薦)
如果需要顯示任意中文,需使用 U8g2字體工具 生成自定義字體文件。U8g2庫的官方字體轉換工具是 ?bdfconv,它可以將標準字體文件(如TTF、BDF)轉換為U8g2兼容的C語言字體文件。
U8g2字體工具(bdfconv)獲取方式?:
步驟1:下載并安裝U8g2字體工具(bdfconv)
GitHub倉庫(源碼+工具)
- U8g2官方字體工具網站: https://github.com/olikraus/u8g2/wiki/fntgrp
- bdfconv工具:https://github.com/olikraus/u8g2/tree/master/tools/font/bdfconv
(包含Windows/Linux/macOS的預編譯版本)
Windows用戶直接下載
- 預編譯的Windows版
bdfconv.exe
:
點擊下載 bdfconv.exe
步驟2:準備中文字體文件
- 從系統字體目錄(如Windows的
C:\Windows\Fonts
)復制一個中文字體(如simsun.ttf
、msyh.ttf
)。 - 或使用開源字體(如 ?思源黑體、文泉驛微米黑)。
步驟3:生成U8g2兼容的字體文件
在命令行運行:
./bdfconv -v -f 1 -m "32-127, 19968-40959" simsun.ttf -o my_chinese_font.c
參數說明:
-f 1
:抗鋸齒級別(1=無抗鋸齒,2=有抗鋸齒)。-m "19968-40959"
:指定Unicode漢字范圍(19968-40959覆蓋常用漢字)。simsun.ttf
:輸入字體文件。-o my_chinese_font.c
:輸出C語言字體文件。
步驟4:在Arduino項目中導入自定義字體
- 將生成的
my_chinese_font.c
復制到Arduino項目目錄。 - 在代碼中引用該字體:
#include <U8g2lib.h>
#include "my_chinese_font.c" // 導入自定義字體U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);void setup() {u8g2.begin();
}void loop() {u8g2.clearBuffer();u8g2.setFont(my_chinese_font); // 使用自定義字體u8g2.drawStr(0, 20, "你好世界"); // 顯示中文u8g2.sendBuffer();delay(1000);
}
常見問題
- Q1:提示“找不到bdfconv”??
確保將 bdfconv.exe 放在系統路徑(如 C:\Windows)或當前目錄。
?- Q2:生成的字體文件過大?
縮小字符范圍(如 -m “19968-20000” 僅轉換少量漢字)。
使用 -b 0 禁用非必要字符:
bdfconv -b 0 -m "19968-20000" simsun.ttf -o small_font.c
- ?Q3:中文顯示為亂碼?
確保字體文件包含目標漢字(檢查Unicode范圍)。
在代碼中使用 ?UTF-8編碼字符串?(Arduino IDE默認支持)。
Q1:中文顯示亂碼
- 確保字體文件包含所需漢字的Unicode編碼。
- 檢查
drawStr
是否使用UTF-8編碼字符串。
Q2:字體太大,占用過多Flash
- 減少字體范圍(如
-m "19968-20000"
僅生成少量漢字)。 - 使用
-b 0
選項禁用非必要字符。
Q3:顯示速度慢
- 使用
U8G2_FONT_MODE_TRANSPARENT
減少渲染時間:u8g2.setFontMode(1); // 透明模式
總結
方法 | 優點 | 缺點 |
---|---|---|
內置中文字體 | 簡單,無需額外文件 | 支持的漢字有限 |
自定義字體 | 支持任意漢字,靈活 | 需手動生成字體文件 |
XBM位圖 | 適合固定內容,渲染快 | 無法動態修改,占用空間較大 |
推薦:
- 少量中文 → 內置字體
- 大量中文,需要完整中文支持 → 使用bdfconv轉換TTF字體
- 固定標語 → XBM位圖
通過以上方法,可以在Arduino OLED項目中完美顯示中文!
補充:無需bdfconv工具的替代方案
方法三還有一個替代方案(無需bdfconv),在線字體轉換工具(如 LVGL Font Converter),生成兼容U8g2的字體。
方法 | 優點 | 缺點 |
---|---|---|
bdfconv工具 | 支持任意字體和漢字,靈活 | 需手動操作命令行 |
在線轉換工具 | 無需安裝軟件 | 依賴網絡,可能格式不兼容 |
參考:
-
如何利用Arduino來顯示Unicode文本
-
Arduino驅動LED128X64 - U8g2 自定義中文字庫
-
arduino如何在ssd1306上顯示中文字符
-
Arduino技巧使用u8g2函式庫建立自訂字庫,讓OLED顯示中文