本帖最后由 小恶魔owo 于 2024-12-28 01:36 编辑

(一)简介
在使用ESP32的时候,我们知道OLED屏幕是有中文库的,里面有非常多的常用字,但是LCD屏幕只有取模才能得到中文字体,那我们本期教程就来教大家如何搭建自己的字体库,使用中文字体更加方便快捷。

注意,不是任何芯片都能这样搭建,如果芯片的储存不足,就会影响正常程序的下载和使用,因为ESP32最低有4MB的外置储存(能用3MB)所以对于常用字体是绰绰有余的

ESP32TFT_LCD屏幕1700字常用字库下载
https://mbb.eet-china.com/download/316558.html

(二)教程
首先,在系统内,找到喜欢的文字
C:\Windows\Fonts
复制到桌面,可以得到一个TTF结尾的文件
image.png

image.png


打开arduino TFT_eSPI库的文件夹
C:\Users\用户名\Documents\Arduino\libraries\TFT_eSPI\Tools\Create_Smooth_Font\Create_font
这个是TFT库自带的生成字库的软件
image.png


将字库放进data文件夹内,最好改个名字,不要中文
我这里改成了xem.TTF
image.png


然后要下载一个Processing-processing3.5.4软件,这个软件可以将TTF文件转换成我们需要的字库字体
下载地址:https://mbb.eet-china.com/download/316557.html

image.png
然后打开Create_font.pde
更改以下内容
130行fontName,这里写你字库的名字
132行fontType,这里写字库的后缀,必须分大小写
137行fontSize,这里是字体大小设置,16最佳
140行displayFontSize,这里也是字体大小设置,16最佳



浏览器打开编码工具
http://www.jsons.cn/unicode/
中文转Unicode编码
输入你想要的文字,或者直接给一个2000字的常用字库
image.png




打开文本替换工具,我们需要将格式转换一下
https://www.lddgo.net/string/text-replace
注意前面有个英文的逗号,删了
如:\u6076\u9b54\u6e29\u6e7f\u5ea6
替换:0x6076,0x9b54,0x6e29,0x6e7f,0x5ea6,0x6674
image.png


将替换后的内容,打开Create_font.pde
330行specificUnicodes

static final int[] specificUnicodes = {
复制到括号中间(最后一位记得加英文逗号)
}
   image.png



点击左上角的三角形运行
然后如果没问题,会生成vlw文件
将这个文件放到桌面
image.png

image.png



然后用软件将vlw文件转成arduino可读的文件
https://tomeko.net/online_tools/file_to_hex.php?lang=zh
复制生成后的字符
image.png

ino文件夹里面创建一个font.h文件

自己写下面一段
const uint8_t xem_font[] PROGMEM = {
【将生成的字符复制过来】
};
image.png


引用一下字库文件
image.png

启用字体
image.png


tft.drawString("多云大雨",0,40);
会自动寻找有的字体,直接写就好了
   image.png

注意,需要将ESP32的内存设置为3M
image.png


(三)效果演示
#include <Arduino.h>
  • #include <TFT_eSPI.h> // Hardware-specific library
  • #include <SPI.h>
  • //#define TFT_MOSI 23
  • //#define TFT_SCLK 18
  • //#define TFT_CS    5  // Chip select control pin
  • //#define TFT_DC    2  // Data Command control pin
  • //#define TFT_RST   4  // Reset pin (could connect to RST pin)

  • #include "xem_font.h"
  • TFT_eSPI tft = TFT_eSPI(); // Invoke custom library

  • void setup(void)
  • {
  •   Serial.begin(115200);
  •   tft.begin();
  •   tft.fillScreen(TFT_BLACK);
  •   tft.loadFont(xem_font);
  • }

  • void loop()
  • {
  • tft.setCursor(0,0);
  • tft.print("aaa");


  • tft.drawString("大家好啊",0,40);
  • }

  • 复制代码

    c198dd1dba581faae768e31266f8651.jpg