ESP32 I2C 通信设置引脚、多设备接口和更改引脚 – 趣讨教

您所在的位置:网站首页 lm399h引脚 ESP32 I2C 通信设置引脚、多设备接口和更改引脚 – 趣讨教

ESP32 I2C 通信设置引脚、多设备接口和更改引脚 – 趣讨教

2024-02-01 15:25| 来源: 网络整理| 查看: 265

释放双眼,带上耳机,听听看~!

在本教程中,我们将学习使用 ESP32  I2C 通信 通道。我们将学习如何使用 ESP32 除了默认 I2C 引脚之外的不同引脚进行 I2C 通信,将不同的 I2C 设备连接到同一总线,以及如何使用两个 I2C 总线接口。此外,我们将 ESP32 与通过 I2C 协议通信的不同传感器和设备连接,并对我们的板进行编程以运行 I2C 扫描仪。该扫描仪将确定与 ESP32 板连接的 I2C 设备的数量。

ESP32 有两个 I2C 总线接口,用于 I2C 通信。用户可以将 ESP32 板配置为 I2C 主设备或 I2C 从设备。

目录

先决条件

我们将使用 Arduino IDE 对 ESP32 开发板进行编程。因此,您应该拥有最新版本的 Arduino IDE。此外,您还需要安装ESP32环境,安装教程可以看如下:

一、ESP32开发环境搭建(arduino) Code_Mouse 18年8月27日 喜欢:2 浏览:11.1k I2C协议介绍

I2C 也称为内部集成电路或 IIC 或 I square C。它是一种用于短距离数据传输应用的 2 线串行通信协议。它是一种异步半双工串行通信协议。此外,它是一种多主总线协议,只需要两条线即可串行传输数据,即SCL和SDA。

SDA(双向数据线) SCL(双向时钟线)

它是嵌入式项目中非常流行的通信协议,用于连接 基于I2C 的传感器、数字显示器和通信模块。想要相互通信的设备通过 I2C 总线进行连接。I2C总线支持多个从设备和多个主设备。

数据沿着导线(SDA 线)逐位串行传输。与SPI一样 ,I2C 是并发的,位的输出通过主设备和从设备之间共享的时钟信号与位的测试同步。

许多传感器使用这种串行通信协议将数据传输到微控制器,或者通过该协议,不同的从属电路能够与主电路进行通信。仅适用于短距离数据传输。

I2C 引脚

I2C over SPI 的显着特点是它仅使用两条线来进行通信。一根线是 SCL(串行时钟线),用于同步设备之间的数据传输,另一根线是 SDA(串行数据),用于承载要传输的实际数据。这些线是开漏线,这意味着如果设备处于低电平有效,则需要将这些线连接到上拉电阻。每个与总线连接的从设备都有一个唯一的8位地址。

注:SDA 线也称为 SDI,SCL 线也称为 SCK。

使用两根线在特定设备之间进行通信是通过每个设备都有自己唯一的设备ID或地址并使用该地址来完成的;master可以选择任何特定的设备进行通信。

例如,我们可以将多个从站连接到一个主站。ESP32 配置为主设备,多个从设备连接在同一总线上。

ESP32 I2C 通信设置引脚、多设备接口和更改引脚

我们还可以连接多个主设备来控制同一个从设备。例如,两个 ESP32 板配置为主设备,与同一个从设备连接。

I2C总线

I2C总线由多个设备组成,例如从设备和主设备。连接到 I2C 总线的每个设备都可以处于主模式或从模式。但只有主设备才能发起数据传输过程。通常,同一 I2C 总线上有一主一从或多个从设备通过上拉电阻连接。每个从地址都有一个 7 位唯一地址。

从属设备

每个从设备都有一个唯一的地址,用于识别总线上的设备。换句话说,从机地址帮助主设备向 总线上的特定从机设备发送信息。

主设备

主设备可以发送和获取信息。从设备会对主设备发送的任何内容做出反应。在总线上发送信息时,一次只能有一个设备发送信息。

简而言之,我们只需要两根线来传输数据或与不同数量的设备进行通信。I2C 允许我们同时连接多个设备。但是,您不能使用此协议进行长距离数据传输。

有关 I2C 通信的更多信息,您可以阅读这篇文章:

I2C总线通讯协议 ESP32 I2C 引脚

如前所述,ESP32 有 2 个 I2C 控制器,可用于处理 I2C 总线上的通信。我们可以配置为主站或从站。现在让我们看看 ESP32 的 Arduino IDE 库中分配给 I2C 控制器的默认 GPIO 引脚。

ESP32 中 SDA 的默认 I2C 引脚为 GPIO21,SCL 的默认 I2C 引脚为 GPIO22。如果我们想更改 GPIO 引脚,我们必须在代码中设置它们。下图显示了 ESP32 的引脚排列,其中显示了默认的 I2C 引脚。

ESP32 I2C 通信设置引脚、多设备接口和更改引脚ESP32 I2C 引脚

ESP32 I2C 接口具有以下特点:

标准模式(100 Kbit/s) 快速模式(400 Kbit/s) 高达 5 MHz,但受 SDA 上拉强度限制 7位/10位寻址模式 双寻址模式 在 ESP32 中使用多个从 I2C 设备(具有不同地址的 I2C 设备)

在本节中,我们将首先使用默认 I2C 引脚将三个不同的 I2C 设备与 ESP32 板连接。然后我们将对我们的板进行编程以运行 I2C 扫描仪。

所需组件

ESP32开发板 SSD1306 OLED显示屏 BME280传感器 MPU6050传感器 面包板 连接线

首先让我们简单介绍一下本指南中将使用的三个 I2C 设备:  SSD1306  OLED、  BME280 和 MPU6050。

SSD1306 0.96英寸OLED显示屏

尽管市场上有多种类型的 OLED 显示屏,但我们将使用 SSD1306 0.96 英寸 OLED 显示屏。所有不同类型的 OLED 显示器的主要组件是 SSD1306 控制器,它使用 I2C 或 SPI 协议与微控制器进行通信。OLED 显示器的尺寸、颜色和形状各不相同,但主要以类似的方式进行编程。

让我们看一下本文中将使用的 OLED 显示屏。它被称为 SSD 1306 0.96 英寸 OLED 显示屏,具有 128×64 像素,仅通过 I2C 协议与 Pi Pico 板进行通信。它价格便宜并且在市场上很容易买到。

ESP32 I2C 通信设置引脚、多设备接口和更改引脚 BME280

BME280 传感器用于测量有关环境温度、气压和相对湿度的读数。它主要用于低功耗是关键的网络和移动应用程序。该传感器使用 I2C 或 SPI 与微控制器进行数据通信。尽管市场上有多种不同版本的 BME280,但我们将研究的版本使用 I2C 通信协议。

ESP32 I2C 通信设置引脚、多设备接口和更改引脚

ESP32 通过 I2C 协议与 BME280 传感器通信,提供温度、气压和相对湿度读数。

MPU6050传感器模块

MPU6050 传感器模块是包含集成电路 MPU6050 IC 的 MEMS(微机电系统)模块。该芯片在单个 IC 封装内包含三轴陀螺仪、三轴加速度计和数字运动控制处理器。最重要的是,它还包含一个集成温度传感器。

MPU6050 在 I2C 总线上提供输出数据。因此,我们可以使用MPU6050的I2C总线接口将3轴加速度计和3轴陀螺仪值传输到Raspberry Pi Pico。换句话说,我们可以使用任何具有 I2C 端口的微控制器来读取传感器的输出数据。MPU6050 I2C 接口中的每个参数值都分配有特定的专用地址。我们可以使用这些地址从传感器获取特定值,例如加速度、陀螺仪和温度。

使用该传感器的 I2C 接口的优点之一是我们可以将多个 MPU5060 模块与单个微控制器连接。

ESP32 I2C 通信设置引脚、多设备接口和更改引脚 ESP32 与 OLED、BME280 和 MPU6050 的接口 ESP32 I2C 通信设置引脚、多设备接口和更改引脚

让我们看看如何将 ESP32 与 OLED、BME280 模块和 MPU6050 模块连接在一起。我们将使用一条公共 I2C 线来连接所有设备。ESP32 将充当主设备,BME280 传感器、MPU6050 传感器和 OLED 将充当从设备。

我们使用的四个设备之间的连接如下表所示。

ESP32 SSD1306 OLED显示屏 BME280 微处理器6050 3.3V 电压控制电路 电压控制电路 电压控制电路 GPIO21(I2C SDA) SDA SDA SDA GPIO22(I2C SCL) SCL SCL SCL 接地 接地 接地 接地

我们使用了上表中指定的相同连接。

ESP32 I2C 通信设置引脚、多设备接口和更改引脚 ESP32 I2C 扫描仪 Arduino 程序

每个 I2C 设备都有一个与其关联的地址。ESP32 使用该地址通过 I2C 协议与从机进行通信。

现在复制此代码并将其上传到您的开发板以及已连接的所有 I2C 设备。

此代码将扫描与 ESP32 连接的任何 I2C 设备,并指定串行终端中具有该地址的设备数量。

#include void setup() { Wire.begin(); Serial.begin(115200); Serial.println("nI2C Scanner"); byte error, address; int nDevices; Serial.println("Scanning..."); nDevices = 0; for(address = 1; address < 127; address++ ) { Wire.beginTransmission(address); error = Wire.endTransmission(); if (error == 0) { Serial.print("I2C device found at address 0x"); if (address Manage Libraries。

当您单击管理库选项时,您将看到此窗口。在此窗口中,在搜索栏中输入“ ESP32I2CSlave ”,然后按 Enter 键。

选择突出显示的库并单击安装。

ESP32 I2C 通信设置引脚、多设备接口和更改引脚 ESP32 I2C 主控代码 // Demonstrates use of the Wire and WirePacker libraries. // Writes data to an ESP32 I2C/TWI slave device that // uses ESP32 I2C Slave library. // Refer to the "slave_receiver" example for use with this #include #include #include #define SDA_PIN 21 #define SCL_PIN 22 #define I2C_SLAVE_ADDR 0x04 void setup() { Serial.begin(115200); // start serial for output Wire.begin(SDA_PIN, SCL_PIN); // join i2c bus } void loop() { static unsigned long lastWireTransmit = 0; static byte x = 0; // send data to WireSlave device every 1000 ms if (millis() - lastWireTransmit > 1000) { // first create a WirePacker that will assemble a packet WirePacker packer; // then add data the same way as you would with Wire packer.write("x is "); packer.write(x); // after adding all data you want to send, close the packet packer.end(); // now transmit the packed data Wire.beginTransmission(I2C_SLAVE_ADDR); while (packer.available()) { // write every packet byte Wire.write(packer.read()); } Wire.endTransmission(); // stop transmitting lastWireTransmit = millis(); if(x==0) x = 1; else x = 0; } } ESP32 I2C 从机代码 // Demonstrates use of the WireSlave library for ESP32. // Receives data as an I2C/TWI slave device; data must // be packed using WirePacker. // Refer to the "master_writer" example for use with this #include #include #include #define SDA_PIN 21 #define SCL_PIN 22 #define I2C_SLAVE_ADDR 0x04 #define LED 2 void receiveEvent(int howMany); void setup() { Serial.begin(115200); pinMode(LED, OUTPUT); bool success = WireSlave.begin(SDA_PIN, SCL_PIN, I2C_SLAVE_ADDR); if (!success) { Serial.println("I2C slave init failed"); while(1) delay(100); } WireSlave.onReceive(receiveEvent); } void loop() { // the slave response time is directly related to how often // this update() method is called, so avoid using long delays // inside loop(), and be careful with time-consuming tasks WireSlave.update(); // let I2C and other ESP32 peripherals interrupts work delay(1); } // function that executes whenever a complete and valid packet // is received from master // this function is registered as an event, see setup() void receiveEvent(int howMany) { while (1 < WireSlave.available()) // loop through all but the last byte { char c = WireSlave.read(); // receive byte as a character Serial.print(c); // print the character } int x = WireSlave.read(); // receive byte as an integer Serial.println(x); // print the integer if(x == 1) { Serial.println("Setting LED active HIGH "); digitalWrite(LED, HIGH); } else if(x == 0) { Serial.println("Setting LED active LOW "); digitalWrite(LED, LOW); } Serial.println(""); }

现在将上述程序上传到主从 ESP32 板。

将 Arduino 程序上传到两个 ESP32 板后,打开从设备的串行监视器,您将在串行监视器上看到以下消息:

ESP32 I2C 通信设置引脚、多设备接口和更改引脚

您还会看到 ESP32 从机的板载 LED 会延迟一秒亮起和熄灭。

ESP32 I2C 通信设置引脚、多设备接口和更改引脚


【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3