Arduino的很多设备都无法显示中文,一般是使用图形显示中文内容。同样,也可以用u8g2显示中文。但是自带的中文字库并不能很好的满足我们的需求,极有可能会出现中文无法显示的情况,所以我们需要自建库。

首先去GitHub上下载u8g2的代码,把tools文件夹复制到Arduino下载的u8g2库文件目录下。 进入到U8g2/tools/font/build,找到chinese1.map。把要的中文字转为Unicode写入,注意格式和逗号。

text = "当前时间:"
text = text.encode("unicode_escape").replace(b"\\u", b"$").decode("utf-8")
formatted_text = ",\n".join([text[i:i+5] for i in range(0, len(text), 5)])
print(formatted_text)

接着回到U8g2/tools/font/bdfconv,打开命令行输入

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

完成转码后,字库代码会在u8g2_font_unifont.c中,打开后把内容复制一下。 数组长度别忘了,这个也一定要复制。然后U8g2/src/clib/u8g2_fonts.c,找到u8g2_font_unifont_t_chinese1,把刚刚所说的复制进去。 最后我们点亮就可以看到显示中文啦。

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <ESP8266WiFi.h>
#include <NTPClient.h>
#include <U8g2lib.h>
#include <WiFiUdp.h>


#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET    -1

U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, U8X8_PIN_NONE); 

const char* ssid = "Xiaomi13";
const char* password = "1234567878";


WiFiUDP udp;
NTPClient timeClient(udp, "pool.ntp.org", 0, 60000); 

void setup() {
  Serial.begin(9600);
  u8g2.enableUTF8Print();  //开启utf-8文字显示
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to WiFi...");
  }
  Serial.println("Connected to WiFi");
  timeClient.begin();
  timeClient.setTimeOffset(3600*8); 
  u8g2.begin();
  u8g2.clearBuffer();
}

void loop() {
  timeClient.update();
  String currentTime = timeClient.getFormattedTime();
  u8g2.clearBuffer();
  do{
    u8g2.setFont(u8g2_font_unifont_t_chinese1); 
    u8g2.setCursor(0, 15);
    u8g2.print("当前时间:");
    u8g2.setFont(u8g2_font_6x12_tr);
    u8g2.setCursor(0,30);
    u8g2.print(currentTime.c_str());
  }while(u8g2.nextPage());
  u8g2.sendBuffer();

  delay(1000);
}

大功告成!