第三章:ESP32零基础教学 - 3.1 IIC通信

1. I2C通信简介

1.1 什么是I2C?

I2C(Inter-Integrated Circuit)是一种串行通信协议,由飞利浦公司在1982年开发,用于连接低速设备。它只需要两根线:SCL(Serial Clock Line,时钟线)和SDA(Serial Data Line,数据线),因此非常适合在电路板上进行短距离通信。

1.2 主从设备

I2C通信涉及两种设备:主设备从设备

  • 主设备:负责发起通信和生成时钟信号。通常,主设备是微控制器(如ESP32)。
  • 从设备:响应主设备的请求。例如,传感器、OLED屏幕等都可以是从设备。

1.3 SCL和SDA

  • SCL:时钟线,由主设备控制,用于同步数据传输。
  • SDA:数据线,用于双向传输数据。

2. ESP32的I2C函数

ESP32通过Wire库来支持I2C通信。以下是常用的I2C函数:

2.1 Wire.begin()

用于初始化I2C通信。ESP32既可以作为主设备,也可以作为从设备。

Wire.begin(); // 作为主设备
Wire.begin(address); // 作为从设备,address是从设备地址

2.2 Wire.beginTransmission(address)

开始向指定地址的从设备传输数据。

Wire.beginTransmission(0x3C); // 例如,OLED屏幕的地址为0x3C

2.3 Wire.write(data)

向从设备发送数据。

Wire.write(0x00); // 发送一个字节的数据

2.4 Wire.endTransmission()

结束数据传输。

Wire.endTransmission();

2.5 Wire.requestFrom(address, quantity)

从指定地址的从设备请求数据。

Wire.requestFrom(0x48, 2); // 从地址为0x48的设备请求2个字节的数据

2.6 Wire.read()

读取从设备返回的数据。

int data = Wire.read(); // 读取一个字节的数据

2.7 Wire.available()

检查是否有数据可读。

if (Wire.available()) {
    int data = Wire.read();
}

3. I2C应用示例

3.1 连接OLED屏幕

OLED屏幕通常通过I2C协议与ESP32通信。以下是一个简单的示例,显示“Hello World!”:

#include 
#include 
#include 

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

void setup() {
  Wire.begin();
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // OLED地址通常为0x3C

  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0, 0);
  display.println("Hello World!");
  display.display();
}

void loop() {
  // 空循环
}

3.2 读取传感器数据

假设我们有一个I2C温度传感器(如LM75),我们可以通过以下代码读取温度数据:

#include 

#define LM75_ADDRESS 0x48

void setup() {
  Serial.begin(9600);
  Wire.begin();
}

void loop() {
  Wire.beginTransmission(LM75_ADDRESS);
  Wire.write(0x00); // 温度寄存器地址
  Wire.endTransmission();

  Wire.requestFrom(LM75_ADDRESS, 2); // 读取2个字节的温度数据
  if (Wire.available()) {
    int temp = Wire.read() << 8 | Wire.read();
    float temperature = temp / 256.0;
    Serial.print("Temperature: ");
    Serial.println(temperature);
  }
  delay(1000);
}

4. 总结

通过本博客,你应该已经了解了I2C通信的基本原理、ESP32的I2C函数以及如何使用I2C连接OLED屏幕和读取传感器数据。希望这些内容能帮助你更好地使用ESP32进行I2C通信。

如果有任何问题,欢迎在评论区留言,我会尽力解答!

你可能感兴趣的:(ESP32,arduino,单片机,嵌入式硬件,c语言)