快捷搜索:  汽车  科技

esp32有多少个模拟引脚:ESP32 I2C通讯原来是这样的 讲的详细就这么简单

esp32有多少个模拟引脚:ESP32 I2C通讯原来是这样的 讲的详细就这么简单void setup() {然后,以所需的频率在所需的引脚上初始化I2C通信。要使用ESP32的两个I2C总线接口,您需要创建两个TwoWire实例。TwoWire I2Cone = TwoWire(0);TwoWire I2Ctwo = TwoWire(1)

通过将电阻器放在一侧或另一侧,可以选择不同的I2C地址。其他组件也会发生这种情况。

使用I2C多路复用器

但是,在前面的示例中,这仅允许您在同一总线上具有两个I2C显示器:一个具有0x3C地址,另一个具有0x3D地址。

此外,有时更改I2C地址并非易事。因此,为了在同一I2C总线中拥有多个具有相同地址的设备,您可以使用I2C多路复用器,如TCA9548A,它允许您与多达8个具有相同地址的设备进行通信。

esp32有多少个模拟引脚:ESP32 I2C通讯原来是这样的 讲的详细就这么简单(1)

ESP32使用两个I2C总线接口

要使用ESP32的两个I2C总线接口,您需要创建两个TwoWire实例。

TwoWire I2Cone = TwoWire(0);

TwoWire I2Ctwo = TwoWire(1)

然后,以所需的频率在所需的引脚上初始化I2C通信。

void setup() {

I2Cone.begin(SDA_1 SCL_1 freq1);

I2Ctwo.begin(SDA_2 SCL_2 freq2);

}

然后,您可以使用Wire.h库中的方法与I2C总线接口进行交互。

一个更简单的替代方法是使用预定义的Wire()和Wire1()对象。Wire()。begin()使用默认引脚和默认频率在第一条I2C总线上创建I2C通信。对于Wire1.begin(),您应该传递所需的SDA和SCL引脚以及频率。

setup(){

Wire.begin();

Wire1.begin(SDA_2 SCL_2 freq);

}

这种方法允许您使用两条I2C总线,其中一条使用默认参数。

为了更好地了解其工作原理,我们来看一个简单的示例,该示例从两个BME280传感器读取温度,湿度和压力。

esp32有多少个模拟引脚:ESP32 I2C通讯原来是这样的 讲的详细就这么简单(2)

每个传感器都连接到不同的I2C总线。

· I2C总线1:使用GPIO 27(SDA)和GPIO 26(SCL);

· I2C总线2:使用GPIO 33(SDA)和GPIO 32(SCL);

#include <Wire.h>

#include <Adafruit_Sensor.h>

#include <Adafruit_BME280.h>

#define SDA_1 27

#define SCL_1 26

#define SDA_2 33

#define SCL_2 32

TwoWire I2Cone = TwoWire(0);

TwoWire I2Ctwo = TwoWire(1);

Adafruit_BME280 bme1;

Adafruit_BME280 bme2;

void setup() {

Serial.begin(115200);

Serial.println(F("BME280 test"));

I2Cone.begin(SDA_1 SCL_1 100000);

I2Ctwo.begin(SDA_2 SCL_2 100000);

bool status1 = bme1.begin(0x76 &I2Cone);

if (!status1) {

Serial.println("Could not find a valid BME280_1 sensor check wiring!");

while (1);

}

bool status2 = bme2.begin(0x76 &I2Ctwo);

if (!status2) {

Serial.println("Could not find a valid BME280_2 sensor check wiring!");

while (1);

}

Serial.println();

}

void loop() {

Serial.print("Temperature from BME1= ");

Serial.print(bme1.readTemperature());

Serial.println(" *C");

Serial.print("Humidity from BME1 = ");

Serial.print(bme1.readHumidity());

Serial.println(" %");

Serial.print("Pressure from BME1 = ");

Serial.print(bme1.readPressure() / 100.0F);

Serial.println(" hPa");

Serial.println("--------------------");

Serial.print("Temperature from BME2 = ");

Serial.print(bme2.readTemperature());

Serial.println(" *C");

Serial.print("Humidity from BME2 = ");

Serial.print(bme2.readHumidity());

Serial.println(" %");

Serial.print("Pressure from BME2 = ");

Serial.print(bme2.readPressure() / 100.0F);

Serial.println(" hPa");

Serial.println("--------------------");

delay(5000);

}

让我们看一下使用两个I2C总线接口的相关部分。

定义要使用的SDA和SCL引脚:

#define SDA_1 27

#define SCL_1 26

#define SDA_2 33

#define SCL_2 32

创建两个TwoWire对象(两个I2C总线接口):

TwoWire I2Cone = TwoWire(0);

TwoWire I2Ctwo = TwoWire(1);

创建Adafruit_BME280库的两个实例以与您的传感器进行交互:bme1和bme2。

Adafruit_BME280 bme1;

Adafruit_BME280 bme2;

在定义的引脚和频率上初始化I2C通信:

I2Cone.begin(SDA_1 SCL_1 100000);

I2Ctwo.begin(SDA_2 SCL_2 100000);

然后,应使用正确的地址和I2C总线初始化bme1和bme2对象。bme1使用I2Cone:

bool status = bme1.begin(0x76 &I2Cone);

而bme2用途I2Ctwo:

bool status1 = bme2.begin(0x76 &I2Ctwo);

现在,您可以在bme1和bme2对象上使用Adafruit_BME280库中的方法来读取温度,湿度和压力。

另一种选择

为了简单起见,可以使用预定义的Wire()和Wire1()对象:

· Wire():在默认引脚GPIO 21(SDA)和GPIO 22(SCL)上创建I2C总线

· Wire1(SDA_2,SCL_2,freq):以所需的频率在定义的SDA_2和SCL_2引脚上创建I2C总线。

这是相同的示例,但是使用此方法。现在,您的一个传感器使用默认引脚,另一个传感器使用GPIO 32和GPIO 33。

#include <Wire.h>

#include <Adafruit_Sensor.h>

#include <Adafruit_BME280.h>

#define SDA_2 33

#define SCL_2 32

Adafruit_BME280 bme1;

Adafruit_BME280 bme2;

void setup() {

Serial.begin(115200);

Serial.println(F("BME280 test"));

Wire.begin();

Wire1.begin(SDA_2 SCL_2);

bool status1 = bme1.begin(0x76);

if (!status1) {

Serial.println("Could not find a valid BME280_1 sensor check wiring!");

while (1);

}

bool status2 = bme2.begin(0x76 &Wire1);

if (!status2) {

Serial.println("Could not find a valid BME280_2 sensor check wiring!");

while (1);

}

Serial.println();

}

void loop() {

Serial.print("Temperature from BME1= ");

Serial.print(bme1.readTemperature());

Serial.println(" *C");

Serial.print("Humidity from BME1 = ");

Serial.print(bme1.readHumidity());

Serial.println(" %");

Serial.print("Pressure from BME1 = ");

Serial.print(bme1.readPressure() / 100.0F);

Serial.println(" hPa");

Serial.println("--------------------")

Serial.print("Temperature from BME2 = ");

Serial.print(bme2.readTemperature());

Serial.println(" *C");

Serial.print("Humidity from BME2 = ");

Serial.print(bme2.readHumidity());

Serial.println(" %");

Serial.print("Pressure from BME2 = ");

Serial.print(bme2.readPressure() / 100.0F);

Serial.println(" hPa");

Serial.println("--------------------");

delay(5000);

}

您应该在串口监视器上同时获得两个传感器的读数。

esp32有多少个模拟引脚:ESP32 I2C通讯原来是这样的 讲的详细就这么简单(3)

在本教程中,您了解了有关ESP32的I2C通信协议的更多信息。希望对您有帮助。

猜您喜欢: