mirror of https://github.com/arendst/Tasmota.git
Added support for multiple i2c addresses
This commit is contained in:
parent
abfa4f4fcd
commit
92643e89d0
|
@ -35,7 +35,7 @@ LOLIN_HP303B::~LOLIN_HP303B(void)
|
||||||
* &bus: I2CBus which connects MC to HP303B
|
* &bus: I2CBus which connects MC to HP303B
|
||||||
* slaveAddress: Address of the HP303B (0x77 or 0x76)
|
* slaveAddress: Address of the HP303B (0x77 or 0x76)
|
||||||
*/
|
*/
|
||||||
void LOLIN_HP303B::begin(TwoWire &bus, uint8_t slaveAddress)
|
uint8_t LOLIN_HP303B::begin(TwoWire &bus, uint8_t slaveAddress)
|
||||||
{
|
{
|
||||||
//this flag will show if the initialization was successful
|
//this flag will show if the initialization was successful
|
||||||
m_initFail = 0U;
|
m_initFail = 0U;
|
||||||
|
@ -50,20 +50,20 @@ void LOLIN_HP303B::begin(TwoWire &bus, uint8_t slaveAddress)
|
||||||
|
|
||||||
delay(50); //startup time of HP303B
|
delay(50); //startup time of HP303B
|
||||||
|
|
||||||
init();
|
return init();
|
||||||
}
|
}
|
||||||
|
|
||||||
void LOLIN_HP303B::begin(uint8_t slaveAddress)
|
uint8_t LOLIN_HP303B::begin(uint8_t slaveAddress)
|
||||||
{
|
{
|
||||||
begin(Wire,slaveAddress);
|
return begin(Wire,slaveAddress);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* SPI begin function for HP303B with 4-wire SPI
|
* SPI begin function for HP303B with 4-wire SPI
|
||||||
*/
|
*/
|
||||||
void LOLIN_HP303B::begin(SPIClass &bus, int32_t chipSelect)
|
uint8_t LOLIN_HP303B::begin(SPIClass &bus, int32_t chipSelect)
|
||||||
{
|
{
|
||||||
begin(bus, chipSelect, 0U);
|
return begin(bus, chipSelect, 0U);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -74,7 +74,7 @@ void LOLIN_HP303B::begin(SPIClass &bus, int32_t chipSelect)
|
||||||
* threeWire: 1 if HP303B is connected with 3-wire SPI
|
* threeWire: 1 if HP303B is connected with 3-wire SPI
|
||||||
* 0 if HP303B is connected with 4-wire SPI (standard)
|
* 0 if HP303B is connected with 4-wire SPI (standard)
|
||||||
*/
|
*/
|
||||||
void LOLIN_HP303B::begin(SPIClass &bus, int32_t chipSelect, uint8_t threeWire)
|
uint8_t LOLIN_HP303B::begin(SPIClass &bus, int32_t chipSelect, uint8_t threeWire)
|
||||||
{
|
{
|
||||||
//this flag will show if the initialization was successful
|
//this flag will show if the initialization was successful
|
||||||
m_initFail = 0U;
|
m_initFail = 0U;
|
||||||
|
@ -102,11 +102,11 @@ void LOLIN_HP303B::begin(SPIClass &bus, int32_t chipSelect, uint8_t threeWire)
|
||||||
if(writeByte(HP303B__REG_ADR_SPI3W, HP303B__REG_CONTENT_SPI3W))
|
if(writeByte(HP303B__REG_ADR_SPI3W, HP303B__REG_CONTENT_SPI3W))
|
||||||
{
|
{
|
||||||
m_initFail = 1U;
|
m_initFail = 1U;
|
||||||
return;
|
return 0U;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
init();
|
return init();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -840,14 +840,14 @@ int16_t LOLIN_HP303B::correctTemp(void)
|
||||||
* This function has to be called from begin()
|
* This function has to be called from begin()
|
||||||
* and requires a valid bus initialization.
|
* and requires a valid bus initialization.
|
||||||
*/
|
*/
|
||||||
void LOLIN_HP303B::init(void)
|
uint8_t LOLIN_HP303B::init(void)
|
||||||
{
|
{
|
||||||
int16_t prodId = readByteBitfield(HP303B__REG_INFO_PROD_ID);
|
int16_t prodId = readByteBitfield(HP303B__REG_INFO_PROD_ID);
|
||||||
if(prodId != HP303B__PROD_ID)
|
if(prodId != HP303B__PROD_ID)
|
||||||
{
|
{
|
||||||
//Connected device is not a HP303B
|
//Connected device is not a HP303B
|
||||||
m_initFail = 1U;
|
m_initFail = 1U;
|
||||||
return;
|
return 0U;
|
||||||
}
|
}
|
||||||
m_productID = prodId;
|
m_productID = prodId;
|
||||||
|
|
||||||
|
@ -855,7 +855,7 @@ void LOLIN_HP303B::init(void)
|
||||||
if(revId < 0)
|
if(revId < 0)
|
||||||
{
|
{
|
||||||
m_initFail = 1U;
|
m_initFail = 1U;
|
||||||
return;
|
return 0U;
|
||||||
}
|
}
|
||||||
m_revisionID = revId;
|
m_revisionID = revId;
|
||||||
|
|
||||||
|
@ -864,7 +864,7 @@ void LOLIN_HP303B::init(void)
|
||||||
if(sensor < 0)
|
if(sensor < 0)
|
||||||
{
|
{
|
||||||
m_initFail = 1U;
|
m_initFail = 1U;
|
||||||
return;
|
return 0U;
|
||||||
}
|
}
|
||||||
|
|
||||||
//...and use this sensor for temperature measurement
|
//...and use this sensor for temperature measurement
|
||||||
|
@ -872,14 +872,14 @@ void LOLIN_HP303B::init(void)
|
||||||
if(writeByteBitfield((uint8_t)sensor, HP303B__REG_INFO_TEMP_SENSOR) < 0)
|
if(writeByteBitfield((uint8_t)sensor, HP303B__REG_INFO_TEMP_SENSOR) < 0)
|
||||||
{
|
{
|
||||||
m_initFail = 1U;
|
m_initFail = 1U;
|
||||||
return;
|
return 0U;
|
||||||
}
|
}
|
||||||
|
|
||||||
//read coefficients
|
//read coefficients
|
||||||
if(readcoeffs() < 0)
|
if(readcoeffs() < 0)
|
||||||
{
|
{
|
||||||
m_initFail = 1U;
|
m_initFail = 1U;
|
||||||
return;
|
return 0U;
|
||||||
}
|
}
|
||||||
|
|
||||||
//set to standby for further configuration
|
//set to standby for further configuration
|
||||||
|
@ -901,6 +901,8 @@ void LOLIN_HP303B::init(void)
|
||||||
// Fix IC with a fuse bit problem, which lead to a wrong temperature
|
// Fix IC with a fuse bit problem, which lead to a wrong temperature
|
||||||
// Should not affect ICs without this problem
|
// Should not affect ICs without this problem
|
||||||
correctTemp();
|
correctTemp();
|
||||||
|
|
||||||
|
return 1U;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -19,10 +19,10 @@ public:
|
||||||
//destructor
|
//destructor
|
||||||
~LOLIN_HP303B(void);
|
~LOLIN_HP303B(void);
|
||||||
//begin
|
//begin
|
||||||
void begin(TwoWire &bus, uint8_t slaveAddress);
|
uint8_t begin(TwoWire &bus, uint8_t slaveAddress);
|
||||||
void begin(uint8_t slaveAddress=HP303B__STD_SLAVE_ADDRESS);
|
uint8_t begin(uint8_t slaveAddress=HP303B__STD_SLAVE_ADDRESS);
|
||||||
void begin(SPIClass &bus, int32_t chipSelect);
|
uint8_t begin(SPIClass &bus, int32_t chipSelect);
|
||||||
void begin(SPIClass &bus, int32_t chipSelect, uint8_t threeWire);
|
uint8_t begin(SPIClass &bus, int32_t chipSelect, uint8_t threeWire);
|
||||||
//end
|
//end
|
||||||
void end(void);
|
void end(void);
|
||||||
|
|
||||||
|
@ -115,7 +115,7 @@ private:
|
||||||
uint8_t m_threeWire;
|
uint8_t m_threeWire;
|
||||||
|
|
||||||
//measurement
|
//measurement
|
||||||
void init(void);
|
uint8_t init(void);
|
||||||
int16_t readcoeffs(void);
|
int16_t readcoeffs(void);
|
||||||
int16_t setOpMode(uint8_t background, uint8_t temperature, uint8_t pressure);
|
int16_t setOpMode(uint8_t background, uint8_t temperature, uint8_t pressure);
|
||||||
int16_t setOpMode(uint8_t opMode);
|
int16_t setOpMode(uint8_t opMode);
|
||||||
|
|
|
@ -29,45 +29,47 @@
|
||||||
#define XSNS_73 73
|
#define XSNS_73 73
|
||||||
#define XI2C_52 52 // See I2CDEVICES.md
|
#define XI2C_52 52 // See I2CDEVICES.md
|
||||||
|
|
||||||
#define HP303B_ADDR1 0x77
|
|
||||||
#define HP303B_ADDR2 0x76
|
|
||||||
|
|
||||||
#include <LOLIN_HP303B.h>
|
#include <LOLIN_HP303B.h>
|
||||||
// HP303B Opject
|
// HP303B Object
|
||||||
LOLIN_HP303B HP303BSensor = LOLIN_HP303B();
|
LOLIN_HP303B HP303BSensor = LOLIN_HP303B();
|
||||||
uint8_t bhp303b_addresses[2] = {HP303B_ADDR1, HP303B_ADDR2};
|
|
||||||
|
#define HP303B_MAX_SENSORS 2
|
||||||
|
#define HP303B_START_ADDRESS 0x76
|
||||||
|
|
||||||
|
struct {
|
||||||
|
char types[7] = "HP303B";
|
||||||
|
uint8_t count = 0;
|
||||||
|
int16_t oversampling = 7;
|
||||||
|
} hp303b_cfg;
|
||||||
|
|
||||||
struct BHP303B {
|
struct BHP303B {
|
||||||
uint8_t address;
|
uint8_t address;
|
||||||
uint8_t type = 0;
|
|
||||||
uint8_t valid = 0;
|
uint8_t valid = 0;
|
||||||
float temperature;
|
float temperature = NAN;
|
||||||
float pressure;
|
float pressure = NAN;
|
||||||
int16_t oversampling = 7;
|
} hp303b_sensor[HP303B_MAX_SENSORS];
|
||||||
char name[7] = "HP303B";
|
|
||||||
} bhp303b_sensor;
|
|
||||||
/*********************************************************************************************/
|
/*********************************************************************************************/
|
||||||
|
|
||||||
bool HP303B_Read()
|
bool HP303B_Read(uint8_t hp303b_idx)
|
||||||
{
|
{
|
||||||
if (bhp303b_sensor.valid) { bhp303b_sensor.valid--; }
|
if (hp303b_sensor[hp303b_idx].valid) { hp303b_sensor[hp303b_idx].valid--; }
|
||||||
|
|
||||||
float t;
|
float t;
|
||||||
float p;
|
float p;
|
||||||
int16_t ret;
|
int16_t ret;
|
||||||
|
|
||||||
ret = HP303BSensor.measureTempOnce(t, bhp303b_sensor.oversampling);
|
ret = HP303BSensor.measureTempOnce(t, hp303b_cfg.oversampling);
|
||||||
if (ret != 0)
|
if (ret != 0)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
ret = HP303BSensor.measurePressureOnce(p, bhp303b_sensor.oversampling);
|
ret = HP303BSensor.measurePressureOnce(p, hp303b_cfg.oversampling);
|
||||||
if (ret != 0)
|
if (ret != 0)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
bhp303b_sensor.temperature = (float)ConvertTemp(t);
|
hp303b_sensor[hp303b_idx].temperature = (float)ConvertTemp(t);
|
||||||
bhp303b_sensor.pressure = (float)ConvertPressure(p) / 100; //conversion to hPa
|
hp303b_sensor[hp303b_idx].pressure = (float)ConvertPressure(p) / 100; //conversion to hPa
|
||||||
|
|
||||||
bhp303b_sensor.valid = SENSOR_MAX_MISS;
|
hp303b_sensor[hp303b_idx].valid = SENSOR_MAX_MISS;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -75,18 +77,15 @@ bool HP303B_Read()
|
||||||
|
|
||||||
void HP303B_Detect(void)
|
void HP303B_Detect(void)
|
||||||
{
|
{
|
||||||
for (uint32_t i = 0; i < sizeof(bhp303b_addresses); i++)
|
for (uint32_t i = 0; i < HP303B_MAX_SENSORS; i++)
|
||||||
{
|
{
|
||||||
if (I2cActive(bhp303b_addresses[i])) { return; }
|
if (I2cActive(HP303B_START_ADDRESS + i)) { return; }
|
||||||
|
|
||||||
bhp303b_sensor.address = bhp303b_addresses[i];
|
if (HP303BSensor.begin(HP303B_START_ADDRESS + i))
|
||||||
|
|
||||||
HP303BSensor.begin( bhp303b_sensor.address);
|
|
||||||
|
|
||||||
if (HP303B_Read())
|
|
||||||
{
|
{
|
||||||
I2cSetActiveFound(bhp303b_sensor.address, bhp303b_sensor.name);
|
hp303b_sensor[hp303b_cfg.count].address = HP303B_START_ADDRESS + i;
|
||||||
bhp303b_sensor.type = 1;
|
I2cSetActiveFound(hp303b_sensor[hp303b_cfg.count].address, hp303b_cfg.types);
|
||||||
|
hp303b_cfg.count++;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -94,39 +93,49 @@ void HP303B_Detect(void)
|
||||||
|
|
||||||
void HP303B_EverySecond(void)
|
void HP303B_EverySecond(void)
|
||||||
{
|
{
|
||||||
if (uptime &1) {
|
for (uint32_t i = 0; i < hp303b_cfg.count; i++) {
|
||||||
if (!HP303B_Read()) {
|
if (uptime &1) {
|
||||||
AddLogMissed(bhp303b_sensor.name, bhp303b_sensor.valid);
|
if (!HP303B_Read(i)) {
|
||||||
|
AddLogMissed(hp303b_cfg.types, hp303b_sensor[i].valid);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void HP303B_Show(bool json)
|
void HP303B_Show(bool json)
|
||||||
{
|
{
|
||||||
if (bhp303b_sensor.valid)
|
for (uint32_t i = 0; i < hp303b_cfg.count; i++) {
|
||||||
{
|
char sensor_name[12];
|
||||||
char str_temperature[33];
|
strlcpy(sensor_name, hp303b_cfg.types, sizeof(sensor_name));
|
||||||
dtostrfd(bhp303b_sensor.temperature, Settings.flag2.temperature_resolution, str_temperature);
|
if (hp303b_cfg.count > 1) {
|
||||||
char str_pressure[33];
|
snprintf_P(sensor_name, sizeof(sensor_name), PSTR("%s%c0x%02X"), sensor_name, IndexSeparator(), hp303b_sensor[i].address); // MCP9808-18, MCP9808-1A etc.
|
||||||
dtostrfd(bhp303b_sensor.pressure, Settings.flag2.pressure_resolution, str_pressure);
|
|
||||||
|
|
||||||
if (json)
|
|
||||||
{
|
|
||||||
ResponseAppend_P(PSTR(",\"HP303B\":{\"" D_JSON_TEMPERATURE "\":%s,\"" D_JSON_PRESSURE "\":%s"), str_temperature, str_pressure);
|
|
||||||
ResponseJsonEnd();
|
|
||||||
#ifdef USE_DOMOTICZ
|
|
||||||
if (0 == tele_period)
|
|
||||||
{
|
|
||||||
DomoticzSensor(DZ_TEMP, bhp303b_sensor.temperature);
|
|
||||||
}
|
|
||||||
#endif // USE_DOMOTICZ
|
|
||||||
#ifdef USE_WEBSERVER
|
|
||||||
}
|
}
|
||||||
else
|
|
||||||
|
if (hp303b_sensor[i].valid)
|
||||||
{
|
{
|
||||||
WSContentSend_PD(HTTP_SNS_TEMP, "HP303B", str_temperature, TempUnit());
|
char str_temperature[33];
|
||||||
WSContentSend_PD(HTTP_SNS_PRESSURE, "HP303B", str_pressure, PressureUnit().c_str());
|
dtostrfd(hp303b_sensor[i].temperature, Settings.flag2.temperature_resolution, str_temperature);
|
||||||
#endif // USE_WEBSERVER
|
char str_pressure[33];
|
||||||
|
dtostrfd(hp303b_sensor[i].pressure, Settings.flag2.pressure_resolution, str_pressure);
|
||||||
|
|
||||||
|
if (json)
|
||||||
|
{
|
||||||
|
ResponseAppend_P(PSTR(",\"%s\":{\"" D_JSON_TEMPERATURE "\":%s,\"" D_JSON_PRESSURE "\":%s"), sensor_name, str_temperature, str_pressure);
|
||||||
|
ResponseJsonEnd();
|
||||||
|
#ifdef USE_DOMOTICZ
|
||||||
|
if (0 == tele_period)
|
||||||
|
{
|
||||||
|
DomoticzSensor(DZ_TEMP, hp303b_sensor[i].temperature);
|
||||||
|
}
|
||||||
|
#endif // USE_DOMOTICZ
|
||||||
|
#ifdef USE_WEBSERVER
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
WSContentSend_PD(HTTP_SNS_TEMP, sensor_name, str_temperature, TempUnit());
|
||||||
|
WSContentSend_PD(HTTP_SNS_PRESSURE, sensor_name, str_pressure, PressureUnit().c_str());
|
||||||
|
#endif // USE_WEBSERVER
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -144,7 +153,7 @@ bool Xsns73(uint8_t function)
|
||||||
if (FUNC_INIT == function) {
|
if (FUNC_INIT == function) {
|
||||||
HP303B_Detect();
|
HP303B_Detect();
|
||||||
}
|
}
|
||||||
else if (bhp303b_sensor.type)
|
else if (hp303b_cfg.count)
|
||||||
{
|
{
|
||||||
switch (function)
|
switch (function)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue