mirror of
https://github.com/wled/WLED.git
synced 2025-07-22 02:06:32 +00:00
Merge pull request #3966 from LordMike/feature/bme280_changeable_i2c
Add changeable i2c address to BME280 usermod
This commit is contained in:
commit
5f41de8938
@ -7,6 +7,7 @@ This Usermod is designed to read a `BME280` or `BMP280` sensor and output the fo
|
|||||||
- Dew Point (`BME280` only)
|
- Dew Point (`BME280` only)
|
||||||
|
|
||||||
Configuration is performed via the Usermod menu. There are no parameters to set in code! The following settings can be configured in the Usermod Menu:
|
Configuration is performed via the Usermod menu. There are no parameters to set in code! The following settings can be configured in the Usermod Menu:
|
||||||
|
- The i2c address in decimal. Set it to either 118 (0x76, the default) or 119 (0x77).
|
||||||
- Temperature Decimals (number of decimal places to output)
|
- Temperature Decimals (number of decimal places to output)
|
||||||
- Humidity Decimals
|
- Humidity Decimals
|
||||||
- Pressure Decimals
|
- Pressure Decimals
|
||||||
|
@ -24,6 +24,7 @@ private:
|
|||||||
uint8_t PressureDecimals = 0; // Number of decimal places in published pressure values
|
uint8_t PressureDecimals = 0; // Number of decimal places in published pressure values
|
||||||
uint16_t TemperatureInterval = 5; // Interval to measure temperature (and humidity, dew point if available) in seconds
|
uint16_t TemperatureInterval = 5; // Interval to measure temperature (and humidity, dew point if available) in seconds
|
||||||
uint16_t PressureInterval = 300; // Interval to measure pressure in seconds
|
uint16_t PressureInterval = 300; // Interval to measure pressure in seconds
|
||||||
|
BME280I2C::I2CAddr I2CAddress = BME280I2C::I2CAddr_0x76; // i2c address, defaults to 0x76
|
||||||
bool PublishAlways = false; // Publish values even when they have not changed
|
bool PublishAlways = false; // Publish values even when they have not changed
|
||||||
bool UseCelsius = true; // Use Celsius for Reporting
|
bool UseCelsius = true; // Use Celsius for Reporting
|
||||||
bool HomeAssistantDiscovery = false; // Publish Home Assistant Device Information
|
bool HomeAssistantDiscovery = false; // Publish Home Assistant Device Information
|
||||||
@ -35,20 +36,7 @@ private:
|
|||||||
#endif
|
#endif
|
||||||
bool initDone = false;
|
bool initDone = false;
|
||||||
|
|
||||||
// BME280 sensor settings
|
BME280I2C bme;
|
||||||
BME280I2C::Settings settings{
|
|
||||||
BME280::OSR_X16, // Temperature oversampling x16
|
|
||||||
BME280::OSR_X16, // Humidity oversampling x16
|
|
||||||
BME280::OSR_X16, // Pressure oversampling x16
|
|
||||||
// Defaults
|
|
||||||
BME280::Mode_Forced,
|
|
||||||
BME280::StandbyTime_1000ms,
|
|
||||||
BME280::Filter_Off,
|
|
||||||
BME280::SpiEnable_False,
|
|
||||||
BME280I2C::I2CAddr_0x76 // I2C address. I2C specific. Default 0x76
|
|
||||||
};
|
|
||||||
|
|
||||||
BME280I2C bme{settings};
|
|
||||||
|
|
||||||
uint8_t sensorType;
|
uint8_t sensorType;
|
||||||
|
|
||||||
@ -181,10 +169,20 @@ private:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public:
|
void initializeBmeComms()
|
||||||
void setup()
|
|
||||||
{
|
{
|
||||||
if (i2c_scl<0 || i2c_sda<0) { enabled = false; sensorType = 0; return; }
|
BME280I2C::Settings settings{
|
||||||
|
BME280::OSR_X16, // Temperature oversampling x16
|
||||||
|
BME280::OSR_X16, // Humidity oversampling x16
|
||||||
|
BME280::OSR_X16, // Pressure oversampling x16
|
||||||
|
BME280::Mode_Forced,
|
||||||
|
BME280::StandbyTime_1000ms,
|
||||||
|
BME280::Filter_Off,
|
||||||
|
BME280::SpiEnable_False,
|
||||||
|
I2CAddress
|
||||||
|
};
|
||||||
|
|
||||||
|
bme.setSettings(settings);
|
||||||
|
|
||||||
if (!bme.begin())
|
if (!bme.begin())
|
||||||
{
|
{
|
||||||
@ -208,7 +206,15 @@ public:
|
|||||||
DEBUG_PRINTLN(F("Found UNKNOWN sensor! Error!"));
|
DEBUG_PRINTLN(F("Found UNKNOWN sensor! Error!"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
initDone=true;
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
void setup()
|
||||||
|
{
|
||||||
|
if (i2c_scl<0 || i2c_sda<0) { enabled = false; sensorType = 0; return; }
|
||||||
|
|
||||||
|
initializeBmeComms();
|
||||||
|
initDone = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void loop()
|
void loop()
|
||||||
@ -365,7 +371,6 @@ public:
|
|||||||
}
|
}
|
||||||
else if (sensorType==2) //BMP280
|
else if (sensorType==2) //BMP280
|
||||||
{
|
{
|
||||||
|
|
||||||
JsonArray temperature_json = user.createNestedArray(F("Temperature"));
|
JsonArray temperature_json = user.createNestedArray(F("Temperature"));
|
||||||
JsonArray pressure_json = user.createNestedArray(F("Pressure"));
|
JsonArray pressure_json = user.createNestedArray(F("Pressure"));
|
||||||
temperature_json.add(roundf(sensorTemperature * powf(10, TemperatureDecimals)) / powf(10, TemperatureDecimals));
|
temperature_json.add(roundf(sensorTemperature * powf(10, TemperatureDecimals)) / powf(10, TemperatureDecimals));
|
||||||
@ -399,6 +404,7 @@ public:
|
|||||||
{
|
{
|
||||||
JsonObject top = root.createNestedObject(FPSTR(_name));
|
JsonObject top = root.createNestedObject(FPSTR(_name));
|
||||||
top[FPSTR(_enabled)] = enabled;
|
top[FPSTR(_enabled)] = enabled;
|
||||||
|
top[F("I2CAddress")] = static_cast<uint8_t>(I2CAddress);
|
||||||
top[F("TemperatureDecimals")] = TemperatureDecimals;
|
top[F("TemperatureDecimals")] = TemperatureDecimals;
|
||||||
top[F("HumidityDecimals")] = HumidityDecimals;
|
top[F("HumidityDecimals")] = HumidityDecimals;
|
||||||
top[F("PressureDecimals")] = PressureDecimals;
|
top[F("PressureDecimals")] = PressureDecimals;
|
||||||
@ -426,6 +432,10 @@ public:
|
|||||||
|
|
||||||
configComplete &= getJsonValue(top[FPSTR(_enabled)], enabled);
|
configComplete &= getJsonValue(top[FPSTR(_enabled)], enabled);
|
||||||
// A 3-argument getJsonValue() assigns the 3rd argument as a default value if the Json value is missing
|
// A 3-argument getJsonValue() assigns the 3rd argument as a default value if the Json value is missing
|
||||||
|
uint8_t tmpI2cAddress;
|
||||||
|
configComplete &= getJsonValue(top[F("I2CAddress")], tmpI2cAddress, 0x76);
|
||||||
|
I2CAddress = static_cast<BME280I2C::I2CAddr>(tmpI2cAddress);
|
||||||
|
|
||||||
configComplete &= getJsonValue(top[F("TemperatureDecimals")], TemperatureDecimals, 1);
|
configComplete &= getJsonValue(top[F("TemperatureDecimals")], TemperatureDecimals, 1);
|
||||||
configComplete &= getJsonValue(top[F("HumidityDecimals")], HumidityDecimals, 0);
|
configComplete &= getJsonValue(top[F("HumidityDecimals")], HumidityDecimals, 0);
|
||||||
configComplete &= getJsonValue(top[F("PressureDecimals")], PressureDecimals, 0);
|
configComplete &= getJsonValue(top[F("PressureDecimals")], PressureDecimals, 0);
|
||||||
@ -440,8 +450,23 @@ public:
|
|||||||
// first run: reading from cfg.json
|
// first run: reading from cfg.json
|
||||||
DEBUG_PRINTLN(F(" config loaded."));
|
DEBUG_PRINTLN(F(" config loaded."));
|
||||||
} else {
|
} else {
|
||||||
DEBUG_PRINTLN(F(" config (re)loaded."));
|
|
||||||
// changing parameters from settings page
|
// changing parameters from settings page
|
||||||
|
DEBUG_PRINTLN(F(" config (re)loaded."));
|
||||||
|
|
||||||
|
// Reset all known values
|
||||||
|
sensorType = 0;
|
||||||
|
sensorTemperature = 0;
|
||||||
|
sensorHumidity = 0;
|
||||||
|
sensorHeatIndex = 0;
|
||||||
|
sensorDewPoint = 0;
|
||||||
|
sensorPressure = 0;
|
||||||
|
lastTemperature = 0;
|
||||||
|
lastHumidity = 0;
|
||||||
|
lastHeatIndex = 0;
|
||||||
|
lastDewPoint = 0;
|
||||||
|
lastPressure = 0;
|
||||||
|
|
||||||
|
initializeBmeComms();
|
||||||
}
|
}
|
||||||
|
|
||||||
return configComplete;
|
return configComplete;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user