本示例将使用ESP32驱动ssd1306,将为你介绍SSD1306,接线方式以及如何使用Adafruit_GFX、u8g2两种模式进行开发SSD1306。

本人踩坑了半天,发现Adafruit_SSD1306并不能驱动器LVGL,其并没有实现关键的setAddrWindow和pushColors函数用于display flushing,因此,对于SSD1306,需要采用的u8g2才能驱动起lvgl开发,关于lvgl的驱动方式,在后续的文章中会更新。

SSD1306

SSD1306是一款128*64像素可以使用IIC驱动的OLED屏幕,当然其也有提供SPI的版本,在这里仅展示IIC的版本,两者的差别仅仅是接线方式不同。

SSD1306 Oled显示模块共有4个引脚,标记为GND, VCC, SCL和SDA。这种Oled显示模块可以使用3.3V到5V轻松上电。这是一个低功耗显示模块,可以很容易地与Arduino板使用5伏,也可以使用3.3V控制板,如ESP8266和ESP32等。

就像Arduino Uno Arduino Nano, Nodemcu ESP8266;ESP32还提供I2C总线。GPIO21是SDA, GPIO22是SCL。在接线方式中引脚都清楚地标记,如下图所示。

使用ESP32的GPIO21和GPIO22引脚可以连接多个支持I2C的设备,没有任何问题,因为每个支持I2C的设备都有一个唯一的地址,可以通过使用下面给出的I2C扫描仪代码找到。

u8g2,Adafruit_GFX都是什么?

首先,u8g2和Adafruit_GFX你可以理解为都是抽象层的图形库,不对接的任何屏幕的驱动。但事实上,u8g2内部是提供了驱动的,并且提供了很多屏幕驱动的解决方案,如U8G2_SSD1306_128X64_xxxx类、U8G2_UC1638_192X96_xxxx类,他们都继承了u8g2这个类,可以理解为,如果你想要开发屏幕驱动,你只要继承这个类实现对应的功能就好了。

而Adafruit_GFX也是同理,Adafruit_SSD1306是其对应ssd1306驱动实现版本。


esp32 驱动lcd7789不显示_引脚

开发准备

硬件准备

  • ESP32
  • SSD1306
  • 4条母对母的杜邦线

esp32 驱动lcd7789不显示_u8g2_02

esp32 驱动lcd7789不显示_ESP32_03

接线方式

ESP32的引脚分布可以查看ESP32-DevKitC V4 入门指南,具体的接线如下所示,对应的引脚连接上即可。


esp32 驱动lcd7789不显示_esp32 驱动lcd7789不显示_04

esp32 驱动lcd7789不显示_esp32 驱动lcd7789不显示_05

开发环境

  • Platformio
  • lvgl v7.11.0 (v8和v7不兼容,需要注意一下,这里我已经导好包了)

esp32 驱动lcd7789不显示_ESP32_06

Adafruit_GFX开发

Adafruit_GFX开发方式需要用到Adafruit_GFX、Adafruit_SSD1306两个库,Adafruit_GFX是一个GUI的图形图,而Adafruit_SSD1306继承了Adafruit_GFX的属性,做了SSD1306的驱动。

Adafruit_GFX库安装

事实上,在platformio中提供了三种第三方库安装方式,第一种是命令行模式,第二种是在PIO Home中下载,第三种是直接拿下载好的第三方库放进lib目录下,本人倾向于使用命令行,但是这里第一种、第二种都演示一下。

  1. 方法1:命令行

在vscode打开Command Paplette(Ctrl + Shift + P),输入platformio: new terminal,进入终端后,输入以下命令。

pio lib install Adafruit_SSD1306

是不是感觉和pip install很像?

success之后就可以直接开始编写代码了。

  1. 方法2:在PIO Home中下载

我们直接在PIO Home中搜索Adafruit_SSD1306就好了,然后下载下来,添加到对应项目下。


esp32 驱动lcd7789不显示_ssd1306_07

运行

在安装完第三方库之后,直接copy PIO Home给出的示例,编译运行一下你的SSD1306是否可以跑,如果SSD1306显示出内容了,那么恭喜你,你已经成功完成第一步!


esp32 驱动lcd7789不显示_esp32 驱动lcd7789不显示_08

u8g2开发

首先先安装对应的u8g2库,直接去PIO Home中搜导入就ok。

下面直接附上代码,详细的开发过程中的一些驱动函数直接看u8g2的官方文档或者参考链接足矣。

PIO Home中的u8g2虽然也有给出示例代码,但是需要改动一些地方,不能直接使用,直接copy以下代码即可。

#include <Arduino.h>
#include <U8g2lib.h>

#include <Wire.h>

# IIC version
U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0,SCL,SDA,U8X8_PIN_NONE);
 
void setup(void) {
  u8g2.begin();
}
 
void loop(void) {
  u8g2.firstPage();
  do {
    u8g2.setFont(u8g2_font_ncenB14_tr);
    u8g2.drawStr(0,24,"Hello World!");
  } while ( u8g2.nextPage() );
}

参考

  • https://www.electroniclinic.com/ -recommend -ssd1306 -esp32 -Adafruit_SSD1306
  • http://www.taichi-maker.com/arduino-oled-application/ -Adafruit_SSD1306
  • https://github.com/adafruit/Adafruit_SSD1306 -Adafruit_SSD1306
  • esp笔记(7)单色OLED(SSD1306) 显示与 u8g2 库的使用 -u8g2 -ssd1306 -csdn
  • 玩转u8g2 OLED库,一篇就够 -u8g2 -ssd1306 -csdn
  • https://github.com/AhmadRoshanfar/port-oled-ssd1306-lvgl-esp32/ -idf