两个单片机通过I2C通信

下面是两个 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)
GNDGND

建议加上拉电阻(4.7kΩ)从 A4 和 A5 拉到 5V。

上一篇