我正在尝试使用 ESP32、TEMT600、AHT10、BMP280、MPU6050 传感器模块创建室内环境监控系统。 一切似乎都正常,但来自 BMP280 和 MPU6050 的数据停止了。 BMP280 传感器给我的温度为 180.73°C,压力为 -127hPa。 MPU6050 提供类似的静态读数,加速度计 -9.20、0.00、-77.8 和陀螺仪 -1194°、0°、0°。 他们都开始同时进行静态阅读,但在我的测试中可能会在 5-60 分钟之间变化。
我有时也会从 BMP280 超时,这可能是什么原因造成的吗?
我在下面附上我的代码,这是我第一次尝试使用 ESP32,所以如果有人帮我解决代码的问题,那就太好了。 所有的传感器 SDA 都是 SDA GPIO 21, SCL GPIO 22.
代码
#include <WiFi.h>
#include <WiFiMulti.h>
#include <math.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_AHTX0.h>
#include <Adafruit_BMP280.h>
#include <Adafruit_MPU6050.h>
#include <InfluxDbClient.h>
// Wi-Fi AP SSID
#define WIFI_SSID "Wi-Fi"
// Wi-Fi Password
#define WIFI_PASSWORD "Password"
// InfluxDB v2 Server URL, e.g. https://eu-central-1-1.aws.cloud2.influxdata.com (Use: InfluxDB UI -> Load Data -> Client Libraries)
#define INFLUXDB_URL "URL"
// InfluxDB v2 Server or Cloud API Token (Use: InfluxDB UI -> Data -> API Tokens -> Generate API Token)
#define INFLUXDB_TOKEN "TOEKN"
// InfluxDB v2 Organization ID (Use: InfluxDB UI -> User -> About -> Common Ids )
#define INFLUXDB_ORG "Test"
// InfluxDB v2 Bucket Name (Use: InfluxDB UI -> Data -> Buckets)
#define INFLUXDB_BUCKET "Weather"
// Set Timezone String According to https://www.gnu.org/software/libc/manual/html_node/TZ-Variable.html
#define TZ_INFO "UTC +10"
// InfluxDB Client Instance with Preconfigured InfluxCloud Certificate
InfluxDBClient client(INFLUXDB_URL, INFLUXDB_ORG, INFLUXDB_BUCKET, INFLUXDB_TOKEN);
WiFiMulti wifiMulti;
Adafruit_AHTX0 aht;
Adafruit_BMP280 bmp;
Adafruit_MPU6050 mpu;
// Setup Code to Run Once
void setup() {
Serial.begin(115200);
// Connect to Wi-Fi
WiFi.mode(WIFI_STA);
wifiMulti.addAP(WIFI_SSID, WIFI_PASSWORD);
Serial.print("Connecting to Wi-Fi");
while (wifiMulti.run() != WL_CONNECTED) {
Serial.print(".");
delay(100);
}
Serial.println();
// Initialize the AHT10 Sensor
if (!aht.begin()) {
Serial.println("Could Not Find AHT10 Sensor!");
while (1);
}
// Initialize the BMP280 Sensor
if (!bmp.begin(0x76)) {
Serial.println("Could Not Find BMP280 Sensor");
while (1);
}
// Initialize the MPU6050 Sensor
if (!mpu.begin()) {
Serial.println("Could Not Find MPU6050 Sensor");
while (1);
}
// MPU 6050 Details
mpu.setAccelerometerRange(MPU6050_RANGE_8_G);
Serial.print("Accelerometer range set to: ");
switch (mpu.getAccelerometerRange()) {
case MPU6050_RANGE_2_G:
Serial.println("+-2G");
break;
case MPU6050_RANGE_4_G:
Serial.println("+-4G");
break;
case MPU6050_RANGE_8_G:
Serial.println("+-8G");
break;
case MPU6050_RANGE_16_G:
Serial.println("+-16G");
break;
}
mpu.setGyroRange(MPU6050_RANGE_500_DEG);
Serial.print("Gyro range set to: ");
switch (mpu.getGyroRange()) {
case MPU6050_RANGE_250_DEG:
Serial.println("+- 250 deg/s");
break;
case MPU6050_RANGE_500_DEG:
Serial.println("+- 500 deg/s");
break;
case MPU6050_RANGE_1000_DEG:
Serial.println("+- 1000 deg/s");
break;
case MPU6050_RANGE_2000_DEG:
Serial.println("+- 2000 deg/s");
break;
}
mpu.setFilterBandwidth(MPU6050_BAND_21_HZ);
Serial.print("Filter bandwidth set to: ");
switch (mpu.getFilterBandwidth()) {
case MPU6050_BAND_260_HZ:
Serial.println("260 Hz");
break;
case MPU6050_BAND_184_HZ:
Serial.println("184 Hz");
break;
case MPU6050_BAND_94_HZ:
Serial.println("94 Hz");
break;
case MPU6050_BAND_44_HZ:
Serial.println("44 Hz");
break;
case MPU6050_BAND_21_HZ:
Serial.println("21 Hz");
break;
case MPU6050_BAND_10_HZ:
Serial.println("10 Hz");
break;
case MPU6050_BAND_5_HZ:
Serial.println("5 Hz");
break;
}
// Accurate time is necessary for certificate validation and writing in batches
// For the fastest time sync find NTP servers in your area: https://www.pool.ntp.org/zone/
// Syncing progress and the time will be printed to Serial.
timeSync(TZ_INFO, "pool.ntp.org", "time.nis.gov");
// Check Server Connection
if (client.validateConnection()) {
Serial.print("Connected to InfluxDB: ");
Serial.println(client.getServerUrl());
}
else {
Serial.print("InfluxDB Connection Failed: ");
Serial.println(client.getLastErrorMessage());
}
/* Default Settings from Datasheet */
bmp.setSampling(Adafruit_BMP280::MODE_NORMAL, /* Operating Mode */
Adafruit_BMP280::SAMPLING_X2, /* Temperature Oversampling */
Adafruit_BMP280::SAMPLING_X16, /* Pressure Oversampling */
Adafruit_BMP280::FILTER_X16, /* Filtering */
Adafruit_BMP280::STANDBY_MS_500); /* Standby Time */
}
// Code to Run in Loop
void loop() {
// Read Sensor Values
// Sensor Event
sensors_event_t aht10humidity, aht10temp, mpu6050accelerometer, mpu6050gyroscope, mpu6050temp;
// AHT 10
aht.getEvent(&aht10humidity, &aht10temp);
// TEMP 6000
int const TEMP6000_PIN = 34; // Analog Pin 34
int const AREF = 3.3; // set for 5.0 or 3.3 depending on voltage of uC
// Luminescence Math from Analog Reading (0-4095) for ESP32 12 bit
float sensor_value = analogRead(TEMP6000_PIN); // Get Raw Sensor Reading
float volts = sensor_value * AREF / 4095.0; // Convert Reading to Voltage
float amps = volts / 10000.0; // Convert to Amps Across 10K Resistor
float microamps = amps * 1000000.0; // Convert Amps to Microamps
float lux = microamps * 2.0; // 2 Microamps = 1 lux
//BMP 280
float bmpTemp = bmp.readTemperature();
float bmpPressure = bmp.readPressure()/100; // Pascal to Hectopascal
float bmpAltitude = bmp.readAltitude(1013.25); //The "1013.25" is the Pressure(hPa) at Sea Level
// MPU 6050
mpu.getEvent(&mpu6050accelerometer, &mpu6050gyroscope, &mpu6050temp);
// Create Data Points
Point temp6000("TEMP6000");
Point aht10("AHT10");
Point bmp280("BMP280");
Point mpu6050("MPU6050");
// Field for AHT10
aht10.addField("Temperature", aht10temp.temperature);
aht10.addField("Relative Humidity", aht10humidity.relative_humidity);
// Field for TEMP6000
temp6000.addField("Lux", lux);
temp6000.addField("Raw ADC Data", (int)sensor_value);
temp6000.addField("Volts", volts);
// Field for BMP280
bmp280.addField("Temperature", bmpTemp);
bmp280.addField("Pressure", bmpPressure);
bmp280.addField("Approx Altitude", bmpAltitude);
// Field for MPU6050
mpu6050.addField("Temperature", mpu6050temp.temperature);
mpu6050.addField("Accelerometer X", mpu6050accelerometer.acceleration.x);
mpu6050.addField("Accelerometer Y", mpu6050accelerometer.acceleration.y);
mpu6050.addField("Accelerometer Z", mpu6050accelerometer.acceleration.z);
mpu6050.addField("Gyroscope X", mpu6050gyroscope.gyro.x * 180 / PI);
mpu6050.addField("Gyroscope Y", mpu6050gyroscope.gyro.y * 180 / PI);
mpu6050.addField("Gyroscope Z", mpu6050gyroscope.gyro.z * 180 / PI);
// Check Wi-Fi Connection and Reconnect if Needed
if (wifiMulti.run() != WL_CONNECTED)
{
Serial.println("Wi-Fi Connection Lost!");
}
// Write Point
if (!client.writePoint(temp6000))
{
Serial.print("InfluxDB Write Failed For TEMP6000: ");
Serial.println(client.getLastErrorMessage());
}
if (!client.writePoint(aht10))
{
Serial.print("InfluxDB Write Failed For AHT10: ");
Serial.println(client.getLastErrorMessage());
}
if (!client.writePoint(bmp280))
{
Serial.print("InfluxDB Write Failed For BMP280: ");
Serial.println(client.getLastErrorMessage());
}
if (!client.writePoint(mpu6050))
{
Serial.print("InfluxDB Write Failed For MPU6050: ");
Serial.println(client.getLastErrorMessage());
}
delay(10000);
}
我正在将这些数据推送到 Oracle 云,也尝试在本地进行,遇到了类似的问题,但再次不确定何时会发生,但同时发生在 MPU6050、BMP280 上。