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 会冲突。

Customer Reply

淘宝客户简短话术

您好,I2C 模块先不要直接跑复杂库例程,建议先上传 I2C Scanner。UNO/Nano 接线是 VCC、GND、SDA 接 A4、SCL 接 A5,打开串口监视器看能否扫到地址。如果是 LCD1602 / SKU J65,常见地址一般是 0x27 或 0x3F,但以实际扫描结果为准;只亮背光或显示一排黑块时,还要调模块背面的对比度电位器。如果扫不到,请先检查供电、GND、SDA/SCL 是否接反、模块电压是否匹配、线是否太长或接触不良。扫到地址后,再把库例程里的地址改成扫描出来的地址。

不要一上来判断模块坏

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 相关示例。

打开资料