ESP32 驱动 0.96 寸 OLED 显示文字 + 实时时间(附完整代码 + 踩坑修复)
作为一个刚入门esp32的新手,做第一个关于esp32的实验困难重重,要么就是函数忘了,要么就是大小写忘了,道路还非常长。废话不多说,这次我做了一实验,是关于ESP32 驱动 0.96 寸 OLED 显示文字 + 实时时间的一个简单实验(话说简单,但也费了我不少时间),接下来就简单讲讲我的“历程”吧!
一.实验目的
为了解决OLED 显示文字 和 实时时间的显示。
二.实验前的准备
硬件:esp32开发板,0.96寸OLED,杜邦线4根(我用的是公对公的),USB线,面包板(新手最好用一下)
软件:ESP-IDF(也可以是Arduino,新手用这个有好一点)
三.实验知识
要做成这个实验,那肯定是要掌握对应的点,不然,云里雾里。
1.OLED
这个物件的引脚分为GND,VCC,SDA(可以想做data),SCL(可以想做clock),GND,VCC,不用多说,一个接地的,一个是类似于电源输出,重点了解,SDA,SCL------首先,对于他们两,如果不改原始数据的话,二者默认对应21,22,当然,你不想记也可以,可以自己设置想用的esp32的其他GPIO,函数为Wire,begin(SDA_GPIO,SCL_GPIO);
2.复位引脚规则
简单说就是,是不是用硬件复位,是不是用软件复位
3.OLED的地址
OLED的地址非常重要,是esp32找到它的依据(大部分应该是0x3c)
4.接线思路
我认为可以将这个整体分为两部分:1.对话部分(esp32和OLED形成可以交流的情况)2.电源部分(esp32给OLED电源通路)
a.对话部分
对话部分,顾名思义,就是让esp32和OLED形成朋友关系,假如,朋友都不是,你就压根就讲不上话(代码的信息过不来),所以我认为这部分该这么接:
esp32_GPIO21------SDA; esp32_GPIO22---------SCL;
b.电源部分
电源部分,用大白话说,就是让OLED有能量。所以我认为这部分该这么接:
ESP32_VCC--------OLED_VCC, OLED_GND--------ESP32_GND
(其他我感觉就没那么重要了)
四.实验代码
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define screen_height 64
#define screen_width 128
#define OLED_reset -1
#define OLED_position 0x3c
Adafruit_SSD1306 display(screen_width,screen_height,&Wire,OLED_reset);
unsigned long previousmillis=0;
int hour=0;
int minute=0;
int second=0;
void setup(){
Wire.begin(21,23);
Serial.begin(115200);
if(!display.begin(SSD1306_SWITCHCAPVCC,OLED_position)){
Serial.println("初始化失败");
for(;;);
}
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0,0);
}
void loop(){
unsigned long currentmillis=millis();
if(currentmillis-previousmillis>=1000){
previousmillis=currentmillis;
second++;
if(second>=60){
second=0;
minute++;
if(minute>=60){
minute=0;
hour++;
if(hour>=24){
hour=0;
}
}
}
}
display.clearDisplay();
display.setTextSize(2);
display.setCursor(10,10);
display.print("ESP32");
display.setTextSize(1);
display.setCursor(30,30);
display.printf("%02d:%02d:%02d",hour,minute,second);
display.display();
}
(代码水平一般,见谅)
我认为很有价值的知识
1.函数
display.clearDisplay() 清屏;
display.setTextColor() 颜色;
display.setTextSize() 大小;
Serial.print() 串口打印(在串口监视);
dispaly.setCursor() 初始位置;
display.display() 展示出来;
2.代码逻辑
简单说,就是通过不断的loop函数,每过一秒,就是second++,接下来就是简易的逻辑部分(不过多赘述)。
重点讲讲,就是
if(!display.begin(SSD1306_SWITCHCAPVCC,OLED_position)){
Serial.println("初始化失败");
for(;;);
}
看似平平无奇,实则还是有点用的。
假设你不小心把 OLED 的 SCL 引脚接成了 ESP32 的 24 号脚(不是代码里的 23):
- 上传代码后,串口监视器会立刻显示 “初始化失败”;
- 程序卡死,不会执行后面的时间更新、显示代码;
- 你看到提示后,第一时间检查接线,发现 SCL 接错,改回 23 号脚,问题解决;
- 若没有这段代码,你只会看到屏幕黑屏,可能会反复修改
printf格式、时间逻辑,浪费大量时间。
五.实验结果图片

六.遇到的问题与解决
1. 大小写问题
比如,`Wire.begin()`被写成`wire.begin()`,导致编译报错“'wire' was not declared in this scope”。
解决:严格遵循库的命名规范,使用首字母大写的`Wire`对象。
2. 对`&Wire`和OLED地址的误解
误以为两者是同一概念,实际上`&Wire`是I2C通信通道的引用,OLED地址(0x3C)是总线上的设备标识。
解决:明确分工——通道负责传输数据,地址负责定位设备。
这次的实验报告就到这了,如果你看到了这里,真是相当感谢!
更多推荐

所有评论(0)