当前位置: 首页 > ds >正文

在Arduino U8g2库中显示中文的方法

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位图,直接渲染:

  1. 使用 LCD Assistant(在线工具)将汉字转换为XBM格式。
  2. 在代码中引用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.ttfmsyh.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项目中导入自定义字体

  1. 将生成的my_chinese_font.c复制到Arduino项目目录。
  2. 在代码中引用该字体:
#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工具支持任意字体和汉字,灵活需手动操作命令行
在线转换工具无需安装软件依赖网络,可能格式不兼容

参考:

  1. 如何利用Arduino来显示Unicode文本

  2. Arduino驱动LED128X64 - U8g2 自定义中文字库

  3. arduino如何在ssd1306上显示中文字符

  4. Arduino技巧使用u8g2函式庫建立自訂字庫,讓OLED顯示中文

http://www.xdnf.cn/news/2979.html

相关文章:

  • 「Mac畅玩AIGC与多模态06」开发篇02 - 开发第一个知识库问答应用
  • 电流探头的创新应用与霍尔效应原理
  • word文档插入公式后行距变大怎么办?
  • 大模型入门
  • 码蹄集——进制输出、求最大公约数、最小公倍数
  • 【时时三省】(C语言基础)循环结构程序设计习题2
  • 如何从大规模点集中筛选出距离不小于指定值的点
  • C语言-指针(一)
  • 【网络编程】协议和分层
  • 解决leensa无法使用的办法:平替教程
  • 编译原理:由浅入深从语法树到文法类型
  • 使用Python对接StockTV印度股票数据源的详细教程
  • MiniLLM:大型语言模型的知识蒸馏
  • InnoDB对LRU算法的优化
  • 哪些CAD看图软件适合初学者使用?
  • Jackson 使用方法详解
  • Starrocks导入数据时报错too many versions
  • 网络安全之红队LLM的大模型自动化越狱
  • RAG当知识库非常大导致大语言模型不准确,该如何处理
  • 通过langchain访问大模型并实现简单的查询
  • 操作系统——第四章(文件管理与文件的逻辑结构)
  • power bi获取局域网内共享文件
  • arm设备树基础知识
  • “专精特新”中小企业数字化转型呈现 4 大转型特征
  • 同步时钟与异步时钟
  • 1.24g 雨晨 19045.5796 Windows 10 企业版 x64 极速版
  • pymsql(SQL注入与防SQL注入)
  • Spring反射机制
  • Dijkstra算法的学习
  • cmake qt 项目编译