下面是两个 Arduino Uno 使用 I2C 进行双向通信 的完整代码包,包括:
- 主机(Master)定时向从机发送数据;
- 从机(Slave)接收主机数据并回应一段数据;
- 主机再从从机读取回应数据。
🧠 功能说明
- 主机每秒发送一次字符串
"Hello"
; - 从机收到后打印内容;
- 主机紧接着从从机请求数据,从机回应
"World"
。
✅ 主机(Master)代码
// Master - Arduino Uno
#include <Wire.h>
void setup() {
Wire.begin(); // 初始化为主机
Serial.begin(9600);
}
void loop() {
// 1. 向从机发送数据
Wire.beginTransmission(8); // 从机地址是 8
Wire.write("Hello"); // 发送数据
Wire.endTransmission();
Serial.println("发送给从机: Hello");
delay(500);
// 2. 从从机读取回应
Wire.requestFrom(8, 6); // 请求 6 字节数据
Serial.print("从机回应: ");
while (Wire.available()) {
char c = Wire.read();
Serial.print(c);
}
Serial.println();
delay(1000);
}
✅ 从机(Slave)代码
// Slave - Arduino Uno
#include <Wire.h>
void setup() {
Wire.begin(8); // 设为从机,地址为 8
Wire.onReceive(receiveEvent); // 注册接收事件
Wire.onRequest(requestEvent); // 注册主机请求事件
Serial.begin(9600);
}
void loop() {
delay(100); // 主循环可以不做事
}
// 接收到主机数据时调用
void receiveEvent(int howMany) {
Serial.print("收到主机数据: ");
while (Wire.available()) {
char c = Wire.read();
Serial.print(c);
}
Serial.println();
}
// 主机请求数据时调用
void requestEvent() {
Wire.write("World"); // 返回数据给主机
}
🔌 硬件连接图(Arduino Uno ←→ Arduino Uno)
主机引脚 | 从机引脚 |
---|---|
A4 (SDA) | A4 (SDA) |
A5 (SCL) | A5 (SCL) |
GND | GND |
建议加上拉电阻(4.7kΩ)从 A4 和 A5 拉到 5V。