Arduino OLED自己添加字庫教程,剛開始接觸U8g2字庫走了不少彎路,然后U8g2添加字庫的過程記錄下來做成文檔供和我一樣的小白們參考,希望能申精。
一、前言 最近在研究用 Arduino 以 U8g2 庫驅動 OLED 顯示中文,過程中走了很多彎路歷經曲折,翻閱很多資料對 于我這樣的小白來說這些資料有點深奧,理解不是怎么透徹于是請教群里的高手,非但問題沒有幫助解決還受到嘲 笑和譏諷,于是我下定決心自己一定要把這個字庫弄成功,最后我翻閱資料和反復試驗終于成功的添加了自己的字 庫,所以我要將自己的心得和成功的方法獻給像我這樣的小白。 二、準備硬件和軟件 1. | 準備一塊 ssd1306 液晶顯示模塊,一塊 arduino 開發板。 |
| 2. | 準備 arduino IDE |
| 3. | 下載 ssd 1306 的支持庫 u8g2:地址自行搜索 |
| 或者在 arduino 上安裝 u8g2:(1)打開管理庫:
(2)搜索并安裝 u8b2
三、用 arduino 驅動 oled 顯示屏 (1)接線。我用的是 Arduino R3,這個 1106 的屏幕是使用 i2c,我只需在 Arduino R3 上選取兩個引腳作為 i2c 即可,而 1106 需要 3.3v 供電,再接兩根線供電。 (2)打開 u8b2 的例程 PrintUTF8。
(3)配置工程的引腳和通訊方式。只需要根據屏幕的通訊方式和接的 I2C 引腳配置即可,配置方式是選擇對應的 配置去掉注釋。我用的是 SSD1106_128X64,用了 I2C 接口,使用 SDA 和 SCL 作為 i2c 的引腳,所以我配置是:
U8G2_SSD1106_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /* clock=*/ 23, /* data=*/ 22, /* reset=*/ U8X8_PIN_NONE); // All Boards without Reset of the Display
代碼如下:
void setup(void) {
u8g2.begin();
u8g2.enableUTF8Print(); // enable UTF8 support for the Arduino print() function
}
void loop(void) {
u8g2.setFont(u8g2_font_unifont_t_chinese2); // use chinese2 for all the glyphs of "你好世界" u8g2.setFontDirection(0);
u8g2.clearBuffer(); u8g2.setCursor(0, 15); u8g2.print("Hello World!"); u8g2.setCursor(0, 40);
u8g2.print("世界你好"); // Chinese "Hello World"
u8g2.sendBuffer();
delay(1000);
}
顯示效果如下: 如果不能正常顯示漢字需要將漢字在 UTF8 編碼格式下打開,也可以在 UTF8 編碼格式格式下打開以上代碼然后點 擊保存,我使用的是 Notepad++ 打開并保存代碼便可以解決漢字亂碼的問題 四、制作自定義的字庫 u8b2 官方的庫只能顯示很少的中文,如果要顯示其他中文就要自己制作字庫了。制作字庫的工具在目錄在:
u8g2\tools\font\bdfconv
bdfconv.exe 這個工具是一個 dos 命令,需要開啟 cmd.exe 在命令行輸入命令或者用 bat 腳本來生成字庫。
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
-f <n> Font format, 0: ucglib font, 1: u8g2 font, 2: u8g2 uncompressed 8x8 font (enforces -b 3)
-m 'map' Unicode ASCII mapping
-M 'mapfile' Read Unicode ASCII mapping from file 'mapname'
-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
-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
map := <mapcmd> { "," <mapcmd> }
mapcmd := <default> | <maprange> | <exclude>
default := "*"
maprange := <range> [ ">" <addexpr> ] Move specified glyph <range> to target code <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.
在“bdfconv”目錄下有一個腳本 “test_helvb18.bat” ,
bdfconv.exe -v -f 1 -m "32-127" ../bdf/helvB18.bdf -o helvb18_tf.c -n u8g2_font_helvB18_tf -d ../bdf/helvB18.bdf type helvb18_tf.c
我們可以利用這個腳本來生成字庫,這個是直接通過“helvB18.bdf”字庫文件生成 ".C"的字庫數據,而中文字庫 很大,一般都有幾 M 大小,顯然這種直接生成的方法不好用。還有另外一種字庫生成方法是按需提取字庫,利用一 個 map 表來提取要生成字庫的內容,map 表里面放置的是 unicode 編碼(需要哪些中文就填這些中文的 unicode 碼)。unicode 編碼工具很多我用的是 ”文本與 unicode 轉換小工具 V5.02.05”
Unicode 碼分隔符用$ 在文本區輸入想要顯示的漢字 Unicode 碼進制選十六進制,接著 Unicode 碼區會顯示十 六進制碼,復制生成的字碼將它填在自己要顯示的 map 表里面。 我的字碼放置在“chinese2.map”(當然這和字碼表也可以另建)如下圖:
這種生產方式的命令是: bdfconv.exe -v ../bdf/unifont.bdf -b 0 -f 1 -M ../build/chinese2.map -d ../bdf/7x13.bdf -n u8g2_font_unifont_zgzt -o u8g2_font_unifont_zgzt.c 從這個命令我們可以知道 map 文件是 “chinese2.map”,全路徑是:“u8g2\tools\font\build”,我們可以在 “chinese2.map”文件里面添加我們要顯示的中文。生產的字庫代碼在 u8g2_font_unifont_zgzt.c 文件里面,我 們可以將里面的內容復制,然后打開路徑" U8g2\src\clib 下的 u8g2_fonts.c "文件, 將復制的內容粘貼在里面。 注意:我是將字碼放在例程的字庫里(也就數 chinese2.map 里面)所以產生命令是: bdfconv.exe -v ../bdf/unifont.bdf -b 0 -f 1 -M ../build/chinese2.map -d ../bdf/7x13.bdf -n u8g2_fonts -o u8g2_fonts.c
如下圖: 點擊保存。
打開 u8b2 的例程 PrintUTF8 程序將生成過字碼的漢字填在 u8g2.print("");里就可以顯示要顯示的漢字了。
以上圖文的pdf格式文檔下載(內容和本網頁上的一模一樣,方便大家保存):如果你不想保存就不必下載了:
U8g2自己添加字庫.pdf
(1.09 MB, 下載次數: 42)
2022-11-13 13:34 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|