一、参考
- Adafruit的SSD1306驱动https://blog.csdn.net/tiandiren111/article/details/122019747
- U8G2参考https://blog.csdn.net/qq_40531588/article/details/89515149
二、步骤
-
参考上面链接的大佬,先成功显示
-
我们这里选择Adafruit的U8G2库,不需要用到原始的
-
按照库上面的More info查看使用说明 https://github.com/olikraus/U8g2_for_Adafruit_GFX
-
我这里加载了一中文显示,使用带的字库就OK了,但是只能显示小部分汉字
/* * oled_infor * OLED显示连网信息 */ #include <ESP8266WiFi.h> #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #include <U8g2_for_Adafruit_GFX.h> const char* ssid = "your-ssid";//连接WIFI名(SSID) const char* password = "your-password";//WIFI密码 Adafruit_SSD1306 oled(128, 32, &Wire,-1); U8G2_FOR_ADAFRUIT_GFX u8g2_for_adafruit_gfx; void setup() { oled.begin(SSD1306_SWITCHCAPVCC,0x3C); /* oled.setTextColor(WHITE);//开像素点发光 oled.clearDisplay();//清屏 oled.setTextSize(1); //设置字体大小 oled.setCursor(15, 5);//设置显示位置 oled.println("WiFi Information"); oled.setCursor(2, 20);//设置显示位置 WiFi.begin(ssid,password);//启动网络连接 while (WiFi.status() != WL_CONNECTED)//检测网络是否连接成功 { delay(500); oled.print(".");//设置显示位置 oled.display(); // 开显示 } oled.setTextSize(1);//设置字体大小 oled.setCursor(2, 35);//设置显示位置 oled.println("Connected,IP address:"); oled.println(); oled.println(WiFi.localIP()); oled.display(); // 开显示 */ u8g2_for_adafruit_gfx.begin(oled); } void loop() { oled.clearDisplay(); // clear the graphcis buffer u8g2_for_adafruit_gfx.setFontMode(1); // use u8g2 transparent mode (this is default) u8g2_for_adafruit_gfx.setFontDirection(0); // left to right (this is default) u8g2_for_adafruit_gfx.setForegroundColor(WHITE); // apply Adafruit GFX color u8g2_for_adafruit_gfx.setFont(u8g2_font_wqy12_t_chinese2); // select u8g2 font from here: https://github.com/olikraus/u8g2/wiki/fntlistall u8g2_font_wqy12_t_chinese2 u8g2_for_adafruit_gfx.setCursor(0,16); // start writing at this position u8g2_for_adafruit_gfx.print(("这真的好吗")); //u8g2_for_adafruit_gfx.setCursor(0,32); // start writing at this position //u8g2_for_adafruit_gfx.print(("I'm FC")); // UTF-8 string with german umlaut chars oled.display(); // make everything visible delay(2000); }
三、库漏洞修改
-
对于这个库,可以使用u8g2自带的GBK库
u8g2_font_wqy12_t_gb2312
,但是使用后,会提示out section `.rodata' will not fit in region `dram0_0_seg'
这个编译错误,查看源码后发现,是因为定义数组没有放到 TXT段中导致的…这里直接就丢到Dram了,很不合理
-
所以作出下面的修改 对8266做特殊处理 (这个问题是参考u8g2库做的修改,现在用这个for_adafruit实在是旧…BUG都没修复)
C:\Users\Administrator\Documents\Arduino\libraries\U8g2_for_Adafruit_GFX\src\u8g2_fonts.h
中增加放TXT段,并且加入读取TXT段的函数(必加,否则会死机复位)#if defined(ESP8266) uint8_t u8x8_pgm_read_esp(const uint8_t * addr); /* u8x8_8x8.c */ # define U8X8_FONT_SECTION(name) __attribute__((section(".text." name))) # define u8x8_pgm_read(adr) u8x8_pgm_read_esp(adr) #endif
C:\Users\Administrator\Documents\Arduino\libraries\U8g2_for_Adafruit_GFX\src\U8g2_for_Adafruit_GFX.cpp
中增加#if defined(ESP8266) uint8_t u8x8_pgm_read_esp(const uint8_t * addr) { uint32_t bytes; bytes = *(uint32_t*)((uint32_t)addr & ~3); return ((uint8_t*)&bytes)[(uint32_t)addr & 3]; } #endif