diff --git a/code/espurna/config/prototypes.h b/code/espurna/config/prototypes.h index 74ebda0b..3b9a4219 100644 --- a/code/espurna/config/prototypes.h +++ b/code/espurna/config/prototypes.h @@ -85,7 +85,7 @@ template bool idbSend(const char * topic, unsigned char id, T payloa #if MHZ19_SUPPORT #include #endif -#if BME280_SUPPORT +#if BMX280_SUPPORT #include #endif diff --git a/code/espurna/config/sensors.h b/code/espurna/config/sensors.h index d387c5ca..10d09858 100644 --- a/code/espurna/config/sensors.h +++ b/code/espurna/config/sensors.h @@ -94,22 +94,22 @@ #endif //-------------------------------------------------------------------------------- -// BME280 -// Enable support by passing BME280_SUPPORT=1 build flag +// BMX280 +// Enable support by passing BMX280_SUPPORT=1 build flag //-------------------------------------------------------------------------------- -#ifndef BME280_SUPPORT -#define BME280_SUPPORT 0 +#ifndef BMX280_SUPPORT +#define BMX280_SUPPORT 0 #endif -#ifndef BME280_ADDRESS -#define BME280_ADDRESS 0x76 +#ifndef BMX280_ADDRESS +#define BMX280_ADDRESS 0x76 #endif -#define BME280_MODE 1 // 1 for forced mode, 3 for normal mode -#define BME280_TEMPERATURE 1 // Oversampling for temperature (set to 0 to disable magnitude) -#define BME280_HUMIDITY 1 // Oversampling for humidity (set to 0 to disable magnitude) -#define BME280_PRESSURE 1 // Oversampling for pressure (set to 0 to disable magnitude) +#define BMX280_MODE 1 // 1 for forced mode, 3 for normal mode +#define BMX280_TEMPERATURE 1 // Oversampling for temperature (set to 0 to disable magnitude) +#define BMX280_HUMIDITY 1 // Oversampling for humidity (set to 0 to disable magnitude, only for BME280) +#define BMX280_PRESSURE 1 // Oversampling for pressure (set to 0 to disable magnitude) //-------------------------------------------------------------------------------- // DS18B20 temperature sensor @@ -285,7 +285,7 @@ //-------------------------------------------------------------------------------- #ifndef MHZ19_SUPPORT -#define MHZ19_SUPPORT 1 +#define MHZ19_SUPPORT 0 #endif #define MHZ19_RX_PIN 13 diff --git a/code/espurna/sensor.ino b/code/espurna/sensor.ino index 61c0be7b..1492a4a6 100644 --- a/code/espurna/sensor.ino +++ b/code/espurna/sensor.ino @@ -250,9 +250,9 @@ void sensorInit() { sensorRegister(new SI7021Sensor(SI7021_ADDRESS)); #endif - #if BME280_SUPPORT - #include "sensors/BME280Sensor.h" - sensorRegister(new BME280Sensor(BME280_ADDRESS)); + #if BMX280_SUPPORT + #include "sensors/BMX280Sensor.h" + sensorRegister(new BMX280Sensor(BMX280_ADDRESS)); #endif #if ANALOG_SUPPORT diff --git a/code/espurna/sensors/BME280Sensor.h b/code/espurna/sensors/BMX280Sensor.h similarity index 59% rename from code/espurna/sensors/BME280Sensor.h rename to code/espurna/sensors/BMX280Sensor.h index 7b7acb43..9965729b 100644 --- a/code/espurna/sensors/BME280Sensor.h +++ b/code/espurna/sensors/BMX280Sensor.h @@ -1,5 +1,5 @@ // ----------------------------------------------------------------------------- -// BME280 Sensor +// BMX280 Sensor // ----------------------------------------------------------------------------- #pragma once @@ -8,59 +8,59 @@ #include "BaseSensor.h" #include -#define BME280_ERROR_UNKNOW_CHIP -1 +#define BMX280_CHIP_BMP280 0x58 +#define BMX280_CHIP_BME280 0x60 -class BME280Sensor : public BaseSensor { +class BMX280Sensor : public BaseSensor { public: - BME280Sensor(unsigned char address = BME280_ADDRESS): BaseSensor() { + BMX280Sensor(unsigned char address = BMX280_ADDRESS): BaseSensor() { // Cache _address = address; _measurement_delay = bmeMeasurementTime(); - #if BME280_TEMPERATURE > 0 - ++_count; - #endif - #if BME280_HUMIDITY > 0 - ++_count; - #endif - #if BME280_PRESSURE > 0 - ++_count; - #endif - // Init bme = new BME280(); bme->settings.commInterface = I2C_MODE; bme->settings.I2CAddress = _address; - bme->settings.runMode = BME280_MODE; + bme->settings.runMode = BMX280_MODE; bme->settings.tStandby = 0; bme->settings.filter = 0; - bme->settings.tempOverSample = BME280_TEMPERATURE; - bme->settings.pressOverSample = BME280_PRESSURE; - bme->settings.humidOverSample = BME280_HUMIDITY; + bme->settings.tempOverSample = BMX280_TEMPERATURE; + bme->settings.pressOverSample = BMX280_PRESSURE; + bme->settings.humidOverSample = BMX280_HUMIDITY; // Fix when not measuring temperature, t_fine should have a sensible value - if (BME280_TEMPERATURE == 0) bme->t_fine = 100000; // aprox 20ºC + if (BMX280_TEMPERATURE == 0) bme->t_fine = 100000; // aprox 20ºC - // Make sure sensor had enough time to turn on. BME280 requires 2ms to start up + // Make sure sensor had enough time to turn on. BMX280 requires 2ms to start up delay(10); // Check sensor correctly initialized - unsigned char response = bme->begin(); - if (response == 0x60) { - _ready = true; - } else { - _error = BME280_ERROR_UNKNOW_CHIP; + _chip = bme->begin(); + if ((_chip != BMX280_CHIP_BME280) && (_chip != BMX280_CHIP_BMP280)) { + _chip = 0; + _error = SENSOR_ERROR_UNKNOWN_ID; } + #if BMX280_TEMPERATURE > 0 + ++_count; + #endif + #if BMX280_PRESSURE > 0 + ++_count; + #endif + #if BMX280_HUMIDITY > 0 + if (_chip == BMX280_CHIP_BME280) ++_count; + #endif + } // Descriptive name of the sensor String name() { char buffer[20]; - snprintf(buffer, sizeof(buffer), "BME280 @ I2C (0x%02X)", _address); + snprintf(buffer, sizeof(buffer), "%s @ I2C (0x%02X)", _chip == BMX280_CHIP_BME280 ? "BME280" : "BMP280", _address); return String(buffer); } @@ -74,14 +74,16 @@ class BME280Sensor : public BaseSensor { if (index < _count) { _error = SENSOR_ERROR_OK; unsigned char i = 0; - #if BME280_TEMPERATURE > 0 + #if BMX280_TEMPERATURE > 0 if (index == i++) return MAGNITUDE_TEMPERATURE; #endif - #if BME280_HUMIDITY > 0 - if (index == i++) return MAGNITUDE_HUMIDITY; + #if BMX280_PRESSURE > 0 + if (index == i++) return MAGNITUDE_PRESSURE; #endif - #if BME280_PRESSURE > 0 - if (index == i) return MAGNITUDE_PRESSURE; + #if BMX280_HUMIDITY > 0 + if (_chip == BMX280_CHIP_BME280) { + if (index == i) return MAGNITUDE_HUMIDITY; + } #endif } _error = SENSOR_ERROR_OUT_OF_RANGE; @@ -91,12 +93,12 @@ class BME280Sensor : public BaseSensor { // Pre-read hook (usually to populate registers with up-to-date data) virtual void pre() { - if (!_ready) { - _error = BME280_ERROR_UNKNOW_CHIP; + if (_chip == 0) { + _error = SENSOR_ERROR_UNKNOWN_ID; return; } - #if BME280_MODE == 1 + #if BMX280_MODE == 1 bmeForceRead(); #endif @@ -108,14 +110,16 @@ class BME280Sensor : public BaseSensor { if (index < _count) { _error = SENSOR_ERROR_OK; unsigned char i = 0; - #if BME280_TEMPERATURE > 0 + #if BMX280_TEMPERATURE > 0 if (index == i++) return bme->readTempC(); #endif - #if BME280_HUMIDITY > 0 - if (index == i++) return bme->readFloatHumidity(); + #if BMX280_PRESSURE > 0 + if (index == i++) return bme->readFloatPressure() / 100; #endif - #if BME280_PRESSURE > 0 - if (index == i) return bme->readFloatPressure() / 100; + #if BMX280_HUMIDITY > 0 + if (_chip == BMX280_CHIP_BME280) { + if (index == i) return bme->readFloatHumidity(); + } #endif } _error = SENSOR_ERROR_OUT_OF_RANGE; @@ -126,7 +130,7 @@ class BME280Sensor : public BaseSensor { unsigned long bmeMeasurementTime() { - // Measurement Time (as per BME280 datasheet section 9.1) + // Measurement Time (as per BMX280 datasheet section 9.1) // T_max(ms) = 1.25 // + (2.3 * T_oversampling) // + (2.3 * P_oversampling + 0.575) @@ -134,14 +138,16 @@ class BME280Sensor : public BaseSensor { // ~ 9.3ms for current settings double t = 1.25; - #if BME280_TEMPERATURE > 0 - t += (2.3 * BME280_TEMPERATURE); + #if BMX280_TEMPERATURE > 0 + t += (2.3 * BMX280_TEMPERATURE); #endif - #if BME280_HUMIDITY > 0 - t += (2.4 * BME280_HUMIDITY + 0.575); + #if BMX280_PRESSURE > 0 + t += (2.3 * BMX280_PRESSURE + 0.575); #endif - #if BME280_PRESSURE > 0 - t += (2.3 * BME280_PRESSURE + 0.575); + #if BMX280_HUMIDITY > 0 + if (_chip == BMX280_CHIP_BME280) { + t += (2.4 * BMX280_HUMIDITY + 0.575); + } #endif return round(t + 1); // round up @@ -163,8 +169,8 @@ class BME280Sensor : public BaseSensor { // --------------------------------------------------------------------- BME280 * bme; + unsigned char _chip; unsigned char _address; unsigned long _measurement_delay; - bool _ready = false; }; diff --git a/code/espurna/sensors/BaseSensor.h b/code/espurna/sensors/BaseSensor.h index 31f9c09b..91fffd6f 100644 --- a/code/espurna/sensors/BaseSensor.h +++ b/code/espurna/sensors/BaseSensor.h @@ -41,6 +41,7 @@ typedef enum magnitude_t { #define SENSOR_ERROR_OUT_OF_RANGE 1 // Result out of sensor range #define SENSOR_ERROR_WARM_UP 2 // Sensor is warming-up #define SENSOR_ERROR_TIMEOUT 3 // Response from sensor timed out +#define SENSOR_ERROR_UNKNOWN_ID 4 // Sensor did not report a known ID class BaseSensor {