文章作者:里海
来源网站:ESP32专栏
简介
这是 0.96 寸的 SSD1306 芯片驱动的 OLED 屏幕。他的分辨率是 128*64,横有 128 个像素点,纵向有 64 个。
OLED 显示屏模块接口定义:
- GND:接地引脚
- VCC:电源正(3.3~5V)。
- D0:OLED 的 D0 脚,在 SPI 通信中为时钟管脚。
- D1:OLED 的 D1 脚,在 SPI 通信中为数据管脚。
- RES:OLED 的 RES 脚,用来复位(低电平复位)。
- DC:数据和命令控制管脚。
- 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 库的三个步骤
- 初始化 OLED,调用构造函数,调用 begin 方法;
- 初始化成功后,调用绘制类函数,当然可以设置颜色、字体等绘制完毕;
- 调用显示类函数 display。
Adafruit_SSD1306 库中的常用函数
- clearDisplay:清除显示,该方法仅清除 Arduino 缓存,不会立即显示在屏幕上,可以通过调用 display 来立即清除;
- display:显示内容,这个方法才是真正把绘制内容画在 OLED 屏幕上(非常重要);
- drawCircle:绘制空心圆;
- fillCircle:绘制实心圆;
- drawTriangle:绘制空心三角形;
- fillTriangle:绘制实心三角形;
- drawRoundRect:绘制空心圆角方形;
- fillRoundRect:绘制实心圆角方形;
- drawBitmap:绘制 Bitmap 图形;
- drawXBitmap:绘制 XBitmap 图形;
- drawChar:绘制单个字符;
- getTextBounds:计算字符串在当前字体大小下的像素大小,返回左上角坐标以及宽度高度像素值;
- setTextSize:设置字体大小;
- setFont:设置字体;
- setCursor:设置光标位置;
- setTextColor:设置字体颜色;
- setTextWrap:设置是否自动换行;
- drawPixel:绘制像素点;
- drawFastHLine:绘制水平线;
- drawFastVLine:绘制垂直线;
- startscrollright:滚动到右边;
- startscrollleft:滚动到左边;
- startscrolldiagright:沿着对角线滚动到右边;
- startscrolldiagleft:沿着对角线滚动到左边;
- 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。
有关更多信息,请查看模块数据表。