ESP32IIC地址扫描程序
前言
这是一个专为 ESP32 设计的 I2C 扫描程序。它可以自动检测连接在 ESP32 上的 OLED 屏幕或其他 I2C 设备的地址。
一、 核心功能
自动扫描:扫描所有可能的 I2C 地址 (0x01 - 0x7F)。
显示结果:在串口监视器打印找到的设备地址(十六进制)。
适配 U8G2:直接告诉你应该填 0x3C 还是 0x3D。
二、使用步骤
代码使用方法
打开 Arduino IDE。
复制下方代码并粘贴到新文件中。
修改引脚:根据你的接线,修改 SCL_PIN 和 SDA_PIN (默认是 ESP32 开发板常用的 GPIO 22 和 21,但不同开发板可能不同,如 ESP32-C3/S3 需自定义)。
上传代码。
打开 串口监视器 (波特率 115200),按 ESP32 上的 RST 键或重新上电查看结果。
/*
* ESP32 I2C Scanner
* 用于检测 OLED 屏幕或其他 I2C 设备的地址
*
* 接线说明 (默认):
* ESP32 SCL -> OLED SCL (通常是 GPIO 22)
* ESP32 SDA -> OLED SDA (通常是 GPIO 21)
* ESP32 3.3V -> OLED VCC
* ESP32 GND -> OLED GND
*/
#include <Wire.h>
// ================= 配置区域 =================
// 请根据你的实际接线修改以下引脚号
// 常见 ESP32 开发板: SCL=22, SDA=21
// ESP32-C3 / S3 等可能需要修改为其他引脚 (如 SCL=9, SDA=8)
const int SCL_PIN = 22;
const int SDA_PIN = 21;
// ===========================================
void setup() {
Serial.begin(115200);
while (!Serial); // 等待串口连接 (可选,防止启动太快错过输出)
Serial.println("\n================================");
Serial.println(" ESP32 I2C Scanner Started ");
Serial.println("================================");
Serial.print("Using SCL Pin: ");
Serial.println(SCL_PIN);
Serial.print("Using SDA Pin: ");
Serial.println(SDA_PIN);
// 初始化 Wire 库,指定引脚
Wire.begin(SDA_PIN, SCL_PIN);
Serial.println("\nScanning for I2C devices...\n");
byte count = 0;
// I2C 地址范围通常是 0x01 到 0x7F
for (byte address = 1; address < 127; address++) {
// 开始传输,发送地址
Wire.beginTransmission(address);
// endTransmission 返回 0 表示设备存在并响应
byte error = Wire.endTransmission();
if (error == 0) {
Serial.print("Found device at address: 0x");
if (address < 16) Serial.print("0");
Serial.println(address, HEX);
// 针对 OLED 的特别提示
if (address == 0x3C) {
Serial.println(" >>> This is likely a standard OLED (Use 0x3C in U8G2)");
} else if (address == 0x3D) {
Serial.println(" >>> This is likely an OLED with alternate address (Use 0x3D in U8G2)");
}
count++;
}
// 稍微延时,让总线稳定
delay(5);
}
Serial.println("\n================================");
if (count == 0) {
Serial.println("No I2C devices found!");
Serial.println("Check your wiring (SDA, SCL, VCC, GND).");
Serial.println("Ensure you are using the correct GPIO pins for your ESP32 board.");
} else {
Serial.print("Scan complete. Found ");
Serial.print(count);
Serial.println(" device(s).");
}
Serial.println("================================\n");
}
void loop() {
// 不需要循环执行,只在 setup 中运行一次
// 如果需要持续扫描,可以将上面的代码移到这里并添加 delay(2000);
delay(10000);
}
三.如何解读结果?
运行后,观察串口监视器的输出:
情况 1:找到 0x3C
Found device at address: 0x3C
>>> This is likely a standard OLED (Use 0x3C in U8G2)
含义:你的屏幕地址是 0x3C。
U8G2 设置:使用默认的构造函数。
// 例如 SSD1306
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);``
(注:0x3C 对应的 8位写地址正是你之前问的 0x78)
情况 2:找到 0x3D
Found device at address: 0x3D
>>> This is likely an OLED with alternate address (Use 0x3D in U8G2)
含义:你的屏幕地址是 0x3D。
U8G2 设置:你需要寻找支持 0x3D 的构造函数。
通常类名中会包含 2 或者你需要查阅 U8g2lib.h 找到对应 0x3D 的变体。
如果找不到特定构造函数,部分用户会通过修改底层代码或使用软件模拟 I2C (_SW_I2C) 并在初始化时尝试传入地址参数(视具体库版本而定)。
情况 3:No I2C devices found!
SDA 和 SCL 是否接反?(尝试互换)
VCC 是否接了 3.3V?(不要接 5V,除非模块有稳压且 ESP32 引脚容忍,建议 3.3V)
GND 是否共地?
检查引脚号:
如果你用的是 ESP32-C3, ESP32-S3 或 NodeMCU-32S 等不同型号,默认的 21/22 可能不对。
请查阅你开发板的引脚图,修改代码中的 SCL_PIN 和 SDA_PIN。
常见 C3/S3 引脚: SCL=9, SDA=8 (仅供参考,请以实物为准)。
常见问题
为什么有两个地址? 有些 OLED 模块背面有一个电阻焊盘,切断或连接它可以切换 0x3C 和 0x3D。
扫描到了 0x78? I2C 协议中,地址是 7 位的。扫描器显示的是 7 位地址 (0x3C)。0x78 是 0x3C 左移一位并加上写位 (0) 后的 8 位传输字节。U8G2 库内部会自动处理这个移位,所以你只需要关注扫描出来的 7位地址 (0x3C)。
536

被折叠的 条评论
为什么被折叠?



