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使用两个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传感器读取温度,湿度和压力。
每个传感器都连接到不同的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的I2C通信协议的更多信息。希望对您有帮助。