ESP32驱动0.96寸OLED(vscode搭载platformIO环境)

软件程序设计

如果想要使用 Arduino 控制 SSD1306 驱动的 OLED 屏幕,有以下两种第三方库可以使用:

  • Adafruit_SSD1306库:专门针对 SSD1306 驱动 OLED 屏幕的显示图形库;
  • U8G2库:目前 Arduino平台上使用最广泛的 OLED 库。

本篇文章主要学习调用 Adafruit_SSD1306库, U8G2库,使用软硬件SPI协议驱动7针脚OLED显示屏,以及软硬件IIC协议驱动4针脚OLED显示屏。
​​​​​​​​​​esp32引脚定义

Adafruit_SSD1306 控制 OLED 屏幕

想要使用 Adafruit_SSD1306,还需要安装 Adafruit_GFX 第三方库。Arduino 的 Adafruit_GFX库为我们所有的 LCD 和 OLED 显示器提供了通用语法和图形功能集,也就是说这是一个通用图形库,并不针对特定的显示器型号。

  • Adafruit_GFX 定义了一系列的绘画方法(线,矩形,圆等等),属于基础类,并且最重要的一点,drawPixel 方法由子类来实现;
  • Adafruit_SSD1306 定义了一系列跟 SSD1306 有关的方法,并且重写了 drawPixel 方法,属于扩展类。

一、 SPI 协议驱动 OLED 液晶屏幕

1. 软件SPI驱动OLED

a. 硬件电路搭建
引脚连接ESP32OLED
1GNDGND
2VCCVCC
3D18(自定义)SCK(SCL)
4D13(自定义)SDA(MOSI)
5D15RES
6D2DC
7D4CS
b. 软件程序
#include <Arduino.h>
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define WIDTH   128   // OLED display width, in pixels
#define HEIGHT  64    // OLED display height, in pixels
// 软件 SPI 总线
// Declaration for SSD1306 display connected using software SPI (default case):
#define OLED_SCK  18
#define OLED_SDA  13
#define OLED_RES  15
#define OLED_DC   2
#define OLED_CS   4

// 构造对象
Adafruit_SSD1306  OLED(WIDTH, HEIGHT, OLED_SDA, OLED_SCK, OLED_DC, OLED_RES, OLED_CS);

void setup() {
  // OLED初始化
  OLED.begin();
  // OLED清除显示
  OLED.clearDisplay();
  // 设置光标位置
  OLED.setCursor(1, 1);
  // 设置文本颜色
  OLED.setTextColor(SSD1306_WHITE);
  // 设置字体大小
  OLED.setTextSize(2);
  // 显示字符
  OLED.println("HelloWorld");

  // 显示内容
  OLED.display();
}

void loop() {
  // put your main code here, to run repeatedly:
}
c. 显示结果

2. 硬件SPI驱动OLED

a. 硬件电路搭建
引脚连接ESP32OLED
1GNDGND
2VCCVCC
3D18SCK(SCL)
4D23SDA(MOSI)
5D15RES
6D2DC
7D4CS
b. 软件程序
#include <Arduino.h>
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define WIDTH      128
#define HEIGHT     64
#define OLED_DC    2
#define OLED_CS    4
#define OLED_RESET 15
Adafruit_SSD1306 OLED(WIDTH, HEIGHT, &SPI, OLED_DC, OLED_RESET, OLED_CS);

void setup() {
  // OLED初始化
  OLED.begin();
  // OLED清除显示
  OLED.clearDisplay();
  // 设置光标位置
  OLED.setCursor(1, 1);
  // 设置文本颜色
  OLED.setTextColor(SSD1306_WHITE);
  // 设置字体大小
  OLED.setTextSize(2);
  // 显示字符
  OLED.println("HelloWorld");

  // 显示内容
  OLED.display();
}

void loop() {
  // put your main code here, to run repeatedly:
}
c. 显示结果

在这里插入图片描述

注:硬件SPI驱动OLED时,使用硬件SPI默认为ESP32的VSPI,使用到的引脚为GPIO18(VSPICLK)GPIO23(VSPI MOSI),如果想使用HSPI的GPIO14(HSPI CLK)GPIO13(HSPIMOSI)驱动OLED需要修改SPI.cpp文件的程序末尾,将代码第348行括号中的VSPI改为HSPI即可。
在这里插入图片描述

修改之后的显示结果为:
在这里插入图片描述

关于ESP的硬件SPI、HSPI和VSPI的区别:
ESP32的HSPI和VSPI区别 - 盛世芳华 - 博客园 (cnblogs.com)

二、 IIC 协议驱动 OLED 液晶屏幕

硬件IIC驱动OLED

a. 硬件电路搭建
引脚连接ESP32OLED
1GNDGND
2VCCVCC
3D22SCK(SCL)
4D21SDA(MOSI)
b. 软件程序
#include <Arduino.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH      128   // OLED display width, in pixels
#define SCREEN_HEIGHT     64    // OLED display height, in pixels
#define OLED_RESET        -1    // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS    0x3C  ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32

// 构造对象 连接到I2C(SDA、SCL引脚)的SSD1306声明
Adafruit_SSD1306 OLED(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

void setup() {
  // OLED初始化
  OLED.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS);
  // OLED清除显示
  OLED.clearDisplay();
  // OLED设置光标位置
  OLED.setCursor(1, 1);
  // 设置字体颜色
  OLED.setTextColor(SSD1306_WHITE);
  // 显示字符串内容
  OLED.println("Hello, world!");

  OLED.display();
}

void loop() {
  // put your main code here, to run repeatedly:
}
c. 显示结果

在这里插入图片描述

注:如果OLED 显示屏未显示任何内容:

  • 检查 OLED 显示屏是否正确连接到 ESP32
  • 仔细检查 OLED 显示屏 I2C 地址:OLED 连接到 ESP32 时,上传此代码并检查串行监视器中的 I2C 地址

如有必要,应更改以下行中的 OLED 地址。在我们的案例中,地址0x3C
通过运行 I2C 扫描仪草图来查找 OLED 地址,使用以下程序进行扫描即可。

/*********
  Rui Santos
  Complete project details at https://randomnerdtutorials.com  
*********/

#include <Wire.h>
 
void setup() {
  Wire.begin();
  Serial.begin(115200);
  Serial.println("\nI2C Scanner");
}
 
void loop() {
  byte error, address;
  int nDevices;
  Serial.println("Scanning...");
  nDevices = 0;
  for(address = 1; address < 127; address++ ) {
    Wire.beginTransmission(address);
    error = Wire.endTransmission();
    if (error == 0) {
      Serial.print("I2C device found at address 0x");
      if (address<16) {
        Serial.print("0");
      }
      Serial.println(address,HEX);
      nDevices++;
    }
    else if (error==4) {
      Serial.print("Unknow error at address 0x");
      if (address<16) {
        Serial.print("0");
      }
      Serial.println(address,HEX);
    }    
  }
  if (nDevices == 0) {
    Serial.println("No I2C devices found\n");
  }
  else {
    Serial.println("done\n");
  }
  delay(5000);          
}

查询到的IIC地址为0x3c
在这里插入图片描述

U8G2库控制OLED

为什么使用U8g2库?

  • 平台支持性好,兼容多款开发板如ESP32、ESP8266、Arduino Uno等;
  • 显示控制器支持性好,基本市面上的OLED都完美支持;
  • API众多,特别支持了中文,支持了不同字体。

构造方法的名字有一定的规律

  • U8G2_屏幕芯片_屏幕尺寸_缓存大小_总线

因为 U8G2 库兼容很多版本的驱动以及不同尺寸的 OLED,所以 U8G2 构造方法有很多,但是我们需要根据我们自己的 OLED 的型号,选择适合我们的构造方法。打开 U8g2lib.h 文件,找到构造器的位置。可以通过搜索:U8G2_SSD1306_128X64进行查找相应的构造方法。
在这里插入图片描述

以下是7针脚SPI协议驱动OLED设备的构造器

U8G2_SSD1306_128X64_NONAME_1_4W_SW_SPI
U8G2_SSD1306_128X64_NONAME_2_4W_SW_SPI
U8G2_SSD1306_128X64_NONAME_F_4W_SW_SPI

U8g2 支持以下两种绘制模式:

Full screen buffer mode,全屏缓存模式;
Page mode,分页模式;

本篇博客使用全屏缓存模式实现OLED的驱动显示功能。

全屏缓存模式使用步骤:

  • 构造对象,根据 OLED 的型号选择对应的构造器,构造器必须带 F;
  • 初始化对象,使用 begin() 方法,清除缓冲区内容,使用 u8g2.clearBuffer()
  • 绘制内容,使用绘制函数或者设置字体等;
  • 发送缓冲区的内容到显示器u8g2.sendBuffer()

一、SPI协议驱动OLED液晶屏幕

1. 软件SPI驱动OLED

a. 硬件电路搭建
b. 软件程序
#include <Arduino.h>
#include <U8g2lib.h>

#define OLED_SCK  18
#define OLED_SDA  13
#define OLED_RES  15
#define OLED_DC   2
#define OLED_CS   4
// 构造对象
U8G2_SSD1306_128X64_NONAME_F_4W_SW_SPI OLED(U8G2_R0, OLED_SCK, OLED_SDA, OLED_CS, OLED_DC, OLED_RES); // ESP32 Thing, HW I2C with pin remapping

void setup() {
  // 初始化OLED
  OLED.begin();
  // 开启中文字符集支持
  OLED.enableUTF8Print();
  // 设置字体
  OLED.setFont(u8g2_font_wqy12_t_chinese2);
}

void loop() {
 
  // 清除缓存区内容
  OLED.clearBuffer();
  // 绘制内容
  OLED.setCursor(0, 10);
  OLED.print("Hello, world!");

  OLED.setCursor(0, 40);
  OLED.print("你好,世界!");

  // 发送缓存区内容到OLED
  OLED.sendBuffer();

  delay(1000);
}
c. 显示结果

1. 硬件SPI驱动OLED

a. 硬件电路搭建
b. 软件程序
#include <Arduino.h>
#include <U8g2lib.h>

#define OLED_RES  15
#define OLED_DC   2
#define OLED_CS   4
// 构造对象
U8G2_SSD1306_128X64_NONAME_F_4W_HW_SPI OLED(U8G2_R0, OLED_CS, OLED_DC, OLED_RES); // ESP32 Thing, HW I2C with pin remapping

void setup() {
  // 初始化OLED
  OLED.begin();
  // 开启中文字符集支持
  OLED.enableUTF8Print();
  // 设置字体
  OLED.setFont(u8g2_font_wqy12_t_chinese2);
}

void loop() {
 
  // 清除缓存区内容
  OLED.clearBuffer();
  // 绘制内容
  OLED.setCursor(0, 10);
  OLED.print("Hello, world!");

  OLED.setCursor(0, 40);
  OLED.print("你好,世界!");

  // 发送缓存区内容到OLED
  OLED.sendBuffer();

  delay(1000);
}
c. 显示结果

在这里插入图片描述

二、IIC协议驱动OLED液晶屏幕

1. 软件IIC驱动OLED

a. 硬件电路搭建
引脚连接ESP32OLED
1GNDGND
2VCCVCC
3D18(自定义)SCK(SCL)
4D5(自定义)SDA(MOSI)
b. 软件程序
#include <Arduino.h>
#include <U8g2lib.h>

// 自定义CLK和SDA引脚
#define OLED_CLK  18  
#define OLED_SDA  5
// 构造对象
U8G2_SSD1306_128X64_NONAME_F_SW_I2C OLED(U8G2_R0, OLED_CLK, OLED_SDA, U8X8_PIN_NONE);

void setup() {
  // 初始化OLED
  OLED.begin();
  // 开启中文字符集支持
  OLED.enableUTF8Print();
  // 设置字体
  OLED.setFont(u8g2_font_wqy12_t_gb2312);
}

void loop() {
 
  // 清除缓存区内容
  OLED.clearBuffer();
  // 绘制内容
  OLED.setCursor(0, 10);
  OLED.print("Hello, world!");

  OLED.setCursor(0, 30);
  OLED.print("你好,世界!");

  // 发送缓存区内容到OLED
  OLED.sendBuffer();

  delay(1000);
}
c. 显示结果

在这里插入图片描述

2. 硬件IIC驱动OLED

a. 硬件电路搭建
b. 软件程序
#include <Arduino.h>
#include <U8g2lib.h>
// 构造对象
U8G2_SSD1306_128X64_NONAME_F_HW_I2C OLED(U8G2_R0);

void setup() {
  // 初始化OLED
  OLED.begin();
  // 开启中文字符集支持
  OLED.enableUTF8Print();
  // 设置字体
  OLED.setFont(u8g2_font_wqy12_t_gb2312);
}

void loop() {
 
  // 清除缓存区内容
  OLED.clearBuffer();
  // 绘制内容
  OLED.setCursor(0, 10);
  OLED.print("Hello, world!");

  OLED.setCursor(0, 30);
  OLED.print("你好,世界!");

  // 发送缓存区内容到OLED
  OLED.sendBuffer();

  delay(1000);
}
c. 显示结果

在这里插入图片描述

注:

  • 在vscode中使用U8g2库驱动OLED显示中文时,标点符号应尽量用英文字符代替,防止库中没有相应的中文标点;
  • 编译程序时注意vscode开发环境的编码方式,若选用GB2312编码方式,应切换到UTF-8(vscode切换编码方式后,会产生中文乱码现象,这时按下ctrl + z即可恢复文本正常, 且编码方式仍然保留)。

结语

掌握了ESP32驱动OLED基本显示功能之后,就可以拓展学习其他更多的显示效果啦,深入学习OLED显示功能的小伙伴可以参考以下网址。

本篇博客参考了以下资料:

### 使用 MicroPython 驱动 ESP32OLED 屏幕 为了在 ESP32 上使用 MicroPython 控制 OLED 显示屏,需先确保设备已烧录最新版的 MicroPython 固件[^2]。 #### 准备工作 从 MicroPython 官方网站下载适用于 ESP32 的固件文件(.bin),并按照官方指南完成烧录过程。这一步骤至关重要,因为不同版本间的差异可能影响后续功能实现的效果。 #### 连接硬件与初始化 I²C 总线 假设使用的是一块基于 SSD1306 芯片的 128×64 分辨率 OLED 屏幕,并通过 I²C 接口连接至 ESP32,则可以采用如下方式配置: ```python from machine import Pin, SoftI2C i2c = SoftI2C(sda=Pin(4), scl=Pin(5)) ``` 这里选择了 GPIO4 和 GPIO5 分别作为 SDA 及 SCL 数据线接口;实际应用中可根据具体电路设计调整引脚编号[^4]。 #### 导入必要的库并创建显示器对象 接着导入 `ssd1306` 库来操作 OLED 设备实例化一个代表显示屏的对象: ```python from ssd1306 import SSD1306_I2C oled = SSD1306_I2C(width=128, height=64, i2c=i2c) ``` 此命令指定了屏幕宽度为 128 像素、高度为 64 像素,并关联到之前设置好的 I²C 实例上。 #### 加载字体支持中文字符显示 对于想要展示汉字的情况,可以通过加载特定格式(.fon)的字模文件达成目的。注意某些旧版本可能存在兼容性问题,因此建议确认所用固件是否支持该特性或尝试更新至较新版本解决潜在错误[^3]。 ```python try: oled.font_load("GB2312-16.fon") except AttributeError as e: print(f"Font load failed due to {e}") ``` 如果遇到类似 "font_load not defined" 错误提示,可能是由于当前环境不完全适配所致,此时可考虑寻找替代方案或是升级系统软件包以获得更好的体验。 #### 编写测试代码验证效果 最后编写一段简单的程序用于检验上述配置能否正常运作: ```python def test_display(): try: oled.fill(0) # 清除画布背景颜色设为黑色 oled.text("Hello", 0, 10, 1) # 英文消息位于坐标 (0,10),白色前景色 oled.text("你好", 0, 30, 1) # 中文问候语放置于位置 (0,30) oled.show() # 将缓冲区内容刷新到屏幕上呈现出来 except Exception as ex: print(ex) test_display() ``` 这段代码会依次执行清除屏幕、绘制两行文本以及最终展现图像的操作。若有任何异常发生也会被捕获打印出来便于排查故障原因。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值