上周呢,为了跟孩子一起研究一个创客项目,项目中用到了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”,在搜索结果里面找到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%的内存可不够我用。所以折腾了半天,还是决定用别的工具来将几个中文转成数组的方式来显示了,这样节省了大量空间。但实在是太烦锁了。。。
整个尝试过程主要参考了以下两位的分享,感谢!比心🤍