Arduino上U8g2库自定义中文库的经历

        上周呢,为了跟孩子一起研究一个创客项目,项目中用到了OLED屏。以我过去丰富的软件开发经验,觉得再简单不过了,不就连上屏,来个OLED.print("你好,世界!");就可以收工了。没想到,事与愿违,哪有这么简单。的确啦,直接用SH1106的库,然后用display.write("XX");就可以直接显示了,但是这只是英文和数字,中文可显示不出来。

        然后,我想,这也肯定不难,网上一定有显示中文的库。然后找了一轮,心里暗喜,我找到了U8G2这个强大的库,它可以直接显示各国语言。然后我简单地试了一下,的确可以显示中文了。可以收工了啦!不过收工前,感觉还是不太妥,还是想试一试之后要用到的中文字是不是都能显示出来,毕竟Arduino的空间有限,U8G2可不敢将整个常用中文库给装上去啦。结果如标题所示,这个库太小了,我要的字一大半都没有。当然了,U8g2也支持更大的中文库,大家可以在这里(Github🚀)查看。不过呢,Arduino Uno是无福消受的,毕竟内存实在是小得可怜。所以,只能逼着我走上自定义中文库的路。

        以下就是尝试的过程记录,请享用。但在享用之前,要告诉各位:

        ❕ 以下用法是直接使用宋体的,如果要想用别的字体,需要增加一步,可以参考:       Arduino驱动LED128X64 - U8g2 自定义中文字库_在求学的路上越走越远-CSDN博客_u8g2自定义字库我们在项目中大概率会遇到LED显示中文的需求,而通过汉字取模一个一个的定义中文字,不仅会增加程序编译后占用的存储空间,造成稀缺硬件资源的lang'f'dehttps://blog.csdn.net/yulusilian1/article/details/117388091?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2~default~OPENSEARCH~Rate-1.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~OPENSEARCH~Rate-1.pc_relevant_default&utm_relevant_index=2        ❕ 以下方法是新增一种font的方式,其实也可以直接修改一个现有的map文件,然后再走接下来的步骤,但我觉得并没有降低复杂度,所以没有采用。

        ❗ Arduino的内存空间实在是太小了,自定义库的确是能用,但我上传后就已经占用了93%左右的内存了,如果你还要做更多功能的话,请注意剩下的内存是不是够你用哦。

文章有点长,我自己看着都有点懵,但其实并不复杂:

💨Arduino环境安装U8g2库
💨Github中下载U8g2源码(要的是里面的工具)
💨将要用的中文转成unicode并存入map文件中
💨用bdfconv工具转成代码➡将代码写入Arduino环境里的U8g2库里
💤收工

🚩目录

第一步 在Arduino的IDE里下载U8g2库

第二步 下载U8g2源代码

第三步 制作.map文件

第四步 使用新的字体


第一步 在Arduino的IDE里下载U8g2库

请在菜单上找到“项目 -> 库管理...”,然后输入“u8g2”,在搜索结果里面找到U8g2,并安装它。你可以在示例中找到Hello world工程来测试,这就是不表述了。

第二步 下载U8g2源代码

请上这里(Github🚀)下载U8g2的源代码,因为我们要用到它里面的工具。

  得到u8g2-master.zip文件后,解压缩备用。

第三步 制作.map文件

1️⃣ 这时,你要想一想你将会在这次项目中用到的所有汉字,比如说,我这次做的是一个公交转乘的相关项目,所以用了

请乘坐在下车转到达海岸城桂庙新村梅林已站

2️⃣ 然后呢,找一个汉字转Unicode的工具,这次我用的是这个🛴

 3️⃣ 接下来,将右边这串字符拷贝出来,放到文本编辑器(比如“记事本”)里,将"\u"替换成",$",看起来是这样的。

\u8bf7\u4e58\u5750\u5728\u4e0b\u8f66\u8f6c\u5230\u8fbe\u6d77\u5cb8\u57ce\u6842\u5e99\u65b0\u6751\u6885\u6797\u5df2\u7ad9

转变成

$8bf7,$4e58,$5750,$5728,$4e0b,$8f66,$8f6c,$5230,$8fbe,$6d77,$5cb8,$57ce,$6842,$5e99,$65b0,$6751,$6885,$6797,$5df2,$7ad9

记得替换后,第一个字符是",",这个要去掉。

4️⃣ 找到你刚才下载的g8u2-master解压之后的目录,并找到tools\font\build\这个子目录。在这里面新建一个文件,你可以叫它任何名字。我用的是"xi_chinese_fonts.map"。用记事本将它打开,填入以下内容:

32-128,
$8bf7,$4e58,$5750,$5728,$4e0b,$8f66,$8f6c,$5230,$8fbe,$6d77,$5cb8,$57ce,$6842,$5e99,$65b0,$6751,$6885,$6797,$5df2,$7ad9

32-128表示ASCII字符范围。如果你实在不太理解是怎么做的,tools\font\build\里有很多map文件,你打开一个来看就懂了。

5️⃣ 接着呢,请用去到tools\font\bdfconv\目录下。

建立一个文件名为"conv.bat"的文件,并用记事本来编辑它。在它里面填入以下内容:

bdfconv.exe -v ../bdf/unifont.bdf -b 0 -f 1 -M ../build/chinese1.map -d ../bdf/7x13.bdf -n u8g2_font_xifont -o u8g2_font_xifont.c

最后面的u8g2_font_xifont是未来的字体名,而最后u8g2_font_xifont.c文件是将要生成的一个文件,一会咱们要打开它将内容移去别处。

保存conv.bat文件,然后双击运行它就好了。

6️⃣ 找到在tools\font\bdfconv\时的u8g2_fon_xifont.c文件,它看起来是这样的。

/*
  Fontname: -gnu-Unifont-Medium-R-Normal-Sans-16-160-75-75-c-80-iso10646-1
  Copyright: Copyright (C) 1998-2019 Roman Czyborra, Paul Hardy,  Qianqian Fang, Andrew Miller, Johnnie Weaver, David Corbett, et al.  License GPLv2+: GNU GPL version 2 or later <http://gnu.org/licenses/gpl.html>  with the GNU Font Embedding Exception.
  Glyphs: 119/57086
  BBX Build Mode: 0
*/
const uint8_t u8g2_font_xifont[2246] U8G2_FONT_SECTION("u8g2_font_xifont") = 
  "w\0\3\2\5\5\4\5\6\20\20\0\376\12\376\13\377\1\233\3\64\5\0 \6\0\240G\1!\10A"
  "\61DqH\4\42\10\205(F\221\271\5#\17F%D\325\323\60$Q\313\60D=\1$\22G%"
  "D\27\16J\24I\341<FRe\20\63\0%\24G%D\243II)\211\224\64N\23)\211\222\222"
  "\246\0&\22G%D\265\225\262J(&\221\226\210I&M\1'\7\201\60F\61\4(\14\203\355C"
  "\225DI\324[\224\5)\15\203\351C\221EY\324K\224D\0*\15\347dDW\252\264mIS-"
  "\3+\14\347dD\27\327\206!\213k\0,\11\202\254C\241$\12\0-\7$(E\61\4.\7B"
  ",D\61\4/\14F%D[\254\206iXM\1\60\22F%D\245EI\250M\211\22mb\22e"
  "\22\0\61\13E)D\225II\330\247A\62\17F%D\63$\241\230fZXM\207\1\63\20F%"
  "D\63$\241\230Fs*\212\311\220\0\64\20F%D\31jIT\311\222,\31\306\264\2\65\17F%"
  "DqH\253\203\234\246b\62$\0\66\17F%D\65\205i:(\241c\62$\0\67\13F%Dq"
  "-\246\305\264\11\70\20F%D\63$\241\61\31\222\320\61\31\22\0\71\16F%D\63$\241\61\31\324"
  "\306h\2:\11\342lD\61\304C\0;\12\42\355C\61\304J\242\0<\11%)D\231u\355\0="
  "\11\246\244Dq'\16\3>\11%%D\221v\353\10\77\17F%D\63$\241\230\206\325\34L#\0"
  "@\22F%D\65eR\242$K\244DJ$-\361\20A\16F%D\245E-\241\70\14\242c\0"
  "B\16F%D\61(\241qXB\307a\1C\16F%D\63$\241\265\243\230\14\11\0D\16F%"
  "D\61DY\22\372-\31\42\0E\15F%DqH\253\203\222\266\16\3F\14F%DqH\253\203"
  "\222v\5G\16F%D\63$\241\265\64\204\66e\11H\13F%D\21:\16\203\350\61I\13E)"
  "D\61Ha\77\15\2J\16G%D\65\210qOY\224e\33\0K\21F%D\21jIT\311D"
  "\61\311\242Z\22\6L\11F%D\221\366\327aM\15F%D\21\212\323\20-\36\35\3N\20F%"
  "D\21n\233\22)\221\224H\211v\14O\14F%D\63$\241\77&C\2P\15F%D\61(\241"
  "qX\322\256\0Q\27g\345C\63Da\22&a\22&a\22&\211\222H\322\220\3\2R\20F%"
  "D\61(\241qX\242Z\222%\241\30S\15F%D\63$\241\331QL\206\4T\12G%Dq\310"
  "\342\376\6U\13F%D\21\372\307dH\0V\21G%D\221Z\223,\312\242\254\22&i\234\1W"
  "\15F%D\21zq\231\206h\24\3X\17F%D\21\212I\324&jQK(\6Y\16G%D"
  "\221\252I\26e\225\64\356\6Z\13F%Dq-\366\232\16\3[\12\203\361C\61D\375\323\0\134\14"
  "F%D\221\306\325\70\215\253\1]\12\203\345C\61\365OC\0^\11fdF\245EI\30_\7'"
  "\344Cq\10`\7c\250F\221\25a\16\6%D\63$a\232\14\243MY\2b\16f%D\221\266"
  ",\232\350\270)\13\0c\15\6%D\63$\241\332\61\31\22\0d\14f%D\333\262h\243\67e\11"
  "e\17\6%D\63$\241\70\14j\61\31\22\0f\14e%D'\205\245A\12{\2g\23f\245C"
  "\233,Z\222%Y\264\245C\22\212\311\220\0h\14f%D\221\266,\232\350c\0i\13e)D\25"
  "\346\210\330\247Aj\14\245\245CYG\304>J\221\4k\21f%D\221\266%Q%\23\223,\252%"
  "a\0l\12e)D#\366O\203\0m\22\7%D\261(Q$ER$ER$ER\1n\13"
  "\6%D\221,\232\350c\0o\14\6%D\63$\241\217\311\220\0p\16F\245C\221,\232\350\270)"
  "K\232\2q\14F\245C\263h\243\67eI\13r\13\6%D\221,\232\250v\5s\15\6%D\63"
  "$\241\354\230\14\11\0t\13E%D\25\226\6)\354*u\12\6%D\21\372MY\2v\14\6%"
  "D\21\32\223\250\67Q\2w\21\7%D\221J\221\24I\221\24I\221T\261\0x\17\6%D\21\212"
  "I\224\211Z\224\204b\0y\16F\245C\21zL\42KZ\31\22\0z\12\6%Dq\15{\35\6"
  "{\16\244\251C\245da\26\25kQ\26\12|\7\301\261C\361A}\17\244\251C!fQ\26\226j"
  "a\226H\0~\12g$F\243I\221\246\0\177#\20\242\203\221\364;I\347\244\223\16I\66%a\32"
  "%C\222MI\230NC\62\354\234tN:)\351\7\200$\20\242\203\221\364;I\347\244\223\66i\231"
  "\222(\211\242C\22\15a\224D\305(YtN:'\235\224\364\3\0\0\0\4\377\377N\13\42\357\241"
  "\203\361sN\310\11\71!'D\71\230\345X\230Ci\216\244\71\222\23rBN\310\11\71\2NX*"
  "\17\242\203\217\14\342\260\23rdx\310\221\34\214Z\6)\232\243Z\64\325\246d\32\322\244\16\65k\231"
  "\244\246:\220\23r\0R\60,\16\242\203\17\17\207\260\216dqT+%i\24\15\207$\12\263$\12"
  "\323(L\243d\30\242b\32\205\71\22\16\342\60'u,\1W((\17\242\203\235\23r\70\207\206\217"
  "\71!\314\221\64\7\324\70I\206K\224\346H\232#i\216\244\71\222\346\310\360\226\203\0WP$\357\341"
  "\203\17\344XsV\316\312Y\65\211*a\224DmI-\211sB\16\15\7\35\312\11\71!\7~W"
  "\316\61\17\242\203\225\3I\230\3Q\226\3q\64\34\242b\70\214q\24FY\64$Q\26U\242,\252"
  "\24\243Jq\210j\223\22U\242\226bM\13\323\0[f%\17\242\203\225\245\265\60\315\352p:<("
  "\71\252\243\341\60\350p\216\312\303w '\344\204\34Mr\70G\0\134\17%\17\242\203\17\344\204\234\220"
  "\23rB\216\65ga\232\245Y\230fa\234\244\261\134\7rB\216&\71\234#\0\134\270%\17\242\203"
  "\17\344P\330\343p\320\251\303[NH\206c\232#i\216\14\17Q\232\3q\16\304u '\304\0]"
  "\362 \314\351\203\361\220\203\71\230\203Q\216D\71\22\15\207(\7s\60\7sL\307t,\31\16\2^"
  "\231*\17\242\203\17\344\224\34\31\36\242\234\220\346H\232#\311pL\262b\222\25\223\254\230\14\307$k"
  "\312\232\262R\66\234s \2e\260/\17\242\203\227Sr$\32\206d\310\301\34\310\242\34\251\245\303\240"
  "\14c)\16\243l\30\222(\16\243\60)\325\242JTkL\262j\26F\0gQ,\17\242\203\227\3"
  "q\16\304\71\20\347@\66,\303\240\345@\252\3\351\34&maR\252Ea\24\347@\234\3q\16\304"
  "i\22\27\1hB+\17\242\203\27\347@\234\3\331\60\204q\70\214\71\20\307\322p\332\301\244\230&\305"
  "R\66\14a\234\3q\16\304\71\20\15\267\34\4mw.\17\242\203\17\344P\230c\331\60\204Q\216\204"
  "\311\260\245a\26U\242\70\252\244\311p\310\212\321\26\25\263J\230\15\203\226Ca\234\344p\10z\331."
  "\17\242\203\27\347H\232#i:l\71aP\303\64\13\323,\214\243d\30\262$J\263$J\323!M"
  "\206,\215\322:\62\14\71\222&\0\213\367.\17\242\203\17\305\71\220\3\321p\213sp\30r\60\235\206"
  "C\224\23\262a\10\263\64\314\206!\314\322\60I\206!\224\322\60\253\344H\230\1\217f$\17\242\203\235"
  "\23rB\16\15\17q\16G\71V\207\302\34\32\16:\224\23r\340w '\344\204\234\220\3\217l."
  "\17\242\203\225\3q\16\304\71\20\16\313\60D\71\222&i)\32\276\345H\230C\331\60\204;\220\14a"
  "VI\223\270\16\344@\234\3\31\0\217\276*\357\341\203\17\345@\234#i\216\244\71\66\34r(\35\322"
  "\34\11\223\34\10\243\70\13\323(\16\223\34\10s\70\311\301l\70\4\236\222\70\17\242\203Y\213\206!\311"
  "\242\244\62\14J[i\30\222,JZ\6)\351\26\15C\222EIm\220\222Z)\31\242,J*\303"
  "\240\264c\311\230dI\42eI\16\244\1\236\237\67\17\242\203\31\207\303\220\64%\305-)\15C\62\14"
  "Y\230\64mI/\312\60HaR\12\243\244\264,\311\220\224*\245D\211\222.C\222l\245$Q\302"
  "$N\23\0\0";

7️⃣ 找到u8g2库的安装目标。

在Arduion的IDE的菜单里打开“文件 -> 首选项”

用文件浏览器打开这个文件夹,并进入它的子目录libraries\U8g2\src\clib\,我的目录就是:C:\Users\Eric.Li\Documents\Arduino\libraries\U8g2\src\clib\然后找到文件u8g2_fonts.c(大小为29M)。最好用VS code或者别的文本编辑工具打开它,毕竟这么大的玩意儿,记事本玩不转。

8️⃣ 接下来中文的代码块放进文件里。

搜索“chinese”,找到随便一个中文字体块。并将刚才你生成的那个u8g2_fon_xifont.c的内容拷贝出来,塞进我红色箭头处就行。

 9️⃣ 然后继续在libraries\U8g2\src\clib\里找到u8g2.h文件。找到它,并加入你的字体名。

还是搜索"chinese" ,然后将这一行新的声明写进去就可以了。

第四步 使用新的字体

最后,在代码中使用新字体就可以了。

#include <U8g2lib.h> 

U8G2_SSD1306_128X64_NONAME_1_SW_I2C u8g2(U8G2_R2 /*180°反转*/, SCL, SDA, U8X8_PIN_NONE);   // 初始化SSD1306引脚

void setup() 
{
  u8g2.begin();
  u8g2.enableUTF8Print(); //UTF-8支持
  u8g2.setFont(u8g2_font_xifont); //设置中文字体,这里用的就是咱们的新字体
}

void loop() 
{
  u8g2.firstPage();
  do {
    u8g2.setCursor(0, 16); //设置要显示的字符下边界
    u8g2.print("请乘坐240到下梅林");  //输出中文
  } while ( u8g2.nextPage() );
  delay(1000);
}

        好吧,上面是我的分享。而我的故事呢?因为我还是想用Uno来做这个项目,而且这个项目后对还有大量代码要敲进来,7%的内存可不够我用。所以折腾了半天,还是决定用别的工具来将几个中文转成数组的方式来显示了,这样节省了大量空间。但实在是太烦锁了。。。

整个尝试过程主要参考了以下两位的分享,感谢!比心🤍

Arduino驱动LED128X64 - U8g2 自定义中文字库_在求学的路上越走越远-CSDN博客_u8g2自定义字库我们在项目中大概率会遇到LED显示中文的需求,而通过汉字取模一个一个的定义中文字,不仅会增加程序编译后占用的存储空间,造成稀缺硬件资源的lang'f'dehttps://blog.csdn.net/yulusilian1/article/details/117388091?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2~default~OPENSEARCH~Rate-1.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~OPENSEARCH~Rate-1.pc_relevant_default&utm_relevant_index=2

[教程] Arduino Uno实现oled显示任意中文 - Easy博客[教程] Arduino Uno实现oled显示任意中文一、初级实现1、实验准备平台:Arduino Grove 开发板(基于uno)开发系统: Windows 10Oled显示器: SSD 1...https://blog.easygod.club/index.php/archives/36/

  • 10
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

长风Eric(fengcan)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值