3468| 4
|
如何利用Arduino来显示Unicode文本 |
本帖最后由 RRoy 于 2022-5-18 16:14 编辑 本周带来的项目是如何利用Arduino来显示Unicode文本。(视频演示在文末) 开发板 任意一块带有Arduino_GFX支持的Arduino开发板。 第1步:统一码和UTF-8
UTF-8是为了向后兼容ASCII而设计的:Unicode的前128个字符,与ASCII一一对应,使用与ASCII相同的二进制值的单个字节进行编码。 第3步:为什么需要UTF-8? 有些项目其实只需使用ASCII字符就可以很好地呈现,而不需要Unicode。 而有些项目则需要Unicode来支持多国语言,例如:
还有更多需要文本显示的项目。 第3步:扩展ASCII Arduino_GFX继承了Adafruit_GFX,自Adafruit_GFX 1.0以来默认使用经典的固定空间位图字体。这种字体叫glcdfont,大小为5×7像素,包含128个ASCII字符和128个扩展ASCII字符。我们可以在AsciiTable的例子中查看所有的字符。 在启用UTF-8编码之前,Arduino_GFX可以通过函数切换UTF-8编码。 gfx->setUTF8Print(true); 启用UTF-8编码后,不能使用扩展的ASCII字符。但我们可以使用相应的UTF-8编码的字符来代替。 例如,用扩展ASCII打印摄氏度符号是: gfx->print("\xF8""C"); 由于Arduino IDE可以直接使用UTF-8编码的字符串,所以用UTF-8打印相同的符号是: gfx->print("°C"); 或者: gfx->print("℃"); 取决于所选择的UTF-8字体文件中包含的字符字形。 第4步:字体数据大小 如前面所说的,Unicode包含超过144k个字符,要在Arduino程序中全部打包是不容易的。 Unifont是包含最常见的UTF-8字符的字体类型之一。在最新的unifont_jp-14.0.02版本中,它包含57389个字形,BCF格式的字体文件大小为9.4MB。 常见的AVR系列开发板只有32KB的闪存存储程序;ESP8266有4MB的闪存,但仍把程序限制在1MB左右;RTL8720DN可以存储2MB的程序;ESP32 Huge APP模式可以存储3MB的程序;Raspberry Pi Pico可以存储2MB的程序(有些变化可以存储16MB)。 第5步:U8g2字体 Arduino_GFX采用U8g2字体格式作为UTF-8解决方案。U8g2字体支持UTF-8编码,同时U8g2提供了一些工具来将字体文件转换为Arduino源文件。 bdfconv是U8g2提供的工具之一,它可以将unifont bdf字体文件转换为Arduino源文件。 输出的二进制文件是压缩格式的,而且bdfconv可以选择编码范围来输出,这两个特性都可以减少数据的大小。 第6步:选择字体子集 由于我们不能简单地把整套Unifont字体挤进有限的程序空间,所以我们需要选择一个字体子集,用于特定的项目。 U8g2已经为各种语言准备了很多unifont子集,例如:
即使这样,有些语言依旧无法在Arduino中容纳所有的字体,所以它有不同的尺寸的子集来满足不同的要求,比如,中文字体有3个子集。
你可以参考U8g2 Github Wiki以了解更多细节: https://github.com/olikraus/u8g2/wiki/fntgrpunifont 第7步:Arduino_GFX准备的字体文件 正如在前面的步骤中提到的,一些MCU可以存储程序大小到1-3MB。 所以,我们可以量身定做一个字体文件,尽可能多地显示字形。下面是Arduino_GFX中准备的一些额外的字体文件。
BDF字体位图使用unifont_jp-14.0.02,转换工具是U8g2提供的bdfconv。 第8步:自定义字体 U8g2_font_unifont_h_utf8This font included all glyphs in unifont_jp-14.0.02. Number of Glyph: 57,389 Data size: 2,250,360 bytes Converting script: bdfconv -v -f 1 -b 1 -m "0-1114111" unifont_jp-14.0.02.bdf -o u8g2_font_unifont_h_utf8.h -n u8g2_font_unifont_h_utf8 第9步:自定义字体 U8g2_font_unifont_t_chinese 这个字体包括了所有汉字范围的字形。
转换脚本: bdfconv -v -f 1 -m "32-127,11904-12351,19968-40959,63744-64255,65280-65376" unifont_jp-14.0.02.bdf -o u8g2_font_unifont_t_chinese.h -n u8g2_font_unifont_t_chinese第10步:自定义字体 U8g2_font_unifont_t_chinese4 由于ESP8266有1MB的程序大小限制,所有的汉字还是不能装进去。这就需要另一个子集,只缩小到常用的字符。 常用字的列表来自于字集中的常用國字標準字體表和GlyphWiki的字表:中国常用字。 字形的数量:7199 数据大小: 298,564 Bytes 转换的脚本: bdfconv -v -f 1 -M common.txt unifont_jp-14.0.02.bdf -o u8g2_font_unifont_t_chinese4.h -n u8g2_font_unifont_t_chinese4第11步:自定义字体 U8g2_font_unifont_t_cjk 这个字体包含所有的中文、日文和韩文字符。这三种语言共享92,865个中日韩统一表意文字,所以可以用一个字体文件来显示三种不同的语言,非常方便。 字形数量: 41364 数据大小: 1,704,862 Bytes 转换脚本: bdfconv -v -f 1 -m "32-127,4352-4607,11904-12255,12288-19903,19968-40943,43360-43391,44032-55203,55216-55295,63744-64255,65072-65103,65280-65519" unifont_jp-14.0.02.bdf -o u8g2_font_unifont_t_cjk.h -n u8g2_font_unifont_t_cjk 第12步:软件准备 Arduino IDE 下载并安装Arduino IDE,如果你还没有的话: https://www.arduino.cc/en/main/software Arduino_GFX库 选择 "工具 "菜单->"管理库... ",搜索 "GFX for various displays "然后点击 "install "按钮安装。 第13步:Unicode实例 Arduino_GFX在U8g2Font子文件夹中提供了各种Unicode例子。 在Arduino IDE中,选择 "文件 "菜单->"示例"->"GFX Library for Arduino"->"U8g2Font"。5个例子中的4个是Unicode例子。
第14步:开始尝试吧! 现在,我们的Arduino项目就可以突破ASCII文本的限制了!有项目可以利用起来了! ▲ 视频演示 原文链接:https://www.instructables.com/Display-Unicode-in-Arduino/ 原文作者:陳亮 译文首发:DF创客社区 转载请注明原作者及出处 |
© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed