首先,下载好ssd1306库(注意是两者通用的,不要直接下载前边的,当然下载了也无所谓)找到esp32和esp8266通用的库,然后在文件>示例>未定义示例>ESP8266 and ESP32 OLED
diver for SSD1306 displays>SSD1306 SimpleDemo打开,如下图所示
打开后,更改第54行的代码,取消注释,写入数据和时钟引脚,注意SDA是21号数据引脚,SCL是22号时钟引脚,与oled显示屏的对应引脚相连接。
为方便读者理解,我把更改后可直接驱动的代码放下边,读者也可打开自行更改。
#include <Wire.h>
#include "SSD1306Wire.h"
#include "SSD1306.h"
#include "images.h"
SSD1306Wire display(0x3c, 21, 22);
#define DEMO_DURATION 3000
typedef void (*Demo)(void);
int demoMode = 0;
int counter = 1;
void setup() {
Serial.begin(115200);
Serial.println();
Serial.println();
display.init();
display.flipScreenVertically();
display.setFont(ArialMT_Plain_10);
}
void drawFontFaceDemo() {
display.setTextAlignment(TEXT_ALIGN_LEFT);
display.setFont(ArialMT_Plain_10);
display.drawString(0, 0, "Hello world");
display.setFont(ArialMT_Plain_16);
display.drawString(0, 10, "Hello world");
display.setFont(ArialMT_Plain_24);
display.drawString(0, 26, "Hello world");
}
void drawTextFlowDemo() {
display.setFont(ArialMT_Plain_10);
display.setTextAlignment(TEXT_ALIGN_LEFT);
display.drawStringMaxWidth(0, 0, 128,
"Lorem ipsum\n dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore." );
}
void drawTextAlignmentDemo() {
display.setFont(ArialMT_Plain_10);
display.setTextAlignment(TEXT_ALIGN_LEFT);
display.drawString(0, 10, "Left aligned (0,10)");
display.setTextAlignment(TEXT_ALIGN_CENTER);
display.drawString(64, 22, "Center aligned (64,22)"); display.setTextAlignment(TEXT_ALIGN_RIGHT);
display.drawString(128, 33, "Right aligned (128,33)");
}
void drawRectDemo() {
for (int i = 0; i < 10; i++) {
display.setPixel(i, i);
display.setPixel(10 - i, i);
}
display.drawRect(12, 12, 20, 20);
display.fillRect(14, 14, 17, 17);
display.drawHorizontalLine(0, 40, 20);
display.drawVerticalLine(40, 0, 20);
}
void drawCircleDemo() {
for (int i = 1; i < 8; i++) {
display.setColor(WHITE);
display.drawCircle(32, 32, i * 3);
if (i % 2 == 0) {
display.setColor(BLACK);
}
display.fillCircle(96, 32, 32 - i * 3);
}
}
void drawProgressBarDemo() {
int progress = (counter / 5) % 100;
display.drawProgressBar(0, 32, 120, 10, progress);
display.setTextAlignment(TEXT_ALIGN_CENTER);
display.drawString(64, 15, String(progress) + "%");
}
void drawImageDemo() {
display.drawXbm(34, 14, WiFi_Logo_width, WiFi_Logo_height, WiFi_Logo_bits);
}
Demo demos[] = {drawFontFaceDemo, drawTextFlowDemo, drawTextAlignmentDemo, drawRectDemo, drawCircleDemo, drawProgressBarDemo, drawImageDemo};
int demoLength = (sizeof(demos) / sizeof(Demo));
long timeSinceLastModeSwitch = 0;
void loop() {
display.clear();
demos[demoMode]();
display.setFont(ArialMT_Plain_10);
display.setTextAlignment(TEXT_ALIGN_RIGHT);
display.drawString(128, 54, String(millis()));
display.display();
if (millis() - timeSinceLastModeSwitch > DEMO_DURATION) {
demoMode = (demoMode + 1) % demoLength;
timeSinceLastModeSwitch = millis();
}
counter++;
delay(10);
}
以下是代码的详细解释
#include <Wire.h>
// 包含Wire库,用于启用I2C通信。
#include "SSD1306Wire.h"
// 包含SSD1306Wire库,用于通过I2C接口控制SSD1306 OLED显示屏。
#include "SSD1306.h"
// 包含SSD1306库,提供了操作OLED显示屏的函数。
#include "images.h"
// 包含images库,可能包含要在OLED上显示的位图图像。(一个WiFi的logo)
SSD1306Wire display(0x3c, 21, 22);
// 创建一个SSD1306Wire对象,初始化显示屏,I2C地址为0x3c,SDA和SCL引脚分别为21和22。
#define DEMO_DURATION 3000
// 定义一个宏,表示每个演示模式的持续时间(3000毫秒)。
typedef void (*Demo)(void);
// 定义一个函数指针类型Demo,指向没有参数和返回值的函数。
int demoMode = 0;
// 定义一个整型变量demoMode,用于跟踪当前的演示模式。
int counter = 1;
// 定义一个整型变量counter,用于计数。
void setup() {
Serial.begin(115200);
// 初始化串行通信,设置波特率为115200。
Serial.println();
// 在串行监视器上打印一个空行。
Serial.println();
// 在串行监视器上再打印一个空行。
display.init();
// 初始化OLED显示屏。
display.flipScreenVertically();
// 翻转显示屏的垂直方向。
display.setFont(ArialMT_Plain_10);
// 设置默认字体为ArialMT_Plain_10。
}
// 以下是各个演示函数的定义,下面将逐一解释:
void drawFontFaceDemo() {
// ...(见下文)
}
void drawTextFlowDemo() {
// ...(见下文)
}
void drawTextAlignmentDemo() {
// ...(见下文)
}
void drawRectDemo() {
// ...(见下文)
}
void drawCircleDemo() {
// ...(见下文)
}
void drawProgressBarDemo() {
// ...(见下文)
}
void drawImageDemo() {
// ...(见下文)
}
Demo demos[] = {drawFontFaceDemo, drawTextFlowDemo, drawTextAlignmentDemo, drawRectDemo, drawCircleDemo, drawProgressBarDemo, drawImageDemo};
// 创建一个Demo类型的数组,包含指向所有演示函数的指针。
int demoLength = (sizeof(demos) / sizeof(Demo));
// 计算演示函数数组的长度。
long timeSinceLastModeSwitch = 0;
// 定义一个长整型变量,用于记录上次切换演示模式的时间。
void loop() {
display.clear();
// 清除显示屏上的内容。
demos[demoMode]();
// 执行当前演示模式的函数。
display.setFont(ArialMT_Plain_10);
// 设置字体为ArialMT_Plain_10。
display.setTextAlignment(TEXT_ALIGN_RIGHT);
// 设置文本对齐方式为右对齐。
display.drawString(128, 54, String(millis()));
// 在位置(128, 54)绘制当前运行时间的字符串。
display.display();
// 更新显示屏,显示所有绘制的内容。
if (millis() - timeSinceLastModeSwitch > DEMO_DURATION) {
// 如果自上次切换演示模式以来超过演示模式的持续时间:
demoMode = (demoMode + 1) % demoLength;
// 切换到下一个演示模式。
timeSinceLastModeSwitch = millis();
// 更新上次切换演示模式的时间。
}
counter++;
// 增加计数器。
delay(10);
// 程序暂停10毫秒。
}
各个函数的功能解释
void drawFontFaceDemo() {
display.setTextAlignment(TEXT_ALIGN_LEFT);
// 设置文本对齐方式为左对齐。
display.setFont(ArialMT_Plain_10);
// 设置字体为ArialMT_Plain_10。
display.drawString(0, 0, "Hello world");
// 在位置(0, 0)绘制字符串"Hello world"。
display.setFont(ArialMT_Plain_16);
// 设置字体为ArialMT_Plain_16。
display.drawString(0, 10, "Hello world");
// 在位置(0, 10)绘制字符串"Hello world"。
display.setFont(ArialMT_Plain_24);
// 设置字体为ArialMT_Plain_24。
display.drawString(0, 26, "Hello world");
// 在位置(0, 26)绘制字符串"Hello world"。
}
// 其他演示