
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 */#includeWire.h// 配置区域 // 请根据你的实际接线修改以下引脚号// 常见 ESP32 开发板: SCL22, SDA21// ESP32-C3 / S3 等可能需要修改为其他引脚 (如 SCL9, SDA8)constintSCL_PIN22;constintSDA_PIN21;// voidsetup(){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 count0;// I2C 地址范围通常是 0x01 到 0x7Ffor(byte address1;address127;address){// 开始传输发送地址Wire.beginTransmission(address);// endTransmission 返回 0 表示设备存在并响应byte errorWire.endTransmission();if(error0){Serial.print(Found device at address: 0x);if(address16)Serial.print(0);Serial.println(address,HEX);// 针对 OLED 的特别提示if(address0x3C){Serial.println( This is likely a standard OLED (Use 0x3C in U8G2));}elseif(address0x3D){Serial.println( This is likely an OLED with alternate address (Use 0x3D in U8G2));}count;}// 稍微延时让总线稳定delay(5);}Serial.println(\n);if(count0){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);}voidloop(){// 不需要循环执行只在 setup 中运行一次// 如果需要持续扫描可以将上面的代码移到这里并添加 delay(2000);delay(10000);}三.如何解读结果运行后观察串口监视器的输出情况 1找到 0x3CFound device at address:0x3CThis is likely a standardOLED(Use0x3Cin U8G2)含义你的屏幕地址是 0x3C。U8G2 设置使用默认的构造函数。// 例如 SSD1306 U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset*/ U8X8_PIN_NONE);(注0x3C 对应的 8位写地址正是你之前问的 0x78)情况 2找到 0x3DFound 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) 并在初始化时尝试传入地址参数视具体库版本而定。情况 3No I2C devices found!SDA 和 SCL 是否接反尝试互换VCC 是否接了 3.3V不要接 5V除非模块有稳压且 ESP32 引脚容忍建议 3.3VGND 是否共地检查引脚号如果你用的是 ESP32-C3, ESP32-S3 或 NodeMCU-32S 等不同型号默认的 21/22 可能不对。请查阅你开发板的引脚图修改代码中的 SCL_PIN 和 SDA_PIN。常见 C3/S3 引脚: SCL9, SDA8 (仅供参考请以实物为准)。常见问题为什么有两个地址 有些 OLED 模块背面有一个电阻焊盘切断或连接它可以切换 0x3C 和 0x3D。扫描到了 0x78 I2C 协议中地址是 7 位的。扫描器显示的是 7 位地址 (0x3C)。0x78 是 0x3C 左移一位并加上写位 (0) 后的 8 位传输字节。U8G2 库内部会自动处理这个移位所以你只需要关注扫描出来的 7位地址 (0x3C)。