11 OLED 屏幕-Adafruit_SSD1306 库

本文详细介绍了如何使用ESP32控制128x64OLEDSSD1306屏幕,包括电路连接、库的安装、基本操作函数如显示像素、绘制图形和进度条的实现。通过示例代码展示了如何在ArduinoIDE和VSCode中使用PlatformIO进行开发。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章作者:里海
来源网站:ESP32专栏


简介

    这是 0.96 寸的 SSD1306 芯片驱动的 OLED 屏幕。他的分辨率是 128*64,横有 128 个像素点,纵向有 64 个。
OLED 显示屏模块接口定义:

  1. GND:接地引脚
  2. VCC:电源正(3.3~5V)。
  3. D0:OLED 的 D0 脚,在 SPI 通信中为时钟管脚。
  4. D1:OLED 的 D1 脚,在 SPI 通信中为数据管脚。
  5. RES:OLED 的 RES 脚,用来复位(低电平复位)。
  6. DC:数据和命令控制管脚。
  7. CS:片选管脚。

在这里插入图片描述

电路

在这里插入图片描述

使用 Adafruit_SSD1306 库

下载支持库

先下载这两个第三方库,PlatformIO 已经为我们提供了方便的下载途径,我们可以直接在 PlatformIO 的 PIO HOME 页面中选择 Libraries 中分别搜索 Adafruit GFX Library 与 Adafruit_SSD1306,然后添加到项目中
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
platformio.ini文件中出现了添加的这两个库

[env:esp32dev]
platform = espressif32
board = esp32dev
framework = arduino
lib_deps = 
	adafruit/Adafruit GFX Library@^1.11.9
	adafruit/Adafruit SSD1306@^2.5.9

屏幕矩阵

在这里插入图片描述

使用 Adafruit_SSD1306 库的三个步骤

  1. 初始化 OLED,调用构造函数,调用 begin 方法;
  2. 初始化成功后,调用绘制类函数,当然可以设置颜色、字体等绘制完毕;
  3. 调用显示类函数 display。

Adafruit_SSD1306 库中的常用函数

  1. clearDisplay:清除显示,该方法仅清除 Arduino 缓存,不会立即显示在屏幕上,可以通过调用 display 来立即清除;
  2. display:显示内容,这个方法才是真正把绘制内容画在 OLED 屏幕上(非常重要);
  3. drawCircle:绘制空心圆;
  4. fillCircle:绘制实心圆;
  5. drawTriangle:绘制空心三角形;
  6. fillTriangle:绘制实心三角形;
  7. drawRoundRect:绘制空心圆角方形;
  8. fillRoundRect:绘制实心圆角方形;
  9. drawBitmap:绘制 Bitmap 图形;
  10. drawXBitmap:绘制 XBitmap 图形;
  11. drawChar:绘制单个字符;
  12. getTextBounds:计算字符串在当前字体大小下的像素大小,返回左上角坐标以及宽度高度像素值;
  13. setTextSize:设置字体大小;
  14. setFont:设置字体;
  15. setCursor:设置光标位置;
  16. setTextColor:设置字体颜色;
  17. setTextWrap:设置是否自动换行;
  18. drawPixel:绘制像素点;
  19. drawFastHLine:绘制水平线;
  20. drawFastVLine:绘制垂直线;
  21. startscrollright:滚动到右边;
  22. startscrollleft:滚动到左边;
  23. startscrolldiagright:沿着对角线滚动到右边;
  24. startscrolldiagleft:沿着对角线滚动到左边;
  25. stopscroll:停止滚动:

著作权归极客侠 GeeksMan所有
基于GPL 3.0协议
原文链接:https://docs.geeksman.com/esp32/Arduino/14.esp32-arduino-spi.html

点亮像素点

在这里插入图片描述

#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED 显示屏宽度
#define SCREEN_HEIGHT 64 // OLED 显示屏高度

// 软件SPI总线
#define OLED_MOSI 13
#define OLED_CLK 18
#define OLED_DC 2
#define OLED_CS 4
#define OLED_RESET 15
Adafruit_SSD1306 oled(SCREEN_WIDTH, SCREEN_HEIGHT,
                      OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);

void setup()
{
  oled.begin();
  oled.clearDisplay();                          
  oled.drawPixel(10,10,SSD1306_WHITE);
  oled.display();                               
}

void loop()
{
}

点亮所有像素

在这里插入图片描述
在这里插入图片描述

#include <Arduino.h>

#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED 显示屏宽度
#define SCREEN_HEIGHT 64 // OLED 显示屏高度

// 软件SPI总线
#define OLED_MOSI 13
#define OLED_CLK 18
#define OLED_DC 2
#define OLED_CS 4
#define OLED_RESET 15
Adafruit_SSD1306 oled(SCREEN_WIDTH, SCREEN_HEIGHT,
                      OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);

void setup()
{
  oled.begin();
  oled.clearDisplay();
  for (int y = 0; y < 64; y++)
    oled.drawFastHLine(0, y, 128, SSD1306_INVERSE);
  oled.display();
}

void loop()
{
}

显示水平边界线

在这里插入图片描述

#include <Arduino.h>

#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED 显示屏宽度
#define SCREEN_HEIGHT 64 // OLED 显示屏高度

// 软件SPI总线
#define OLED_MOSI 13
#define OLED_CLK 18
#define OLED_DC 2
#define OLED_CS 4
#define OLED_RESET 15
Adafruit_SSD1306 oled(SCREEN_WIDTH, SCREEN_HEIGHT,
                      OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);

void setup()
{
  oled.begin();
  oled.clearDisplay();
  oled.drawFastHLine(0, 0, 128, SSD1306_INVERSE);
  oled.drawFastHLine(0, 15, 128, SSD1306_INVERSE);
  oled.drawFastHLine(0, 16, 128, SSD1306_INVERSE);
  oled.drawFastHLine(0, 63, 128, SSD1306_INVERSE);
  oled.display();   
}

void loop()
{
} 

显示边界线

在这里插入图片描述

#include <Arduino.h>

#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED 显示屏宽度
#define SCREEN_HEIGHT 64 // OLED 显示屏高度

// 软件SPI总线
#define OLED_MOSI 13
#define OLED_CLK 18
#define OLED_DC 2
#define OLED_CS 4
#define OLED_RESET 15
Adafruit_SSD1306 oled(SCREEN_WIDTH, SCREEN_HEIGHT,
                      OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);

void setup()
{
  oled.begin();
  oled.clearDisplay();
  
  oled.drawFastHLine(0, 0, 128, SSD1306_INVERSE);
  oled.drawFastHLine(0, 15, 128, SSD1306_INVERSE);
  oled.drawFastHLine(0, 16, 128, SSD1306_INVERSE);
  oled.drawFastHLine(0, 63, 128, SSD1306_INVERSE);

  oled.drawLine(0, 0, 0, 63, SSD1306_WHITE); 
  oled.drawLine(127, 0, 127, 63, SSD1306_WHITE); 

  oled.display();
}

void loop()
{
}

绘制虚线

在这里插入图片描述

void setup()
{
  oled.begin();
  oled.clearDisplay();
  oled.drawFastHLine(0, 0, 128, SSD1306_WHITE);
  for(int i=0;i<128;i=i+10)
     oled.drawFastHLine(i, 0, 5, SSD1306_BLACK);
  oled.display();
}

绘制矩形

在这里插入图片描述

void setup()
{
  oled.begin();
  oled.clearDisplay();

  // 绘制矩形
  oled.drawRect(5, 5, 10, 25, SSD1306_WHITE);
  // 绘制实心矩形
  oled.fillRect(75, 5, 10, 30, SSD1306_WHITE);

  oled.display();
}

显示字符串

在这里插入图片描述

void setup()
{
  oled.begin();
  oled.clearDisplay();                          
  
  oled.setCursor(5, 50); 
  oled.setTextSize(1.5); 
  oled.setTextColor(WHITE);
  oled.println("HelloWorld"); 

  oled.display();                               
}

在这里插入图片描述

void setup()
{
  oled.begin();
  oled.clearDisplay();                          
  
  oled.setCursor(1, 50);  
  oled.setTextSize(2);  
  oled.setTextColor(WHITE);
  oled.println("里海"); 

  oled.display();                               
}

显示进度条

在这里插入图片描述

#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED 显示屏宽度
#define SCREEN_HEIGHT 64 // OLED 显示屏高度

// 软件SPI总线
#define OLED_MOSI 13
#define OLED_CLK 18
#define OLED_DC 2
#define OLED_CS 4
#define OLED_RESET 15
Adafruit_SSD1306 oled(SCREEN_WIDTH, SCREEN_HEIGHT,
                      OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);

// 初始化进度条变量
int progress = 0;

void setup()
{
  oled.begin();
  oled.setTextSize(2);              // 设置字体大小
  oled.setTextColor(SSD1306_WHITE); // 设置文本颜色
  oled.display();                   // 显示内容
}

void loop()
{
  // 清空屏幕
  oled.clearDisplay();

  // 设置光标位置
  oled.setCursor(25, 50);
  // 显示文字
  oled.println("Process");

  // 显示进度条边框
  oled.drawRoundRect(0, 20, 128, 20, 5, SSD1306_WHITE);
  // 显示进度
  oled.fillRoundRect(5, 25, progress, 10, 2, SSD1306_WHITE);

  // 进度递增
  if (progress < 118)
  {
    progress++;
  }
  else
  {
    progress = 0;
  }

  // 刷新屏幕
  oled.display();

  delay(60); // 延迟一段时间后更新显示
}

显示彩蛋

在这里插入图片描述

#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED 显示屏宽度
#define SCREEN_HEIGHT 64 // OLED 显示屏高度

// 软件SPI总线
#define OLED_MOSI 13
#define OLED_CLK 18
#define OLED_DC 2
#define OLED_CS 4
#define OLED_RESET 15
Adafruit_SSD1306 oled(SCREEN_WIDTH, SCREEN_HEIGHT,
                      OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);

int progress = 0;

void setup()
{
  oled.begin();
 
  oled.display(); 
}

void loop()
{

}

在这里插入图片描述

什么是ESP32?

ESP32是近几年最受欢迎和最实用的模块之一。除了Wi-Fi模块,该模块还包含蓝牙4.0模块。双核CPU工作频率为80至240 MHz,包含两个Wi-Fi和蓝牙模块以及各种输入和输出引脚, ESP32是物联网项目的理想选择。
在这里插入图片描述

ESP32模块引脚分布

在这里插入图片描述
虽然ESP32的引脚数比常用的处理器少,但在引脚上复用多个功能时不会遇到任何问题。
警告:ESP32引脚的电压电平为3.3伏。如果要将ESP32连接到其他工作电压为5伏的设备,则应使用电平转换器转换电压电平。

  • 电源引脚:该模块有两个电源引脚 5V和3.3V。您可以使用这两个引脚来向其他设备和模块供电。
  • GND引脚:该模块的接地有3个引脚。
  • 启用引脚(EN):该引脚用于启用和禁用模块。引脚为高电平时启用模块,低电平禁用模块。
  • 输入/输出引脚(GPIO):您可以使用32个GPIO引脚与LED、开关和其他输入/输出设备进行通信。
    您可以在内部上拉或下拉这些引脚。
    注意:GPIO6至GPIO11引脚(SCK/CLK,SDO/SD0,SDI/SD1,SHD/SD2,SWP/SD3和SCS/CMD引脚)用于模块内部闪存的SPI通信,我们不建议使用它们。
  • ADC:您可以使用此模块上的16个ADC引脚将模拟电压(某些传感器的输出)转换为数字电压。其中一些转换器连接到内部放大器,能够以高精度测量小电压。
  • DAC:ESP32模块有两个数模转换器,精度为8位。
  • 触摸焊盘:ESP32模块上有10个引脚,对电容变化很敏感。您可以将这些引脚连接到某些焊盘(PCB上的焊盘),并将它们用作触摸开关。
  • SPI:该模块上有两个SPI接口,可用于连接显示屏、SD / microSD存储卡模块、外部闪存等。
  • I2C:SDA和SCL引脚用于I2C通信。
  • 串行通信(UART):该模块上有两个UART串行接口。使用这些引脚,您可以在两个设备之间传输高达5Mbps的信息。 UART0还具有CTS和RTS控制。
  • PWM:几乎所有ESP32输入/输出引脚都可用于PWM(脉冲宽度调制)。使用这些引脚可以控制电机、LED灯的亮度和RGB灯的颜色等。

ESP32模块模式

ESP32芯片有5种模式:

  • 活动模式:在这种模式下,Wi-Fi和蓝牙发射器和接收器的所有部分都是活动的。在这种情况下,电流消耗在80和260mA之间。
  • 调制解调器睡眠模式:处理器仍处于活动状态,但Wi-Fi和蓝牙已禁用。在这种情况下,电流消耗在3到20mA之间。
  • 轻度睡眠模式:主处理器停止工作,但RTC单元和ULP处理器单元仍处于活动状态。电流消耗约为0.8 mA。
  • 深度睡眠模式:只有RTC单元处于活动状态。在这种情况下,Wi-Fi和蓝牙通信的数据存储在RTC的存储器中。在此模式下,电流消耗在10到150μA之间。
  • 休眠模式:除了用于时钟的RTC定时器和连接到RTC的一些I / O引脚外,所有单元均被禁用。 RTC定时器或连接的引脚可以将芯片从此状态唤醒。在这种情况下,电流消耗约为2.5μA。
    有关更多信息,请查看模块数据表。

在Arduino IDE上开发ESP32

《在Arduino IDE上开发ESP32》

在VSCode中使用PlatformIO开发ESP32

《在VSCode中使用PlatformIO开发ESP32》

ESP32技术专栏

ESP32专栏

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王牌飞行员_里海

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值