Arduino · I2C · Wire

Arduino I2C Scanner 与主从通信资料

用于排查 OLED、LCD1602 I2C 背包、RTC、传感器等 I2C 模块扫不到地址、地址不确定、SDA/SCL 接错、两个 Arduino 主从通信不通的问题。

UNO / Nano A4 = SDA,A5 = SCL
常见地址 0x27 / 0x3F / 0x3C
2信号线
7-bit地址
GND必须共地

资料基于 Arduino Wire 官方文档和常见 I2C 排查经验整理,所有接线图为自绘 SVG。

Conclusion

先看结论

确认:I2C 只需要 SDA、SCL 两根信号线,但必须接 GND,并且电压电平要匹配。UNO/Nano 的 I2C 默认是 A4/A5;Mega、Leonardo、ESP32、STM32 等板子的 SDA/SCL 位置不同,要看板子丝印或资料。

扫不到地址

先查 VCC/GND、SDA/SCL 是否接反、电压是否匹配、模块是否有上拉电阻,再换短线测试。

地址是 7-bit

Arduino Wire 常用 7-bit 地址,例如 OLED 常见 0x3C,LCD1602 I2C 背包常见 0x27 或 0x3F。

LCD1602 / SKU J65

先用 Scanner 扫地址,再把 LiquidCrystal_I2C 里的地址改成扫描结果;只亮背光或一排黑块,通常还要调背面对比度电位器。

多个模块共线

多个 I2C 模块可以共用 SDA/SCL,但地址不能冲突,且总线太长、上拉过强/过弱都会不稳定。

Wiring

Arduino UNO / Nano 接 I2C 模块

自绘无水印示意图。不同模块丝印可能写 VCC/GND/SDA/SCL,也可能写 SCK/SCL,实际以模块说明为准。

Arduino UNO I2C 模块接线图
I2C 模块Arduino UNO / Nano说明
VCC5V 或 3.3V确认:按模块供电范围接,3.3V 模块不要直接接 5V 信号。
GNDGND确认:必须共地。
SDAA4 / SDA确认:数据线。
SCLA5 / SCL确认:时钟线。
ADDR / A0-A2按模块默认待确认:部分模块可通过跳线/焊盘改地址。

I2C Scanner

I2C 地址扫描例程

上传后打开串口监视器,波特率设为 9600。扫到地址后,再把地址填到对应模块库或示例代码里。

#include <Wire.h>

void setup() {
  Wire.begin();
  Serial.begin(9600);
  Serial.println("I2C scanner");
}

void loop() {
  for (byte address = 1; address < 127; address++) {
    Wire.beginTransmission(address);
    byte error = Wire.endTransmission();
    if (error == 0) {
      Serial.print("I2C device found at 0x");
      if (address < 16) Serial.print("0");
      Serial.println(address, HEX);
    }
  }
  delay(3000);
}
下载 Scanner .ino
扫描结果 No I2C devices found

先检查供电、GND、SDA/SCL 是否接反,再确认模块有没有上拉电阻。线太长或杜邦线松动也会扫不到。

扫到地址但库例程不工作

把库例程里的地址改成扫描出来的地址;同时确认模块型号是否匹配,比如 SSD1306 / SH1106、PCF8574 / MCP23017 不要混用。

地址一直跳动或偶尔扫不到

多半是接触不良、上拉不合适、线太长、电源不稳。先用短线只接一个模块测试。

Master / Slave

两个 Arduino I2C 主从通信

一个 Arduino 作为 Master,另一个作为 Slave。SDA 接 SDA,SCL 接 SCL,GND 必须共地。I2C 不是串口 TX/RX,不需要交叉接。

两个 Arduino I2C 主从通信接线图

Master

Master Reader

向地址 0x08 的 Slave 请求 6 字节数据。

下载 Master .ino

Slave

Slave Sender

设置从机地址 0x08,被 Master 请求时返回 hello。

下载 Slave .ino

提醒

地址不要冲突

同一总线上每个从机地址必须不同。两个从机都用 0x08 会冲突。

Support

需要技术支持时,把这几项一起发来

复制下面这段填一下发给客服,我们一次就能定位,不用来回问。

【Arduino I2C Scanner 与主从通信资料 技术支持】
主控型号:            (如 Arduino UNO / ESP32 / STM32)
供电接的是:          □ 3.3V   □ 5V
I2C Scanner 扫到的地址:
串口显示的内容:
用的是哪份代码:      □ 本页示例   □ 其他(请说明)
接线照片:            (请附一张能看清接线的照片)

References

官方资料链接

不使用客户截图、订单、地址或带水印图片。接线图为自绘 SVG。

Arduino

Wire 官方文档

Arduino 官方说明 Wire 库用于 I2C 设备通信,支持 beginTransmission、endTransmission 等函数。

打开资料

Arduino

Wire.endTransmission()

官方函数说明,Scanner 正是通过 endTransmission 返回值判断地址是否有应答。

打开资料

Arduino IDE

Wire 示例

Arduino IDE 常见路径:File > Examples > Wire,可找到 Master/Slave 相关示例。

打开资料