在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.mzph.cn/news/903261.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

自动驾驶分级

一、美国 SAE J3016 Taxonomy and Definitions for Terms Related to Driving Automation Systems for On-Road Motor Vehicles(2021) 1、驾驶自动化级别&#xff08;Levels of Driving Automation&#xff09; 共分为 6 个级别&#xff0c;从 无自动化&#xff08;0&#…

工业园区工厂企业数字IP广播应急呼叫对讲系统:数字IP广播极大提升工厂企业管理效率与应急响应效能

工业园区工厂企业数字IP广播应急呼叫对讲系统:数字IP广播极大提升工厂企业管理效率与应急响应效能 北京海特伟业科技有限公司任洪卓发布于2025年4月28日 在数字化转型浪潮下&#xff0c;IP应急广播呼叫对讲广播系统凭借其网络化、智能化、融合化、多元化等优势&#xff0c;已…

DNS主从同步及解析

DNS 域名解析原理 域名系统的层次结构 &#xff1a;DNS 采用分层树状结构&#xff0c;顶级域名&#xff08;如.com、.org、.net 等&#xff09;位于顶层&#xff0c;下面是二级域名、三级域名等。例如&#xff0c;在域名 “www.example.com” 中&#xff0c;“com” 是顶级域名…

再看 BBR 到 BBRv3 的公平性改进

从看一篇论文开始&#xff1a;Performance Evaluation of TCP BBRv3 in Networks with Multiple Round Trip Times&#xff0c;结论比较悲观&#xff1a; 虽然 BBRv2/3 试图解决 BBRv1 的公平性问题&#xff0c;但结果依旧不够理想&#xff0c;BBR 的迭代依旧任重而道远。 BB…

locust压力测试

安装 pip install locust验证是否安装成功 locust -V使用 网上的教程基本上是前几年的&#xff0c;locust已经更新了好几个版本&#xff0c;有点过时了&#xff0c;在此做一个总结 启动 默认是使用浏览器进行设置的 # 使用浏览器 locust -f .\main.py其他参数 Usage: locust […

优先队列和单调队列(双端队列实现的)

这里写自定义目录标题 一、优先队列与单调队列二、优先队列2.1 概念2.2 增删查 判空2.3 示例代码 三、双端队列四、单调队列4.1 单调递增队列4.2 单调递减队列 一、优先队列与单调队列 二、优先队列 2.1 概念 一种特殊的队列&#xff0c;它与普通队列的主要区别在于元素的出…

如何在idea中写spark程序

在 IntelliJ IDEA 中编写 Spark 程序是一个高效且便捷的方式&#xff0c;以下是一个详细的步骤指南&#xff0c;帮助你在 IntelliJ IDEA 中创建和运行 Spark 程序。 一、环境准备 安装 Java&#xff1a; 确保已经安装了 JDK 1.8 或更高版本。可以通过以下命令检查&#xff1a;…

BERT BERT

BERT ***** 2020年3月11日更新&#xff1a;更小的BERT模型 ***** 这是在《深阅读的学生学得更好&#xff1a;预训练紧凑模型的重要性》&#xff08;arXiv:1908.08962&#xff09;中提到的24种较小规模的英文未分词BERT模型的发布。 我们已经证明&#xff0c;标准的BERT架构和…

SpringBoot启动警告:OpenJDK 64-Bit Server VM warning

问题描述 以Debug模式启动Spring boot项目之后&#xff0c;日志打印&#xff1a;OpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended&#xff0c; 警告信息 解决方案&#xff1a;配置VM opt…

“该虚拟机似乎正在使用中“

当某一天打开虚拟机突然弹出"该虚拟机似乎正在使用中"。 遇到这种问题的解决方法很简单&#xff0c;出现这种问题是因为错误关闭虚拟机导致&#xff0c;当我们点击获取所有权时发现不能解决问题。这里分享一种简单的解决方法。 打开虚拟机的文件目录 找到lck文件夹下…

【CSS】层叠,优先级与继承(三):超详细继承知识点

目录 继承一、什么是继承&#xff1f;2.1 祖先元素2.2 默认继承/默认不继承 二、可继承属性2.1 字体相关属性2.2 文本相关属性2.3 列表相关属性 三、不可继承属性3.1 盒模型相关属性3.2 背景相关属性 四、属性初始值4.1 根元素4.2 属性的初始值4.3 得出结论 五、强制继承5.1 in…

Android LiveData关键代码

1、observer方法 public void observe(NonNull LifecycleOwner owner, NonNull Observer<? super T> observer) {assertMainThread("observe");if (owner.getLifecycle().getCurrentState() DESTROYED) {// ignorereturn;}LifecycleBoundObserver wrapper …

Docker-高级使用

前言 书接上文Docker-初级安装及使用_用docker安装doccano-CSDN博客&#xff0c;我们讲解了Docker的基本操作&#xff0c;下面我们讲解的是高级使用&#xff0c;请大家做好准备&#xff01; 大家如果是从初级安装使用过来的话&#xff0c;建议把之前镜像和搭载的容器数据卷里面…

Spring Boot常用注解详解:实例与核心概念

Spring Boot常用注解详解&#xff1a;实例与核心概念 前言 Spring Boot作为Java领域最受欢迎的快速开发框架&#xff0c;其核心特性之一是通过注解&#xff08;Annotation&#xff09;简化配置&#xff0c;提高开发效率。注解驱动开发模式让开发者告别繁琐的XML配置&#xff…

TRO再添新案 TME再拿下一热门IP,涉及Paddington多个商标

4月2日和4月8日&#xff0c;TME律所代理Paddington & Company Ltd.对热门IP Paddington Bear帕丁顿熊的多类商标发起维权&#xff0c;覆盖文具、家居用品、毛绒玩具、纺织用品、游戏、电影、咖啡、填充玩具等领域。跨境卖家需立即排查店铺内的相关产品&#xff01; 案件基…

经验分享-上传ios的ipa文件

.ipa格式的二进制文件&#xff0c;是打包后生成的文件&#xff0c;无论我们是放上去testflight测试还是正式上传到app store&#xff0c;都需要先上传到苹果开发者中心的app store connect上的构建版本上。 在app store connect上&#xff0c;上传构建版本的功能&#xff0c;它…

docker(3) -- 图形界面

1. 前言 在wsl(8) – 图形界面文章中介绍了wsl2默认是支持图形界面的&#xff0c;现在我们尝试下在docker中运行gui程序试试看。 2. x11-apps 启动一个docker&#xff0c;安装一些gui小程序&#xff0c;然后运行&#xff0c;发现会失败。ubuntu_base详见文章wsl(6) – 安装d…

Docker容器跑定时任务脚本

最近搞了一个Docker容器跑脚本&#xff0c;想设置一个定时任务&#xff0c;每天8点运行一次&#xff0c;结果死活不成功。排查了一天&#xff0c;有一点当局者迷了&#xff0c;明明时间是对的&#xff0c;明明时区是对的&#xff0c;定时任务也是启动的&#xff0c;它就是不执行…

【Linux】什么是完全限定域名

FQDN 是 “完全限定域名” (Fully Qualified Domain Name) 的缩写。 FQDN 是一个互联网上特定计算机或主机的完整且唯一的域名。它详细说明了该主机在域名系统 (DNS) 层级结构中的确切位置。 一个 FQDN 通常由以下几个部分组成&#xff0c;从左到右依次是&#xff1a; 主机名…

小结:BFD

*BFD&#xff08;双向转发检测&#xff0c;Bidirectional Forwarding Detection&#xff09;是一种快速、轻量级的故障检测机制&#xff0c;用于检测网络中两点之间的连通性。它广泛应用于各种场景 1. 检测 IP 链路 应用场景&#xff1a; BFD 用于检测两台设备之间的 IP 层连…