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顯示中文