作为一个刚入门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):

  1. 上传代码后,串口监视器会立刻显示 “初始化失败”;
  2. 程序卡死,不会执行后面的时间更新、显示代码;
  3. 你看到提示后,第一时间检查接线,发现 SCL 接错,改回 23 号脚,问题解决;
  4. 若没有这段代码,你只会看到屏幕黑屏,可能会反复修改printf格式、时间逻辑,浪费大量时间。

五.实验结果图片

六.遇到的问题与解决
1. 大小写问题
   比如,`Wire.begin()`被写成`wire.begin()`,导致编译报错“'wire' was not declared in this scope”。
   解决:严格遵循库的命名规范,使用首字母大写的`Wire`对象。

2. 对`&Wire`和OLED地址的误解
   误以为两者是同一概念,实际上`&Wire`是I2C通信通道的引用,OLED地址(0x3C)是总线上的设备标识。
   解决:明确分工——通道负责传输数据,地址负责定位设备。

这次的实验报告就到这了,如果你看到了这里,真是相当感谢!

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐