AI-Thinker ESP32Cam
ESP32Cam一直被制造商含蓄地推荐,因为你可以以相当便宜的价格获得。大多数人都遇到过必须使用I2C总线将I2C传感器与ESP32Cam连接的情况。当您查看引脚排列时,不会有任何I2C引脚,因为Omnivision摄像头传感器内部连接到ESP32的I2C引脚。但是在ESP32中有两个I2C总线,您可以使用任何引脚作为数据线和时钟线。以下是与ESP32Cam接口的I2C传感器的示例。
目录
依赖库
- Adafruit BME280
- Adafruit BusIO
- Adafruit Unified Sensors
注:使用Adafruit BME(2.1.1)、Adafruit BusIO(1.4.1)和Adafruit Unified Sensors(1.1.4)库。依赖库下载链接:
BME 280传感器- I2C总线示例
#include "Arduino.h"
#include <Wire.h>
// #include "esp_camera.h"
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
// -----------------I2C-----------------
#define I2C_SDA 14
// SDA Connected to GPIO 14
#define I2C_SCL 15
// SCL Connected to GPIO 15
TwoWire I2CSensors = TwoWire(0);
// BME 280 (Using I2C)
Adafruit_BME280 bme;
// Sensor Variable (BME280)
float temperature, humidity;
void setup()
{
Serial.begin(115200);
I2CSensors.begin(I2C_SDA, I2C_SCL, 100000);
// BME 280 (0x77 or 0x76 will be the address)
if (!bme.begin(0x76, &I2CSensors))
{
Serial.println("Couldn't Find BME280 Sensor");
while(1);
}
else
{
Serial.println("BME280 Sensor Found");
}
}
void loop()
{
// -------------Temperature (C)------------------
temperature = bme.readTemperature();
Serial.print("Temperature = ");
Serial.print(temperature);
Serial.print(" *C - ");
// ----------------------------------------------
// ---------------Humidity (%)-------------------
humidity = bme.readHumidity();
Serial.print("Humidity = ");
Serial.print(humidity);
Serial.println(" %");
// ----------------------------------------------
delay(1000);
}
连接原理图
I2C总线
-
定义SDA和SCL引脚,分别选择引脚号14和15。
#define I2C_SDA 14 #define I2C_SCL 15
-
创建双线实例。
TwoWire I2CSensors = TwoWire(0);
-
在setup()中,通过传入SDA SCL引脚和时钟频率初始化双线实例。
I2CSensors.begin(I2C_SDA, I2C_SCL, 100000);
BME280传感器
-
使用Adafruit BME280库创建传感器实例。
Adafruit_BME280 bme;
-
通过传入BME280的I2C地址和配置的双线实例初始化传感器。
if (!bme.begin(0x76, &I2CSensors))
{
Serial.println("Couldn't Find BME280 Sensor");
while(1);
}
else
{
Serial.println("BME280 Sensor Found");
}
预期错误(Adafruit库)
使用Adafruit Library时的一个预期错误是sensor_t
将与ESP32Cam Board冲突,因为它在Adafruit Library和ESP32Cam Board Library中都有声明。只有当您包含“esp_camera.h”时,即使用相机时,才会发生这种情况。
In file included from src/main.cpp:4:0:
lib/Adafruit_Unified_Sensor/Adafruit_Sensor.h:155:3: error: conflicting declaration 'typedef struct sensor_t sensor_t'
} sensor_t;
^
In file included from /home/abish/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/esp32-camera/esp_camera.h:70:0,
from src/main.cpp:2:
/home/abish/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/esp32-camera/sensor.h:133:3: note: previous declaration as 'typedef struct _sensor sensor_t'
} sensor_t;
^
*** [.pio/build/esp32cam/src/main.cpp.o] Error 1
为了解决这个问题,请将所有sensor_t
实例重命名为另一个名称,例如sensor_t1
。我用Sublime Text一次重命名了所有这些。
注意:上面下载的库是修改后的库。如果想使用提到的那些依赖库的最新版本,需要你自己下载之后对应文件里重命名