ESP32—Aduino驱动oled示例代码讲解

d1ffdec7e17348fab2e19efb89e47229.jpg

 首先,下载好ssd1306库(注意是两者通用的,不要直接下载前边的,当然下载了也无所谓)找到esp32和esp8266通用的库,然后在文件>示例>未定义示例>ESP8266 and ESP32 OLED

diver for SSD1306 displays>SSD1306 SimpleDemo打开,如下图所示

af6136b4064146678bab59df5c7a5158.png

 打开后,更改第54行的代码,取消注释,写入数据和时钟引脚,注意SDA是21号数据引脚,SCL是22号时钟引脚,与oled显示屏的对应引脚相连接。

a41a3d20ef7f4812ac2653b8c3d659e3.jpeg

 为方便读者理解,我把更改后可直接驱动的代码放下边,读者也可打开自行更改。

#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"。

}

 

// 其他演示

 882844f051284e3a9be5a67123761f42.jpg

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值