Add support for second I2C bus to some sensors

This commit is contained in:
Theo Arends
2026-03-11 12:35:25 +01:00
parent a932b3d991
commit 783d18607f
73 changed files with 2993 additions and 2036 deletions
@@ -348,18 +348,19 @@ void DS3231Detected(void) {
* Read time and return the epoch time (second since 1-1-1970 00:00)
\*-------------------------------------------------------------------------------------------*/
uint32_t Pcf85063ReadTime(void) {
Wire.beginTransmission(RtcChip.address);
Wire.write(PCF85063_REG_SECONDS);
Wire.endTransmission(false); // false -> repeated start
Wire.requestFrom((uint8_t)RtcChip.address, (uint8_t)7);
TwoWire& myWire = I2cGetWire(RtcChip.bus);
myWire.beginTransmission(RtcChip.address);
myWire.write(PCF85063_REG_SECONDS);
myWire.endTransmission(false); // false -> repeated start
myWire.requestFrom((uint8_t)RtcChip.address, (uint8_t)7);
uint8_t sec = Wire.read(); // 0x04
uint8_t min = Wire.read(); // 0x05
uint8_t hour = Wire.read(); // 0x06
uint8_t day = Wire.read(); // 0x07
uint8_t wday = Wire.read(); // 0x08
uint8_t month = Wire.read(); // 0x09
uint8_t year = Wire.read(); // 0x0A
uint8_t sec = myWire.read(); // 0x04
uint8_t min = myWire.read(); // 0x05
uint8_t hour = myWire.read(); // 0x06
uint8_t day = myWire.read(); // 0x07
uint8_t wday = myWire.read(); // 0x08
uint8_t month = myWire.read(); // 0x09
uint8_t year = myWire.read(); // 0x0A
TIME_T tm;
tm.second = Bcd2Dec(sec & 0x7F);
@@ -391,16 +392,17 @@ void Pcf85063SetTime(uint32_t epoch_time) {
uint8_t bcd_month = Dec2Bcd(tm.month +1);
uint8_t bcd_year = Dec2Bcd(year);
Wire.beginTransmission(RtcChip.address);
Wire.write(PCF85063_REG_SECONDS);
Wire.write(bcd_sec);
Wire.write(bcd_min);
Wire.write(bcd_hour);
Wire.write(bcd_day);
Wire.write(bcd_wday);
Wire.write(bcd_month);
Wire.write(bcd_year);
Wire.endTransmission();
TwoWire& myWire = I2cGetWire(RtcChip.bus);
myWire.beginTransmission(RtcChip.address);
myWire.write(PCF85063_REG_SECONDS);
myWire.write(bcd_sec);
myWire.write(bcd_min);
myWire.write(bcd_hour);
myWire.write(bcd_day);
myWire.write(bcd_wday);
myWire.write(bcd_month);
myWire.write(bcd_year);
myWire.endTransmission();
}
/*-------------------------------------------------------------------------------------------*\
@@ -409,17 +411,18 @@ void Pcf85063SetTime(uint32_t epoch_time) {
void Pcf85063Detected(void) {
if (!RtcChip.detected && I2cEnabled(XI2C_92)) {
RtcChip.address = PCF85063_ADDRESS;
// Vyskúšame, či vieme prečítať nejaký register
if (I2cSetDevice(RtcChip.address)) {
for (RtcChip.bus = 0; RtcChip.bus < 2; RtcChip.bus++) {
// Vyskúšame, či vieme prečítať nejaký register
if (!I2cSetDevice(RtcChip.address, RtcChip.bus)) { continue; }
// Skúsime napr. prečítať PCF85063_REG_CTRL1
if (I2cValidRead(RtcChip.address, PCF85063_REG_CTRL1, 1)) {
if (I2cValidRead(RtcChip.address, PCF85063_REG_CTRL1, 1, RtcChip.bus)) {
RtcChip.detected = 1;
strcpy_P(RtcChip.name, PSTR("PCF85063"));
RtcChip.ReadTime = &Pcf85063ReadTime;
RtcChip.SetTime = &Pcf85063SetTime;
RtcChip.mem_size = -1; // Nemá extra user RAM, ak by si nepotreboval
// Ak by si chcel implementovať MemRead/MemWrite, doplň RtcChip.MemRead a RtcChip.MemWrite
break;
}
}
}
@@ -519,14 +522,15 @@ void BM8563Detected(void) {
* Read time and return the epoch time (second since 1-1-1970 00:00)
\*-------------------------------------------------------------------------------------------*/
uint32_t Pcf85363ReadTime(void) {
Wire.beginTransmission(RtcChip.address);
Wire.write(0x00);
Wire.endTransmission();
TwoWire& myWire = I2cGetWire(RtcChip.bus);
myWire.beginTransmission(RtcChip.address);
myWire.write(0x00);
myWire.endTransmission();
uint8_t buffer[8];
Wire.requestFrom(RtcChip.address, (uint8_t)8);
for (uint32_t i = 0; i < 8; i++) { buffer[i] = Wire.read(); }
Wire.endTransmission();
myWire.requestFrom(RtcChip.address, (uint8_t)8);
for (uint32_t i = 0; i < 8; i++) { buffer[i] = myWire.read(); }
myWire.endTransmission();
TIME_T tm;
tm.second = Bcd2Dec(buffer[1] & 0x7F);
@@ -555,23 +559,25 @@ void Pcf85363SetTime(uint32_t epoch_time) {
buffer[5] = tm.day_of_week;
buffer[6] = Dec2Bcd(tm.month);
buffer[7] = Dec2Bcd(tm.year -30); // Offset from 1970
TwoWire& myWire = I2cGetWire(RtcChip.bus);
/*
// Handbook page 13
Wire.beginTransmission(RtcChip.address);
Wire.write(0x2E);
Wire.write(0x01); // Set stop
Wire.write(0xA4); // Clear prescaler
for (uint32_t i = 0; i < 8; i++) { Wire.write(buffer[i]); }
Wire.endTransmission();
Wire.beginTransmission(RtcChip.address);
Wire.write(0x2E);
Wire.write(0x00); // Set start
Wire.endTransmission();
myWire.beginTransmission(RtcChip.address);
myWire.write(0x2E);
myWire.write(0x01); // Set stop
myWire.write(0xA4); // Clear prescaler
for (uint32_t i = 0; i < 8; i++) { myWire.write(buffer[i]); }
myWire.endTransmission();
myWire.beginTransmission(RtcChip.address);
myWire.write(0x2E);
myWire.write(0x00); // Set start
myWire.endTransmission();
*/
Wire.beginTransmission(RtcChip.address);
Wire.write(0x00);
for (uint32_t i = 0; i < 8; i++) { Wire.write(buffer[i]); }
Wire.endTransmission();
myWire.beginTransmission(RtcChip.address);
myWire.write(0x00);
for (uint32_t i = 0; i < 8; i++) { myWire.write(buffer[i]); }
myWire.endTransmission();
}
/*-------------------------------------------------------------------------------------------*\
@@ -581,26 +587,27 @@ void Pcf85363SetTime(uint32_t epoch_time) {
void Pcf85363Dump(void) {
uint8_t buffer[64];
TwoWire& myWire = I2cGetWire(RtcChip.bus);
// 0x00 to 0x2F
Wire.beginTransmission(RtcChip.address);
Wire.write(0x00);
Wire.endTransmission();
Wire.requestFrom(RtcChip.address, (uint8_t)48);
myWire.beginTransmission(RtcChip.address);
myWire.write(0x00);
myWire.endTransmission();
myWire.requestFrom(RtcChip.address, (uint8_t)48);
for (uint32_t i = 0; i < 48; i++) {
buffer[i] = Wire.read();
buffer[i] = myWire.read();
}
Wire.endTransmission();
myWire.endTransmission();
AddLog(LOG_LEVEL_DEBUG, PSTR("P85: Read 0x00: %48_H"), buffer);
// 0x40 to 0x7F
Wire.beginTransmission(RtcChip.address);
Wire.write(0x40);
Wire.endTransmission();
Wire.requestFrom(RtcChip.address, (uint8_t)64);
myWire.beginTransmission(RtcChip.address);
myWire.write(0x40);
myWire.endTransmission();
myWire.requestFrom(RtcChip.address, (uint8_t)64);
for (uint32_t i = 0; i < 64; i++) {
buffer[i] = Wire.read();
buffer[i] = myWire.read();
}
Wire.endTransmission();
myWire.endTransmission();
AddLog(LOG_LEVEL_DEBUG, PSTR("P85: Read 0x40: %64_H"), buffer);
}
*/
@@ -609,11 +616,11 @@ void Pcf85363Dump(void) {
* Memory block functions
\*-------------------------------------------------------------------------------------------*/
int32_t Pcf8563MemRead(uint8_t *buffer, uint32_t size) {
return I2cReadBuffer(RtcChip.address, 0x40, buffer, size);
return I2cReadBuffer(RtcChip.address, 0x40, buffer, size, RtcChip.bus);
}
int32_t Pcf8563MemWrite(uint8_t *buffer, uint32_t size) {
return I2cWriteBuffer(RtcChip.address, 0x40, (uint8_t *)buffer, size);
return I2cWriteBuffer(RtcChip.address, 0x40, (uint8_t *)buffer, size, RtcChip.bus);
}
/*-------------------------------------------------------------------------------------------*\
@@ -622,7 +629,8 @@ int32_t Pcf8563MemWrite(uint8_t *buffer, uint32_t size) {
void Pcf85363Detected(void) {
if (!RtcChip.detected && I2cEnabled(XI2C_66)) {
RtcChip.address = PCF85363_ADDRESS;
if (I2cSetDevice(RtcChip.address)) {
for (RtcChip.bus = 0; RtcChip.bus < 2; RtcChip.bus++) {
if (!I2cSetDevice(RtcChip.address, RtcChip.bus)) { continue; }
RtcChip.detected = 1;
strcpy_P(RtcChip.name, PSTR("PCF85363"));
RtcChip.ReadTime = &Pcf85363ReadTime;
@@ -64,15 +64,15 @@ bool Sen5xError(const char* func, int error) {
void sen5x_Init(void) {
PowerOnDelay(60); // Sensor startup time (Time after power-on until I2C communication can be started)
for (uint32_t bus = 0; bus < 2; bus++) {
if (!I2cSetDevice(SEN5X_ADDRESS, bus)) {
continue;
}
if (!I2cSetDevice(SEN5X_ADDRESS, bus)) { continue; }
sen5x = new SensirionI2CSen5x();
sen5x->begin(I2cGetWire(bus));
if (!Settings->flag6.sen5x_passive_mode) { // SetOption156 - (Sen5x) Run in passive mode when there is another I2C master (e.g. Ikea Vindstyrka), i.e. do not set up Sen5x sensor, higher polling interval
if (Sen5xError("Reset", sen5x->deviceReset())) { // Performs delay(200) if no error
continue;
if (sen5x->deviceReset()) { // Performs delay(200) if no error
if (Sen5xError("Reset", sen5x->deviceReset())) { // See https://github.com/arendst/Tasmota/discussions/24452
continue;
}
}
delay(1100); // Wait 1 second for sensors to start recording + 100ms for reset command
if (Sen5xError("Measurement", sen5x->startMeasurement())) {
+10 -6
View File
@@ -44,12 +44,16 @@ float sgp30_abshum;
void sgp30_Init(void) {
for (uint32_t bus = 0; bus < 2; bus++) {
if (!I2cSetDevice(SGP30_ADDRESS, bus)) { continue; }
if (sgp.begin(&I2cGetWire(bus))) {
sgp30_type = true;
// AddLog(LOG_LEVEL_DEBUG, PSTR("SGP: Serialnumber 0x%04X-0x%04X-0x%04X"), sgp.serialnumber[0], sgp.serialnumber[1], sgp.serialnumber[2]);
I2cSetActiveFound(SGP30_ADDRESS, "SGP30", bus);
return;
if (!sgp.begin(&I2cGetWire(bus))) {
if (!sgp.IAQinit()) { continue; } // Fix I2C bus incompatibilities
if (!sgp.begin(&I2cGetWire(bus))) { continue; }
}
sgp30_type = true;
I2cSetActiveFound(SGP30_ADDRESS, "SGP30", bus);
uint64_t serialnumber = (uint64_t)sgp.serialnumber[0] << 32 | sgp.serialnumber[1] << 16 | sgp.serialnumber[2];
AddLog(LOG_LEVEL_DEBUG, PSTR("SG3: Serialnumber %_U"), &serialnumber);
return;
}
}
@@ -98,7 +102,7 @@ void Sgp30Update(void) // Perform every second to ensure proper operation of th
uint16_t eCO2_base;
if (!sgp.getIAQBaseline(&eCO2_base, &TVOC_base)) return; // Failed to get baseline readings
// AddLog(LOG_LEVEL_DEBUG, PSTR("SGP: Baseline values eCO2 0x%04X, TVOC 0x%04X"), eCO2_base, TVOC_base);
// AddLog(LOG_LEVEL_DEBUG, PSTR("SG3: Baseline values eCO2 0x%04X, TVOC 0x%04X"), eCO2_base, TVOC_base);
}
}
@@ -44,13 +44,13 @@ uint8_t ecnt = 0;
/********************************************************************************************/
void CCS811Detect(void)
{
if (!I2cSetDevice(CCS811_ADDRESS)) { return; }
if (!ccs.begin(CCS811_ADDRESS)) {
void CCS811Detect(void) {
for (uint32_t bus = 0; bus < 2; bus++) {
if (!I2cSetDevice(CCS811_ADDRESS, bus)) { continue; }
if (!ccs.begin(CCS811_ADDRESS, &I2cGetWire(bus))) { continue; }
CCS811_type = 1;
I2cSetActiveFound(CCS811_ADDRESS, "CCS811");
return;
}
}
@@ -44,14 +44,16 @@ int32_t voc_index;
/********************************************************************************************/
void sgp40_Init(void)
{
if (!I2cSetDevice(SGP40_ADDRESS)) { return; }
if (sgp40.begin()) {
void sgp40_Init(void) {
for (uint32_t bus = 0; bus < 2; bus++) {
if (!I2cSetDevice(SGP40_ADDRESS, bus)) { continue; }
if (!sgp40.begin(&I2cGetWire(bus))) { continue; }
sgp40_type = true;
// AddLog(LOG_LEVEL_DEBUG, PSTR("SGP: Serialnumber 0x%04X-0x%04X-0x%04X"), sgp40.serialnumber[0], sgp40.serialnumber[1], sgp40.serialnumber[2]);
I2cSetActiveFound(SGP40_ADDRESS, "SGP40");
uint64_t serialnumber = (uint64_t)sgp40.serialnumber[0] << 32 | sgp40.serialnumber[1] << 16 | sgp40.serialnumber[2];
AddLog(LOG_LEVEL_DEBUG, PSTR("SG4: Serialnumber %_U"), &serialnumber);
return;
}
}