U8g2 驱动oled自定义中文字库

原文:Arduino驱动LED128X64 - U8g2
参考:

  1. Arduino通过u8g2库驱动OLED
  2. 适合 u8g2 的中文字体,采用文泉驿点阵宋体作为源本,提供 12x12、13x13、14x14、15x15 和 16x16 点阵字库。
    本文所需工具下载

在项目中用LED显示中文,而通过系统自带的中文字库,程序编译后占用的存储空间大,不能适应Arduino UNO。

本文将介绍如何使用U8g2自带的工具,将项目中常用的汉字定义成自己的汉字库,编码后直接使用u8g2.print(String)方法来显示汉字。

在这里感谢其他网友的分享!本文参考了其他网友的内容,但是他们大都是替换到u8g2中现有的字体类型,这会破坏掉u8g2库的完整性。本文将介绍如何定义自己的u8g2Font类型,而不是替换现有的。

1. 准备工作

工欲善其事必先利其器,因此要制作自己的中文字库和字体,需要先做好准备工作,这样才能事半功倍。下载的文件放到一个路径中没有中文的文件夹中,我是直接放到了D盘。

1.1 U8g2-master库

您可以去GitHub上下载,点击这里下载。此库是用来制作自己的中文字库和字体,不同于驱动oled屏幕的库U8g2_Arduino

下载后,将u8g2-master.zip文件,将其解压缩。

1.2 字体库

windows系统一般在C:\Windows\Fonts目录内,找到您想要制作的字体,例如我们选择“新宋体”,拷贝到其他文件夹内备用,字体文件为simsun.ttc

1.3 GUITool

这个工具是用来制作.bdf文件的。

2 开始制作

2.1 制作.map文件

我们假定项目的需求是实现“空气质量数据的展示”,那么我们用到的汉字可能是这些:

温度、湿度、甲醛、日期、星期一、二、三、四、五、六日,

我们将这些文字整理后可得出字符串:温度年月日期星期一二三四五六日十时辰子丑寅卯辰巳午未申酉戌亥经脉络胆肝肺大肠胃脾心小肠膀胱肾心包焦:流注中医养生天人合阴阳手足太少明厥气血注于,已未酝各定位。℃、

找一个汉字转Unicode的工具,将汉字转换成Unicode。您可以点击这里使用在线工具进行转换。

在这里插入图片描述

将您准备好的字符串复制到 左侧 Unicode编码 文本框内,点击图中红框按钮中文 转 Unicode您就会得到Unicode字符串。

\u6e29\u5ea6\u5e74\u6708\u65e5\u671f\u661f\u671f\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u65e5\u5341\u65f6\u8fb0\u5b50\u4e11\u5bc5\u536f\u8fb0\u5df3\u5348\u672a\u7533\u9149\u620c\u4ea5\u7ecf\u8109\u7edc\u80c6\u809d\u80ba\u5927\u80a0\u80c3\u813e\u5fc3\u5c0f\u80a0\u8180\u80f1\u80be\u5fc3\u5305\u7126\uff1a\u6d41\u6ce8\u4e2d\u533b\u517b\u751f\u5929\u4eba\u5408\u9634\u9633\u624b\u8db3\u592a\u5c11\u660e\u53a5\u6c14\u8840\u6ce8\u4e8e\uff0c\u5df2\u672a\u915d\u5404\u5b9a\u4f4d\u3002\u2103\u3001

将字符串复制到记事本中,并将\u替换成,$,整理后您将得到如下字符串:

$6e29,$5ea6,$5e74,$6708,$65e5,$671f,$661f,$671f,$4e00,$4e8c,$4e09,$56db,$4e94,$516d,$65e5,$5341,$65f6,$8fb0,$5b50,$4e11,$5bc5,$536f,$8fb0,$5df3,$5348,$672a,$7533,$9149,$620c,$4ea5,$7ecf,$8109,$80c6,$809d,$80ba,$5927,$80a0,$80c3,$813e,$5fc3,$5c0f,$80a0,$8180,$80f1,$80be,$5fc3,$5305,$7126,$ff1a,$2103,$3001

到您解压好的u8g2-master.zip目录内的build文件夹,目录为:\tools\font\build\

新建一个.map文件,文件名称您可以按照喜好随意命名,例如我们命名为health_lamp_font.map。用记事本工具打开,在里面输入32-128,,并将上一步您准备好的字符串粘贴进去。您会得到如下内容:

32-128,
$6e29,$5ea6,$5e74,$6708,$65e5,$671f,$661f,$671f,$4e00,$4e8c,$4e09,$56db,$4e94,$516d,$65e5,$5341,$65f6,$8fb0,$5b50,$4e11,$5bc5,$536f,$8fb0,$5df3,$5348,$672a,$7533,$9149,$620c,$4ea5,$7ecf,$8109,$80c6,$809d,$80ba,$5927,$80a0,$80c3,$813e,$5fc3,$5c0f,$80a0,$8180,$80f1,$80be,$5fc3,$5305,$7126,$ff1a,$2103,$3001

32-128表示ASCII字符范围。

保存该文件待用。

在这里插入图片描述

2.2 制作.bdf 文件

打开下载好的GUITool.exe,点击“其他字体”,点击“打开”选择刚才准备好的字体文件:simsun.ttc,勾选"Bdf"选项。
在这里插入图片描述

点击“工具>设置”,确认红框内参数一致性

在这里插入图片描述
最后点击“生成字库”按钮,生成完成后会自动弹出output目录。
在这里插入图片描述

output目录
在这里插入图片描述
simsun_U16.bdf文件拷贝到 u8g2-master目录\tools\font\bdf\内。

在这里插入图片描述

2.3 制作U8g2需要的字体代码

使用U8g2提供的工具bdfconv.exe生成字库文件代码,到u8g2-master目录\tools\font\bdfconv\

在这里插入图片描述

因为要使用命令行参数对bdfconv.exe进行控制,因此为了方便我们可以在这里新建一个.bat批处理文件,例如新建HaPiWanChineseFont.bat文件。文件内容如下:

bdfconv.exe -v -b 0 -f 1 D:\u8g2\tools\font\bdf\simsun_U16.bdf -M D:\u8g2\tools\font\build\health_lamp_font.map -n u8g2_font_health_lamp -o u8g2_font_health_lamp_font.c -d D:\u8g2\tools\font\bdf\simsun_U16.bdf

注意:命令中的文件路径要替换成您实际的文件绝对路径。路径中不要出现中文字符,否则工具会执行失败!!!

bdfconv.exe命令行参数释义:

bdfconv [options] filename
-h Display this help【 显示帮助】
-v Print log messages【打印日志信息 】
-b <n> Font build mode, 0: proportional, 1: common height, 2: monospace, 3: multiple of 8【字体构建模式,0:比例,1:共同高度,2:空格,3:8 的倍数 】
-f <n> Font format, 0: ucglib font, 1: u8g2 font, 2: u8g2 uncompressed 8x8 font (enforces -b 3)【字体格式,0:ucglib 字体,1:u8g2 字体,2:u8g2 非压缩 8x8 字体(强制执行 -b 3) 】
-m 'map' Unicode ASCII mapping【Unicode ASCII 映射 】
-M 'mapfile' Read Unicode ASCII mapping from file 'mapname'【 从文件 "mapname "中读取 Unicode ASCII 映射】
-o <file> C output file【输出文件 】
-n <name> C indentifier (font name)【缩进器(字体名称) 】
-d <file> Overview picture: Enable generation of bdf.tga and assign BDF font <file> for description【 概览图片: 启用生成 bdf.tga,并为描述指定 BDF 字体文件】
-l <margin> Overview picture: Set left margin【 概览图片: 设置左边距】
-a Overview picture: Additional font information (background, orange&blue dot)【  概览图片:附加字体信息(背景、橙色和蓝色圆点)】
-t Overview picture: Test string (Woven silk pyjamas exchanged for blue quartz.)-r Runtime test【概览图片: 测试字符串(梭织丝绸睡衣换成蓝色石英)-r 运行时测试 】
map := <mapcmd> { "," <mapcmd> }【 】
mapcmd := <default> | <maprange> | <exclude>【 】
default := "*"【 】
maprange := <range> [ ">" <addexpr> ] Move specified glyph <range> to target code <num>【 移动指定字形 <range> 到目标代码 num】
exclude := "~" <range>【 】
range := <addexpr> [ "-" <addexpr> ] Select glyphs within specified range【选择指定范围内的字形 】
addexpr := <mulexpr> [ "+" <mulexpr> ]
mulexpr := <num> [ "*" <num> ]
num := <hexnum> | <decnum>
hexnum := "$" <hexdigit> { <hexdigit> }
decnum := <decdigit> { <decdigit> }
decdigit := "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
hexdigit := "a" | "b" | "c" | "d" | "e" | "f" | "A" | "B" | "C" | "D" | "E" | "F" | <decdigit>
{ } zero, one ore more, [ ] zero or once, | alternative(备选)
example:
-m '32-255' select gylphs from encoding 32 to 255
-m '32-255,~64' select gylphs from encoding 32 to 255, exclude '@'
-m '32,48-57' select space, '1', '2', ... '9'
build modes:
-b 0: Most compact, glyph bitmap is minimal
-b 1: Like -b 0, but glyph bitmap is extended to the height of the largest glyph within the selected glyph list.
Also the width of the gylphs is extended to cover the delta x advance.
-b 2: Like -b 1, but glyph width is set to the width of the largest glyph within the selected gylph list.

-b 3: Like -b 2, but width and height are forced to be a multiple of 8.

上述内容翻译

示例
-m '32-255' 从编码 32 至 255 中选择 gylphs
-m'32-255,~64'从编码 32 至 255 中选择 gylphs,不包括 '@'
-m '32,48-57' 选择空格、'1'、'2'、... '9'
构建模式:
-b 0:最紧凑,字形位图最小
-b 1:与 -b 0 类似,但字形位图扩展到所选字形列表中最大字形的高度。
字形位图的宽度也会扩展,以覆盖 delta x 提前量。
-b 2:与 -b 1 类似,但字形宽度设置为所选字形列表中最大字形的宽度。

-b 3:与 -b 2 类似,但宽度和高度必须是 8 的倍数。

感兴趣的朋友,可以研究下这些释义根据需要进行改进。这里我们只用到-v -b -f -M -n -o -d参数

双击运行HaPiWanChineseFont.bat文件。

在这里插入图片描述

在这里插入图片描述

我们会看到新加了上面红框内的两个文件,其中u8g2_font_hapiwan.c既是我们通过命令行参数

-n -o 进行指定的,您也可以替换成您喜欢的内容。

用记事本或其他工具打开u8g2_font_health_lamp_font.c文件查看内容,您将会得到如下内容:

/*
  Fontname: -FreeType-SimHei-Medium-R-Normal--16-160-72-72-P-143-ISO10646-1
  Copyright: � Beijing ZhongYi Electronics Co., 1995-2005, All rights reserved
  Glyphs: 169/28522
  BBX Build Mode: 0
*/
const uint8_t u8g2_font_health_lamp[3733] U8G2_FONT_SECTION("u8g2_font_health_lamp") = 
  "\251\0\3\2\4\4\4\5\6\20\20\0\376\13\376\14\377\1\304\3\202\4\372 \5\0\30Q!\12\302\13"
  "Q<(mC\0\42\10\64\212QD\246\0#\26\270\10Qe\245\60\212\206A*Fa\24\15\203\222"
  "\225\302(\3$\25\326\371P\205C\262\264\14\242\272%K\262$\203\22\215\31\0%\25\267\10\321HI"
  ")iJjJ\232hJ\224\224\222\246\244&&\26\270\10Q\255\211\230\210I\252\256I\224HI\242I"
  "\312\20m\0'\6\61\213Q\14(\14\323\374P%\211\22\365-\312\2)\15\324\370\320\204Y\230\365)"
  "R$\0*\17\206\71Q\211\322\60iC\222(\221(\1+\20x(\321\345@\16\204\303\240\345@\16"
  "\204\0,\7\42\11Q\14\1-\7\27XQ\34\2.\7\42\11Q\14\1/\16\246\31\321\206i\230\206"
  "i\230\206)\0\60\16\266\11\321\14\211\224\204~S\22M\2\61\13\264\11\321E\303\220H\376\0\62\16"
  "\266\11\321\14\211\64\206b(\66\16\17\63\17\266\11\321\14\211\64\206\232\250\32\27M\2\64\24\270\10\321"
  "\306\352\232\204Q&e\245aPs \7\42\0\65\21\267\10Q\15\212\32'\341 er\274)\266\11"
  "\66\21\267\11\321\245j*\16\222\226\204\307D\222\206\10\67\16\266\11Q\134C\61\24C\61\15m\0\70"
  "\26\267\10Q\15Q\246\204I\246\14\322 \205c\22&\222\64$\0\71\21\267\10Q\15Q\66\204\67\305"
  "\66\244\251\232j\0:\10r\13Q\350\310\20;\11\202\373P\350\310\240\0<\12\266\11\321\206mb\334"
  "\3=\12W\70Q\34r\206C\0>\13\266\11Q\304=\266\211)\0\77\17\266\11\321\14\211\264\211\232"
  "X\247\245\31\0@\26\267\10Q\15Q(\15R\262DKE\251(\25)\211r`\2A\23\270\10\321"
  "\311\326!\214\302(\33\64I\12\243\60\21\5B\20\266\11Q\14J\66\232\224A\11\235\206!\2C\17"
  "\266\11\321\14\211\64Z\213\342\226\230\26\0D\15\266\11Q\14Q\244d\243o\313\15E\15\266\11Q\34"
  "\322\352\360\220V\207\7F\14\266\11Q\34\322\326AI\273\2G\21\266\11\321\14\211\64Z\243!\32\302"
  "-\61)\1H\13\266\11Q\204\36\207A\364\30I\10\262\13Q\374C\0J\14\266\11\321\366U\324\206"
  "!\232\0K\24\267\11QdJ\26\325\22m\34\262(\213\244,\312\224PL\11\266\11Q\244\375ux"
  "M\22\266\11QHC\64DC\64$\303\220\370/Q\0N\20\266\11Q\204\333!R\42\305\224HC"
  "v\23O\22\267\10Q\15\221%L\302\307$L\62E\12%\0P\15\266\11Q\14J\66\32\207A\355"
  "\12Q\22\267\10Q\15\221%L\302\307$JJ\213\24\16\1R\22\266\11Q\14J\66\332\206!\211J"
  "J\226dc\0S\20\266\11\321\14\211\264\15\251z\24'eH\0T\11\266\11Q\234D\377\11U\13"
  "\266\11Q\204\376qR\206\4V\22\267\10Q\210I\230d\212\244HY\224%\332\352\4W\27\270\10Q"
  "D\312\220(\211%J\224(Q\42\245\244\224|\312\244\10X\22\267\10\321d\212\224E\331j\34\23I"
  "\252\15a\0Y\16\267\10Q\210I\246HY\242\255~\2Z\15\266\11Q\34\305P,\212\241\70<["
  "\12\344\373P\14Z\377\333\20\134\16\326\351P\304i\71\215\323r\32\247\1]\12\344\371P\14Y\377\333"
  " ^\11\66\251Qi\211\22\6_\7\30\350P\34\4`\10\63\252QHR\0a\16v\11\321\14I"
  "\246\15\313\66-K\0b\17\266\11Q\244\255\203\222\215\266!Z$\0c\14v\11\321\14I\266\26'"
  "e\2d\16\266\11\321\266\16\203\66\332\206HY\2e\15v\11\321\14I\66\134\303IZ\0f\15\266"
  "\11Q\15QZ\33\246\264\67\0g\21\226\351\320\14[\222EC\222\16J\66\16\13\0h\13\266\11Q"
  "\244]\206M\364\30i\11\262\13Q\14\341\360 j\14\325\351\320\331a\315\267iX\0k\20\266\11Q"
  "\244\235\224D\32\42%\312\222l\14l\10\262\13Q\374C\0m\24x\10Q\14\311\240(C\242\14\211"
  "\62$\312\220(Cbn\12v\11Q$\303&z\14o\14v\11\321\14I\66\32'\23\0p\16\226"
  "\351P\14J\66\332\206h\221\322\24q\15\226\351P\34\262\321\66D\312\222\26r\12t\12Q$C\224"
  "u\3s\16v\11\321\14\211\64\304K\70)C\2t\14\247\10\321\305\265a\214;\205\3u\12v\11"
  "Q\204\336\206\344\22v\14v\11Q\204\223\22\65\215&\0w\22x\10Q(\312\220(Q\242DJ\311"
  ")\214\42\0x\16v\11QH\25M\324\206DJ\302\0y\15\226\351P\204\223\22\65\215\306l\3z"
  "\12v\11Q\334\304Fq\30{\14\343\374\320\14\211/\221\342)\1|\7\362\353P\374\37}\13\343\371"
  "PH}K\242^\0~\10\66\271\321\204\223\64\0\0\0\4\377\377!\3\36\335\11\341\344`\222cI"
  "\70d\231\250\306\241\16\346h\216\346h\16\204r*\312\303\2\60\1\12T\372`h\231)\1\60\2\12"
  "\64\12a\14\322\220\0N\0\11.Ya\374\17\1N\11\21\276\11\341\14\357|\223\305\341\220\363\247\341"
  "AN\21$\336\371`\15\207\34\11s@\314\1\61\7\304\34H\303\341\220\3\241\16\204:\20\352@\250"
  "\3a\66<\10N-\32\374\352\340\352\230\216\251\303C\350\217\303\203(\246:\246c:\246c*\0N"
  "\214\16\256\11\341\14\7\235\377O\303\177\10N\216\34\336\371\340\14\7\35\321Q\35\325Qyx\220uT"
  "GuTGuT\307v\0N\224 \336\371\340\350\210\64\274\3\71\252\243:\64\334\221\60G\302\34\11"
  "s$\314\1\61\33\276\303\0N\245\42\376\351`\347\260<<\250\71\252\203\241<\14\71\32\351\200$O"
  "\352\246\203\203<JC\16H\71\12N\272\36\356\371`\353\250\216\352\250\216\352\250\216\352\340\220cQ\16"
  "\331\221P\216\65\35\261c\2OM'\376\351\340\205\71 \312\71\34\15\27\35\325\302(\311\62)\311\62"
  "\61\223\322\60J\303(\215\325d\70D\71\234\203\0Qm\33\336\371\340\352\260\16\307\303\177\310\211uD"
  "\223E\71\26u@\322\241:\226\0Q{#\376\351`\326\21-\35\336\201\34\32\16\71\222\3\37\342("
  "\207\302X\311&[$\326\221\60V\343\42\0S\5%\356\371`\346\250\16\16\207\60G\62\35\211\206S"
  "%\215\302\64\12\207!\12s$\214\307\34\213tD\33\16\2S;$\356\371`\374\220\243Z\216H:"
  "\42\15\203\244H\261\32+\303!Qcq\10\65\351\260*J\216\15\17\2SA\34\356\371`\353\250\216"
  "\352\250\216\352\250<<\310:\252\243:\252\243:\252\243\62\0SH\37\356\371`\346\250\216\346\350p\320"
  "\302\34Hs\70\207\343\341A\7r\70\207s\70\207c\0So-\376\351\340\346\320\260\14K\234)Y"
  "\224)Y\224)Y\224)Y\224)Y\224)\311\224\15K\224)\221\224\14a\26ib\272\346p\12S"
  "\245(\376\351`\15/\71\234FZ\224daIL\226dP\262\310\322)L\232\302\244)L\6Ik"
  "\211\234\222\310\250\303\0T\4\37\376\351`\352h\216\16\203\274\251Q$g;\270#\333\264#\333\60\310"
  "}\36\6\71\307\0T\10&\376\351`\347\260\16&:d\7D\65\7\26e\30\24\235\64\34\302\341\20"
  "\346\200\230\3\342p\10s@\314A\0V\333 \334\372`|\310\242L\213\62-\312\264(\223\244L\312"
  "\62E[\224\34\321\61\35\33\36t,Y'\37\356\371`\353\250\216\352\250\274i\303\7YGup\310"
  "\261HG\302\34P\303y\321\61\1Y) \336\371\340\14\7\35\321Q\35\225\207\17\232(\353\340\220c"
  "Q\16i\71 \212;\240\350\230\0Y* \356\371`\353h\16\347p\16|\310\1\35\325\301\35\214r"
  "\310\16\210\352\20j\222\250\210\251\0[P\34\336\371\340\14\357\330\216\351\230\216\312\242\70<\350\210\216\352"
  "\250\216\352\250\216\355\0[\232$\356\371`\347\260\16|\312\261(\307\262\341\220C\71\234CY\216h\203"
  "\250\345\300\20\345@\64\304\342\60\10[\305$\376\351`\347\260<|\7\227\341\42\353\310p\10\63-\34"
  "\16a\246\205\303!\7s@\334td\311Q\0\134\17\36\355\371`\353\240\16\352\240\216DR(\331\62"
  "\255f\321\304$\24G\61\326A\35[\1\134\21 \356\371`\353\250\216\352\220b\225\264\60\23\225P\26"
  "uT\322\21;\250\203:\264#C\16\1]\362 \335\372`<\350h\216F:\22\351H\64\34$\35"
  "\211tP\7uP\207\206\34R\206\203\2]\363\42\335\372`<H\71\42\345\210\224#R\216H\303A"
  "\312\21)Gs\64Gsl\310\241h\70(\0^t#\376\351`\346\250\16\16\7-\224E\325\216\14"
  "\207\60\323\221LG\62u\31\16\71\240\243:\252\243*\0^\246%\376\351\340\3\71\234\3\237\262\260\26"
  "V\206C\224\205\265a\314\341d\270eZ\30*\241\252f\323\240\345P\0_\303!\356\371`\347\260\16"
  "\347p\216\351\220\242f\221*E\362\20\351\300\244#\231\216\252\261\250\3\67\0b\14%\356\371\340\3\221"
  "\16e\71\224#\303S\230#\241\24\206R\70(\211\30)Eu\214\325T\311DI\21\305\1bK\34"
  "\336\371`\16\267a\207s\70\7\276#\71\34\17\17:\220\303\71\234\303\71\70\3e\345\32\352\373`\374"
  "C\16\354\300\16\354\300\207\34\330\201\35\330\201\35\370\220\3\1e\366(\356\371\340\203\71\34\15r$%"
  "\303!J\206C\24G\203\224ER$ER\26ER\34\15r$\305\221\16\345\340\4f\16\42\335\371"
  "`\14\322\60H\221\66E\332\24\15\7I\233\42m\212\264)\32\16R\70\25\327\60\26SQf\37\42"
  "\356\351`\15\207\60G\302\341\20\346H\70\34r\242\244\3\237B\71\325\221\341\220#\362\360!\307\4g"
  "\10#\334\371`\15\207H\7\42\35\210\206C\244\3\221\16D:\20\15\207H\7\242\34\211r$\321\221"
  "\35\30g\37*\376\351\340H:\42I\303C\222%\222\224%\222\224%\303\64(\222\224%\303\224%\222"
  "\64|\313\21-\221\212GU\333\201\30g*!\356\371`\347p\16\347\310p\320\221\34\316\201\17\352\216"
  "-\71\242$\262\24\211Z\266\210\251\234\3l\24\36\355\372`\351`\16\16\7E\7\223\341\224\63\16\207"
  "\34\315\321\34\315Q%\307\222\34\33l\350\35\356\371\340\3\262*\353\224a\320!QV\355\320\60\350\220"
  ",\312\251k,J\303!mA%\356\371\340\3\262\232\3\337\201\70\315\62c\246\14w\70\213\224D\214"
  "\224D\214\224D+%\222\26%\266\312\20n)%\336\371\340H\303\20Fi\16\34\242\60\315\244\64\7"
  "\16\71\61\31NJ\224D]\242.Q\42U\242$\31\36q&%\376\351\340e:\22\346\300\247P\26"
  "\325\341!)\352\300\203\26\352@\250I\203\64\350\224,\222\206\254\65G\0u\37 \356\371`\353\210\244"
  "#\231\16h:\360E\224S\35\325\221\341\220#:\252\243:*\17\17\2u\63\31\374\352\340\352\230:"
  "<\204>\16\17\242\343\360 \272c:\246c*\0~\317%\336\371`I\303\220\345H\246\3a\244i"
  "\203\66D%Q\312\342D\33\206d\20s\70\207\262p\20\213\303\1~\334,\376\351\340#\71\20\352@"
  "\70L\25MJ\224R\64$\321\226\250j\250L\231:\14\321\260#\231\32e\312 \15\213\232\351H\246"
  "\0\200\235'\356\351\340\14\312\60$\221&F\232\70hb\244\211\321\220X\242\341\220\14\232\30i&\315"
  "\244i\231-\22\345T\3\200\240.\356\351\340\14\311\60D\345,\12\305!S\243H\216\222aP\242,"
  "I\224!R\22%\252(Q\64U\262LJ\262HK\42E\332\201\34\200\272\60\356\371\340C\351\20\246"
  "Q\62\14J\24\246Q\230\16\341\240D\311\60(Q\22E\312\220D\221\22%Q\244DI\24mI\224"
  "(YX\22C\0\200\276'\374\352\340\345H\224\14\203TK\242,\211jSi\230\303d\70D\71\22"
  "\15\207(G\242\341\20\345H\24Oq\6\200\303!\354\352`|\10\305\341A\24\207\207\34\36\16Q\216"
  "D\303!\312\221h\70D\71\22\305;\224\1\200\306$\336\371\340\14\321\60\65F\215\321\20\205Qi\230"
  "\32\243\306h\210\302\250\64LuH\312\241,\31N:\4\200\361*\356\371\340C\351\20\246Q\22\365\22"
  "uI\244!L\243d\30\224(K\302!K\302(K\302(R\62\251\255T\262dC\0\201\11\60\377"
  "\351\340#\362\20\252QZJ\206\70\12\263h\10#\251\62\14YT\31\207()F\225b\224(Q\26"
  "%Q\64dI\224%\221\246\303\61\0\201>*\376\351\340C\351\220\305Q\62\14Q%\352\62\14\321\220"
  "D]\242.\303\20\15Y\34eI\30\65F\303S\232Ej\16g\0\201\200/\376\351\340C\351\20\246"
  "\321pH\242H\312\242,\321\206d\30\224(\211\262$\32\16\311\220\305Q\26G\321\60\65&R\42&"
  "\221\22\355h\6\210@\36\336\371\340\346p\16\15\7Mj\223\332\244\66\251Mj\223\332\244\66\251Mj"
  "\32\36\4\215\263%\356\371`\15\207P\26eQ\26eq\70\344\210\216H:\42\15C\226\351\210\244#"
  "\213\16DC,\16\203\0\217\260 \336\371`\15\7-\207s\70\31\6\61\207sxxJL\231\42\325"
  "\42i\214\64\333\264\256\2\221I#\336\371`|P\243\34\213\342\341I\252ER-R\244A\32r "
  "\322\241hx\322\241hx\322\241\4\221],\376\351`\34\22IJ\262aJrh\30r i\7\222"
  "\312pi\253\264U\222IK\243\312\60D\225\64\311\326dxHB\35\6\226\63%\355\352`\14\321\60"
  "H\305\251\270d\341\222\205\213\64\14RqR\302I\11\207)\134\262aP\303\65\334Q\0\226\64%\355"
  "\351`\134\206!\213B-\12%)\224\262a\210\262P\213B-\32\206,\12\225)\224\252\242*\206k"
  "\16\377\14\11B\352`\14I\1\377\32\11b\13a\14\341\20\0";

这段代码很重要,我们将用到这段代码来自定义自己的U8g2中文字体类型。

其中,我们自定义的中文字体类型名称为:u8g2_font_health_lamp

2.4 制作自己的U8g2字体类型

这一步,强烈建议您用notepad++ViSual Studio Code(推荐用这个)进行操作。有些朋友可能会感到好奇,为什么要这样呢?

因为,接下来我们将操作u8g2lib库的源文件,用记事本打开一个将近30M的文件进行读写操作,是一件很痛苦的事情,相信我,不要再尝试了- -!

如果您还没有安装u8g2lib,您可以通过Arduino编辑器的库管理器进行安装。在这里插入图片描述

您打开库管理器后,可以输入"u8g2"确认您是否已安装,如果没有安装您需要安装一下。安装好后到 Arduino库文件目录内。

如何确定库文件在哪里呢?

打开Arduino编辑器菜单“文件>首选项”。项目文件夹位置,既是!
在这里插入图片描述

您的情况可能和我不同,没关系,按照您的实际情况进行操作即可。

到库文件夹目录/libraries/u8g2/src/clib/目录内找到u8g2_fonts.c文件。注意:后面的S

在这里插入图片描述

我们还需要用到头文件u8g2lib.h,在 /libraries/u8g2/src/ 目录内。刚才讲了,用记事本编辑他们是一件痛苦的事情,当然如果您不想下载Visual Studio Code,您也可以任性.

打开Visual Studio Code,点击菜单File>Open Folder选择目录。我的是D:\PracticeCode\Arduion\doc\libraries\U8g2\src,您根据实际情况来。打开后如下:
在这里插入图片描述
因为我们要新建的是中文字体类型,因此我们可以参照u8g2自带的类型,例如:u8g2_font_wqy12_t_chinese1,通过搜索工具进行搜索,可以快速定位它的代码位置,方便我们插入自定义的内容。如下:

在这里插入图片描述

点击u8g2_fonts.c搜索结果,将 2.3 中制作的代码段,全部粘贴到此代码文件内,大概在110665行左右,保存文件。如果您的位置和我有出入,没关系,只需要牢记我们“自定义的字库代码类型”,并且确保修改后的文件不会出现语法错误即可。如下图:

在这里插入图片描述

接着,我们要修改clib文件夹中的u8g2.h头文件,来为我们自定义的字库代码类型添加声明。
在这里插入图片描述

到这里,我们根据项目需要自定义的汉字字体库类型,就可以在代码中直接使用了。是不是很有成就感?就是这种自我满足,支撑我决定写这篇文章,来记录下自己的学习历程,同时,也希望有缘人能够减少弯路,一步到位!

3 检验成果

本章节,需要用到的材料如下:

  1. Arduino UNO开发板及USB数据线
  2. 128X64的LED屏幕一个
  3. 面板版一个
  4. 杜邦线若干

在开始之前,要重点强调下:对于LED屏幕的了解至关重要!这会直接影响您是否能够点亮您的屏幕。

至少需要了解您的屏幕如下参数:

  1. 显示驱动程序
  2. 屏幕支持的数据协议,例如SIP IIC
  3. 各个引脚的含义
  4. 屏幕显示像素
  5. 工作电压、电流,一般3.3V或5V
  6. u8g2的声明类型一定要和您的屏幕驱动相符合!!!

如果您准备好上述内容,那么废话不多说,上测试示例。通过结果来检验,最能够提升我们的满足感!

3.1 ST7567驱动屏幕示例

/*

 * LED品牌:金逸晨 型号:GMG12864-59D 驱动IC:ST7567
 * 引脚接线释义
 * 引脚说明针对Arduino UNO
 * 序号  板载     官方示例  官例引脚    U8G2
 * 1    /CS     CS        7         10
 * 2    /RES    RST       6         8
 * 3    RS      CD        5         9
 * 4    SCL     SCK       4         13
 * 5    SI      SDA       3         11
 * 6    VDD     VDD                 3.3V
 * 7    VSS     GND                 GND
 * 8    BLA     LEDA      3.3V      3.3V
 * 9    BLK     LEDK      GND       GND
 * 10   IC_SCL  IC_SCK
 * 11   IC_CS   IC_CS     9
 * 12   IS_SO   IC_SDO
 * 13   IC_SI   IC_SDI    8
 * */
   #include <Arduino.h>
   #include <U8g2lib.h>

#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif

//一定要注意rotation参数为镜像模式,res针脚必须接到Arduino,否则不显示
//u8g2的类型要根据您的屏幕驱动来定,这点很重要,否则工作不正常
U8G2_ST7567_ENH_DG128064I_1_4W_SW_SPI u8g2(U8G2_MIRROR, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);

void setup(void) {
  u8g2.begin();
  u8g2.enableUTF8Print();
}

void loop(void) {
  u8g2.firstPage();
  do{
    // 设置字体类型为我们刚才自定义的字库类型
    u8g2.setFont(u8g2_font_hapiwan); 

    //汉字字体的大小为 16*16像素 屏幕像素宽128,设置x=40,可以起到居中效果,计算公式:(128-16*3) / 2
    u8g2.setCursor(/*x*/40, /*y*/16); 
    //直接用print方法将String类型输出到屏幕
    u8g2.print("哈皮玩");
      
    //利用U8g2自带的字体类型画天气符号
    u8g2.setFont(u8g2_font_open_iconic_weather_2x_t);
    u8g2.drawGlyph(3, 16, 67);//代表雨
    
    //画一条横线
    u8g2.drawLine(/*x-start*/0, /*y-start*/18, /*x-end*/128, /*y-end*/18);
    
    //将字体设置回来
    u8g2.setFont(u8g2_font_hapiwan); 
    //测试这种字体下屏幕可以显示的ASCII字符有几个,测试结果ASCII字符大小约为8*12
    u8g2.drawStr(/*x*/0,/*y*/30,/*字符串*/"ABCDEF0123456789");
    
    u8g2.setCursor(0, 46);
    u8g2.print("温度:28.9");
      
    //利用U8g2自带的字体类型绘制温度符号
    u8g2.setFont(u8g2_font_logisoso16_tf);
    u8g2.setCursor(80, 48);
    u8g2.print("°C");
    
    //将字体设置回来
    u8g2.setFont(u8g2_font_hapiwan); 
    u8g2.setCursor(0, 62);
    u8g2.print("湿甲醛有机挥发物");
    
    //画边框线示例。先执行此代码,后面在画字体时,可能会将“线条”冲掉
    u8g2.drawFrame(/*x*/0,/*y*/0,/*width*/128,/*height*/64);

  } while(u8g2.nextPage());

  delay(200);  
}

由于这个显示器带有背光,因此板子上的VDDBLA都要接3.3V,同时VSSBLK都要接GND。如果直接背光电源,显示器显示效果会闪烁。如果不接背光电源,需要仔细看才能看清楚屏幕内容- -!

代码执行后的效果如下:

在这里插入图片描述

这个屏幕尺寸比较大,但是分辨率差强人意。

显示器规格图
显示器规格图

3.2 SSD1306驱动屏幕示例

换一个0.96寸的,这个屏幕我比较喜欢,分辨率高,显示细腻,而且稳定。因为该屏幕的显示驱动和上一个不同,因此我们需要将代码稍作修改。

/*

 * LED品牌:未知 型号:GMD09601 SERIES-2864KLBEG01 驱动IC:SSD1306
 * 引脚接线释义
 * 引脚说明针对Arduino UNO
 * 序号  板载  引脚    U8G2
 * 1    GND   GND   
 * 2    VCC   3.3V
 * 3    D0    13    SCK
 * 4    D1    11    MOSI
 * 5    RES   8   
 * 6    DC    9     SPI数据、命令引脚
 * 7    CS    10    SPI Chip Select
 * */
   #include <Arduino.h>
   #include <U8g2lib.h>

#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif

//res针脚必须接到Arduino,否则不显示
//构造函数res可以省略,如果RES接到Arduino的RES引脚,屏幕也会点亮,但是感觉时序不对
//u8g2的类型要根据您的屏幕驱动来定,这点很重要,否则工作不正常

//务必注意:这里使用的是FULL_BUFFER方式,比较占用内存,仅为演示!!!
U8G2_SSD1306_128X64_NONAME_F_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, 
    /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);

void setup(void) {
  u8g2.begin();
  u8g2.enableUTF8Print();
}

void loop(void) {
  // 清除内部缓冲区
  u8g2.clearBuffer();

  // 设置字体类型为我们刚才自定义的字库类型
  u8g2.setFont(u8g2_font_hapiwan); 

  //汉字字体的大小为 16*16像素 屏幕像素宽128,设置x=40,可以起到居中效果,计算公式:(128-16*3) / 2
  u8g2.setCursor(/*x*/40, /*y*/15); 
  //直接用print方法将String类型输出到屏幕
  u8g2.print("哈皮玩");

  //利用U8g2自带的字体类型画天气符号
  u8g2.setFont(u8g2_font_open_iconic_weather_2x_t);
  u8g2.drawGlyph(3, 16, 67);//代表雨

  //画一条横线
  u8g2.drawLine(/*x-start*/0, /*y-start*/17, /*x-end*/128, /*y-end*/17);

  //将字体设置回来
  u8g2.setFont(u8g2_font_hapiwan); 
  //测试这种字体下屏幕可以显示的ASCII字符有几个,测试结果ASCII字符大小约为8*12
  u8g2.drawStr(/*x*/0,/*y*/30,/*字符串*/"ABCDEF0123456789");

  u8g2.setCursor(0, 46);
  u8g2.print("温度:28.9");

  //利用U8g2自带的字体类型绘制温度符号
  u8g2.setFont(u8g2_font_logisoso16_tf);
  u8g2.setCursor(80, 48);
  u8g2.print("°C");

  //将字体设置回来
  u8g2.setFont(u8g2_font_hapiwan); 
  u8g2.setCursor(0, 62);
  u8g2.print("湿甲醛有机挥发物");

  //画边框线示例。先执行此代码,后面在画字体时,可能会将“线条”冲掉
  u8g2.drawFrame(/*x*/0,/*y*/0,/*width*/128,/*height*/64);

  // transfer internal memory to the display
  u8g2.sendBuffer();          

  delay(200);  
}

在这里插入图片描述

问题

  1. 在驱动ssd1306时,下面接口不起作用:
U8G2_SSD1306_128X64_NONAME_F_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 11, 
    /* data=*/ 10, /* cs=*/ 9, /* dc=*/ 8, /* reset=*/ 7);

若按照u8g2库中的示例接口,显示正常:

U8G2_SSD1306_128X64_NONAME_F_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, 
    /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

蔚蓝慕

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

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

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

打赏作者

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

抵扣说明:

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

余额充值