Refactor I2C driver detection phase 7

This commit is contained in:
Theo Arends 2019-11-11 18:36:13 +01:00
parent 3c89dedb92
commit 9c9d177ad5
7 changed files with 278 additions and 358 deletions

View File

@ -30,6 +30,8 @@
#define XSNS_31 31 #define XSNS_31 31
#define XI2C_24 24 // See I2CDEVICES.md #define XI2C_24 24 // See I2CDEVICES.md
#define EVERYNSECONDS 5
#include "Adafruit_CCS811.h" #include "Adafruit_CCS811.h"
Adafruit_CCS811 ccs; Adafruit_CCS811 ccs;
@ -41,40 +43,37 @@ uint8_t tcnt = 0;
uint8_t ecnt = 0; uint8_t ecnt = 0;
/********************************************************************************************/ /********************************************************************************************/
#define EVERYNSECONDS 5
void CCS811Update(void) // Perform every n second void CCS811Detect(void)
{ {
if (I2cActive(CCS811_ADDRESS)) { return; } if (I2cActive(CCS811_ADDRESS)) { return; }
if (!ccs.begin(CCS811_ADDRESS)) {
CCS811_type = 1;
I2cSetActiveFound(CCS811_ADDRESS, "CCS811");
}
}
void CCS811Update(void) // Perform every n second
{
tcnt++; tcnt++;
if (tcnt >= EVERYNSECONDS) { if (tcnt >= EVERYNSECONDS) {
tcnt = 0; tcnt = 0;
CCS811_ready = 0; CCS811_ready = 0;
if (!CCS811_type) { if (ccs.available()) {
sint8_t res = ccs.begin(CCS811_ADDRESS); if (!ccs.readData()){
if (!res) { TVOC = ccs.getTVOC();
CCS811_type = 1; eCO2 = ccs.geteCO2();
I2cSetActiveFound(CCS811_ADDRESS, "CCS811"); CCS811_ready = 1;
} else { if (global_update && global_humidity>0 && global_temperature!=9999) { ccs.setEnvironmentalData((uint8_t)global_humidity, global_temperature); }
//AddLog_P2(LOG_LEVEL_DEBUG, "CCS811 init failed: %d",res); ecnt = 0;
} }
} else { } else {
if (ccs.available()) { // failed, count up
if (!ccs.readData()){ ecnt++;
TVOC = ccs.getTVOC(); if (ecnt > 6) {
eCO2 = ccs.geteCO2(); // after 30 seconds, restart
CCS811_ready = 1; ccs.begin(CCS811_ADDRESS);
if (global_update && global_humidity>0 && global_temperature!=9999) { ccs.setEnvironmentalData((uint8_t)global_humidity, global_temperature); }
ecnt = 0;
}
} else {
// failed, count up
ecnt++;
if (ecnt > 6) {
// after 30 seconds, restart
ccs.begin(CCS811_ADDRESS);
}
} }
} }
} }
@ -110,18 +109,23 @@ bool Xsns31(uint8_t function)
bool result = false; bool result = false;
switch (function) { if (FUNC_INIT == function) {
case FUNC_EVERY_SECOND: CCS811Detect();
CCS811Update(); }
break; else if (CCS811_type) {
case FUNC_JSON_APPEND: switch (function) {
CCS811Show(1); case FUNC_EVERY_SECOND:
break; CCS811Update();
break;
case FUNC_JSON_APPEND:
CCS811Show(1);
break;
#ifdef USE_WEBSERVER #ifdef USE_WEBSERVER
case FUNC_WEB_SENSOR: case FUNC_WEB_SENSOR:
CCS811Show(0); CCS811Show(0);
break; break;
#endif // USE_WEBSERVER #endif // USE_WEBSERVER
}
} }
return result; return result;
} }

View File

@ -67,8 +67,6 @@ MPU6050 mpu6050;
void MPU_6050PerformReading(void) void MPU_6050PerformReading(void)
{ {
if (!MPU_6050_found) { return; }
#ifdef USE_MPU6050_DMP #ifdef USE_MPU6050_DMP
mpu6050.resetFIFO(); // with a default dampling rate of 200Hz, we create a delay of approx. 5ms with a complete read cycle mpu6050.resetFIFO(); // with a default dampling rate of 200Hz, we create a delay of approx. 5ms with a complete read cycle
MPU6050_dmp.fifoCount = mpu6050.getFIFOCount(); MPU6050_dmp.fifoCount = mpu6050.getFIFOCount();
@ -118,8 +116,6 @@ void MPU_6050SetAccelOffsets(int x, int y, int z)
void MPU_6050Detect(void) void MPU_6050Detect(void)
{ {
if (MPU_6050_found) { return; }
for (uint32_t i = 0; i < sizeof(MPU_6050_addresses); i++) for (uint32_t i = 0; i < sizeof(MPU_6050_addresses); i++)
{ {
MPU_6050_address = MPU_6050_addresses[i]; MPU_6050_address = MPU_6050_addresses[i];
@ -144,8 +140,7 @@ void MPU_6050Detect(void)
Settings.flag2.axis_resolution = 2; // Need to be services by command Sensor32 Settings.flag2.axis_resolution = 2; // Need to be services by command Sensor32
} }
if (MPU_6050_found) if (MPU_6050_found) {
{
I2cSetActiveFound(MPU_6050_address, D_SENSOR_MPU6050); I2cSetActiveFound(MPU_6050_address, D_SENSOR_MPU6050);
} }
} }
@ -169,8 +164,6 @@ const char HTTP_SNS_AXIS[] PROGMEM =
void MPU_6050Show(bool json) void MPU_6050Show(bool json)
{ {
if (!MPU_6050_found) { return; }
MPU_6050PerformReading(); MPU_6050PerformReading();
double tempConv = (MPU_6050_temperature / 340.0 + 35.53); double tempConv = (MPU_6050_temperature / 340.0 + 35.53);
@ -225,24 +218,26 @@ bool Xsns32(uint8_t function)
bool result = false; bool result = false;
switch (function) { if (FUNC_INIT == function) {
case FUNC_EVERY_SECOND: MPU_6050Detect();
if (tele_period == Settings.tele_period -3) { }
MPU_6050PerformReading(); else if (MPU_6050_found) {
} switch (function) {
break; case FUNC_EVERY_SECOND:
case FUNC_JSON_APPEND: if (tele_period == Settings.tele_period -3) {
MPU_6050Show(1); MPU_6050PerformReading();
break; }
break;
case FUNC_JSON_APPEND:
MPU_6050Show(1);
break;
#ifdef USE_WEBSERVER #ifdef USE_WEBSERVER
case FUNC_WEB_SENSOR: case FUNC_WEB_SENSOR:
MPU_6050Show(0); MPU_6050Show(0);
MPU_6050PerformReading(); MPU_6050PerformReading();
break; break;
#endif // USE_WEBSERVER #endif // USE_WEBSERVER
case FUNC_INIT: }
MPU_6050Detect();
break;
} }
return result; return result;
} }

View File

@ -72,7 +72,7 @@ bool DS3231chipDetected = false;
----------------------------------------------------------------------*/ ----------------------------------------------------------------------*/
void DS3231Detect(void) void DS3231Detect(void)
{ {
if (DS3231chipDetected || I2cActive(USE_RTC_ADDR)) { return; } if (I2cActive(USE_RTC_ADDR)) { return; }
if (I2cValidRead(USE_RTC_ADDR, RTC_STATUS, 1)) { if (I2cValidRead(USE_RTC_ADDR, RTC_STATUS, 1)) {
I2cSetActiveFound(USE_RTC_ADDR, "DS3231"); I2cSetActiveFound(USE_RTC_ADDR, "DS3231");
@ -129,8 +129,6 @@ void SetDS3231Time (uint32_t epoch_time) {
void DS3231EverySecond(void) void DS3231EverySecond(void)
{ {
if (!DS3231chipDetected) { return; }
TIME_T tmpTime; TIME_T tmpTime;
if (!ds3231ReadStatus && Rtc.utc_time < START_VALID_TIME ) { // We still did not sync with NTP (time not valid) , so, read time from DS3231 if (!ds3231ReadStatus && Rtc.utc_time < START_VALID_TIME ) { // We still did not sync with NTP (time not valid) , so, read time from DS3231
ntp_force_sync = true; //force to sync with ntp ntp_force_sync = true; //force to sync with ntp
@ -170,13 +168,15 @@ bool Xsns33(uint8_t function)
bool result = false; bool result = false;
switch (function) { if (FUNC_INIT == function) {
case FUNC_EVERY_SECOND: DS3231Detect();
DS3231EverySecond(); }
break; else if (DS3231chipDetected) {
case FUNC_INIT: switch (function) {
DS3231Detect(); case FUNC_EVERY_SECOND:
break; DS3231EverySecond();
break;
}
} }
return result; return result;
} }

View File

@ -66,8 +66,6 @@ bool Max4409Read_lum(void)
void Max4409Detect(void) void Max4409Detect(void)
{ {
if (max44009_found) { return; }
uint8_t buffer1; uint8_t buffer1;
uint8_t buffer2; uint8_t buffer2;
for (uint32_t i = 0; 0 != max44009_addresses[i]; i++) { for (uint32_t i = 0; 0 != max44009_addresses[i]; i++) {
@ -101,9 +99,7 @@ void Max4409Detect(void)
void Max4409EverySecond(void) void Max4409EverySecond(void)
{ {
if (max44009_found) { Max4409Read_lum();
Max4409Read_lum();
}
} }
void Max4409Show(bool json) void Max4409Show(bool json)
@ -150,21 +146,23 @@ bool Xsns41(uint8_t function)
bool result = false; bool result = false;
switch (function) { if (FUNC_INIT == function) {
case FUNC_EVERY_SECOND: Max4409Detect();
Max4409EverySecond(); }
break; else if (max44009_found) {
case FUNC_JSON_APPEND: switch (function) {
Max4409Show(1); case FUNC_EVERY_SECOND:
break; Max4409EverySecond();
#ifdef USE_WEBSERVER break;
case FUNC_WEB_SENSOR: case FUNC_JSON_APPEND:
Max4409Show(0); Max4409Show(1);
break; break;
#endif // USE_WEBSERVER #ifdef USE_WEBSERVER
case FUNC_INIT: case FUNC_WEB_SENSOR:
Max4409Detect(); Max4409Show(0);
break; break;
#endif // USE_WEBSERVER
}
} }
return result; return result;
} }

View File

@ -20,8 +20,10 @@
#ifdef USE_I2C #ifdef USE_I2C
#ifdef USE_SCD30 #ifdef USE_SCD30
#define XSNS_42 42 #define XSNS_42 42
#define XI2C_29 29 // See I2CDEVICES.md #define XI2C_29 29 // See I2CDEVICES.md
#define SCD30_ADDRESS 0x61
#define SCD30_MAX_MISSED_READS 3 #define SCD30_MAX_MISSED_READS 3
#define SCD30_STATE_NO_ERROR 0 #define SCD30_STATE_NO_ERROR 0
@ -55,8 +57,6 @@ enum SCD30_Commands { // commands useable in console or rules
CMND_SCD30_TEMPOFFSET CMND_SCD30_TEMPOFFSET
}; };
FrogmoreScd30 scd30; FrogmoreScd30 scd30;
bool scd30Found = false; bool scd30Found = false;
@ -75,223 +75,149 @@ uint16_t scd30_CO2EAvg = 0;
float scd30_Humid = 0.0; float scd30_Humid = 0.0;
float scd30_Temp = 0.0; float scd30_Temp = 0.0;
bool Scd30Init() void Scd30Detect(void)
{ {
int error; if (I2cActive(SCD30_ADDRESS)) { return; }
bool i2c_flg = ((pin[GPIO_I2C_SCL] < 99) && (pin[GPIO_I2C_SDA] < 99));
if (i2c_flg)
{
uint8_t major = 0;
uint8_t minor = 0;
uint16_t interval_sec;
scd30.begin();
error = scd30.getFirmwareVersion(&major, &minor);
if (error)
{
#ifdef SCD30_DEBUG
snprintf_P(log_data, sizeof(log_data), "SCD30: did not find an SCD30: 0x%lX", error);
AddLog(LOG_LEVEL_DEBUG);
#endif
return false;
}
else
{
#ifdef SCD30_DEBUG
snprintf_P(log_data, sizeof(log_data), "SCD30: found an SCD30: FW v%d.%d", major, minor);
AddLog(LOG_LEVEL_INFO);
#endif
}
error = scd30.getMeasurementInterval(&scd30Interval_sec); scd30.begin();
if (error)
{
#ifdef SCD30_DEBUG
snprintf_P(log_data, sizeof(log_data), "SCD30: error getMeasurementInterval: 0x%lX", error);
AddLog(LOG_LEVEL_ERROR);
#endif
return false;
}
error = scd30.beginMeasuring(); uint8_t major = 0;
if (error) uint8_t minor = 0;
{ if (scd30.getFirmwareVersion(&major, &minor)) { return; }
#ifdef SCD30_DEBUG uint16_t interval_sec;
snprintf_P(log_data, sizeof(log_data), "Error: Scd30BeginMeasuring: 0x%lX", error); if (scd30.getMeasurementInterval(&scd30Interval_sec)) { return; }
AddLog(LOG_LEVEL_ERROR); if (scd30.beginMeasuring()) { return; }
#endif
return false;
}
return true; I2cSetActiveFound(SCD30_ADDRESS, "SCD30");
} scd30Found = true;
AddLog_P2(LOG_LEVEL_DEBUG, PSTR("SCD: FW v%d.%d"), major, minor);
} }
// gets data from the sensor every 3 seconds or so to give the sensor time to gather new data // gets data from the sensor every 3 seconds or so to give the sensor time to gather new data
int Scd30Update() void Scd30Update(void)
{ {
int error = 0;
int16_t delta = 0;
scd30Loop_count++; scd30Loop_count++;
if (scd30Loop_count > (scd30Interval_sec - 1)) {
if (!scd30Found) int error = 0;
{ switch (scd30ErrorState) {
scd30Found = Scd30Init(); case SCD30_STATE_NO_ERROR: {
#ifdef SCD30_DEBUG error = scd30.readMeasurement(&scd30_CO2, &scd30_CO2EAvg, &scd30_Temp, &scd30_Humid);
snprintf_P(log_data, sizeof(log_data), "Scd30Update: found: %d ", scd30Found); switch (error) {
AddLog(LOG_LEVEL_INFO); case ERROR_SCD30_NO_ERROR:
#endif scd30Loop_count = 0;
if (!scd30Found) scd30IsDataValid = true;
{ scd30GoodMeas_count++;
#ifdef SCD30_DEBUG
snprintf_P(log_data, sizeof(log_data), "Scd30Update: found: %d ", scd30Found);
AddLog(LOG_LEVEL_INFO);
#endif
return (ERROR_SCD30_NOT_FOUND_ERROR);
}
}
else
{
if (scd30Loop_count > (scd30Interval_sec - 1))
{
switch (scd30ErrorState)
{
case SCD30_STATE_NO_ERROR:
{
error = scd30.readMeasurement(&scd30_CO2, &scd30_CO2EAvg, &scd30_Temp, &scd30_Humid);
switch (error)
{
case ERROR_SCD30_NO_ERROR:
scd30Loop_count = 0;
scd30IsDataValid = true;
scd30GoodMeas_count++;
break;
case ERROR_SCD30_NO_DATA:
scd30DataNotAvailable_count++;
break;
case ERROR_SCD30_CRC_ERROR:
scd30ErrorState = SCD30_STATE_ERROR_DATA_CRC;
scd30CrcError_count++;
#ifdef SCD30_DEBUG
snprintf_P(log_data, sizeof(log_data), "SCD30: CRC error, CRC error: %ld, CO2 zero: %ld, good: %ld, no data: %ld, sc30_reset: %ld, i2c_reset: %ld", scd30CrcError_count, scd30Co2Zero_count, scd30GoodMeas_count, scd30DataNotAvailable_count, scd30Reset_count, i2cReset_count);
AddLog(LOG_LEVEL_ERROR);
#endif
break;
case ERROR_SCD30_CO2_ZERO:
scd30Co2Zero_count++;
#ifdef SCD30_DEBUG
snprintf_P(log_data, sizeof(log_data), "SCD30: CO2 zero, CRC error: %ld, CO2 zero: %ld, good: %ld, no data: %ld, sc30_reset: %ld, i2c_reset: %ld", scd30CrcError_count, scd30Co2Zero_count, scd30GoodMeas_count, scd30DataNotAvailable_count, scd30Reset_count, i2cReset_count);
AddLog(LOG_LEVEL_ERROR);
#endif
break;
default:
{
scd30ErrorState = SCD30_STATE_ERROR_READ_MEAS;
#ifdef SCD30_DEBUG
snprintf_P(log_data, sizeof(log_data), "SCD30: Update: ReadMeasurement error: 0x%lX, counter: %ld", error, scd30Loop_count);
AddLog(LOG_LEVEL_ERROR);
#endif
return (error);
}
break; break;
}
}
break;
case SCD30_STATE_ERROR_DATA_CRC: case ERROR_SCD30_NO_DATA:
{ scd30DataNotAvailable_count++;
//scd30IsDataValid = false; break;
case ERROR_SCD30_CRC_ERROR:
scd30ErrorState = SCD30_STATE_ERROR_DATA_CRC;
scd30CrcError_count++;
#ifdef SCD30_DEBUG #ifdef SCD30_DEBUG
snprintf_P(log_data, sizeof(log_data), "SCD30: in error state: %d, good: %ld, no data: %ld, sc30 reset: %ld, i2c reset: %ld", scd30ErrorState, scd30GoodMeas_count, scd30DataNotAvailable_count, scd30Reset_count, i2cReset_count); snprintf_P(log_data, sizeof(log_data), "SCD30: CRC error, CRC error: %ld, CO2 zero: %ld, good: %ld, no data: %ld, sc30_reset: %ld, i2c_reset: %ld", scd30CrcError_count, scd30Co2Zero_count, scd30GoodMeas_count, scd30DataNotAvailable_count, scd30Reset_count, i2cReset_count);
AddLog(LOG_LEVEL_ERROR); AddLog(LOG_LEVEL_ERROR);
snprintf_P(log_data, sizeof(log_data), "SCD30: got CRC error, try again, counter: %ld", scd30Loop_count); #endif
break;
case ERROR_SCD30_CO2_ZERO:
scd30Co2Zero_count++;
#ifdef SCD30_DEBUG
snprintf_P(log_data, sizeof(log_data), "SCD30: CO2 zero, CRC error: %ld, CO2 zero: %ld, good: %ld, no data: %ld, sc30_reset: %ld, i2c_reset: %ld", scd30CrcError_count, scd30Co2Zero_count, scd30GoodMeas_count, scd30DataNotAvailable_count, scd30Reset_count, i2cReset_count);
AddLog(LOG_LEVEL_ERROR);
#endif
break;
default: {
scd30ErrorState = SCD30_STATE_ERROR_READ_MEAS;
#ifdef SCD30_DEBUG
snprintf_P(log_data, sizeof(log_data), "SCD30: Update: ReadMeasurement error: 0x%lX, counter: %ld", error, scd30Loop_count);
AddLog(LOG_LEVEL_ERROR);
#endif
return;
}
break;
}
}
break;
case SCD30_STATE_ERROR_DATA_CRC: {
//scd30IsDataValid = false;
#ifdef SCD30_DEBUG
snprintf_P(log_data, sizeof(log_data), "SCD30: in error state: %d, good: %ld, no data: %ld, sc30 reset: %ld, i2c reset: %ld", scd30ErrorState, scd30GoodMeas_count, scd30DataNotAvailable_count, scd30Reset_count, i2cReset_count);
AddLog(LOG_LEVEL_ERROR);
snprintf_P(log_data, sizeof(log_data), "SCD30: got CRC error, try again, counter: %ld", scd30Loop_count);
AddLog(LOG_LEVEL_ERROR);
#endif
scd30ErrorState = ERROR_SCD30_NO_ERROR;
}
break;
case SCD30_STATE_ERROR_READ_MEAS: {
//scd30IsDataValid = false;
#ifdef SCD30_DEBUG
snprintf_P(log_data, sizeof(log_data), "SCD30: in error state: %d, good: %ld, no data: %ld, sc30 reset: %ld, i2c reset: %ld", scd30ErrorState, scd30GoodMeas_count, scd30DataNotAvailable_count, scd30Reset_count, i2cReset_count);
AddLog(LOG_LEVEL_ERROR);
snprintf_P(log_data, sizeof(log_data), "SCD30: not answering, sending soft reset, counter: %ld", scd30Loop_count);
AddLog(LOG_LEVEL_ERROR);
#endif
scd30Reset_count++;
error = scd30.softReset();
if (error) {
#ifdef SCD30_DEBUG
snprintf_P(log_data, sizeof(log_data), "SCD30: resetting got error: 0x%lX", error);
AddLog(LOG_LEVEL_ERROR); AddLog(LOG_LEVEL_ERROR);
#endif #endif
error >>= 8;
if (error == 4) {
scd30ErrorState = SCD30_STATE_ERROR_SOFT_RESET;
} else {
scd30ErrorState = SCD30_STATE_ERROR_UNKNOWN;
}
} else {
scd30ErrorState = ERROR_SCD30_NO_ERROR; scd30ErrorState = ERROR_SCD30_NO_ERROR;
} }
break; }
break;
case SCD30_STATE_ERROR_READ_MEAS: case SCD30_STATE_ERROR_SOFT_RESET: {
{ //scd30IsDataValid = false;
//scd30IsDataValid = false;
#ifdef SCD30_DEBUG #ifdef SCD30_DEBUG
snprintf_P(log_data, sizeof(log_data), "SCD30: in error state: %d, good: %ld, no data: %ld, sc30 reset: %ld, i2c reset: %ld", scd30ErrorState, scd30GoodMeas_count, scd30DataNotAvailable_count, scd30Reset_count, i2cReset_count); snprintf_P(log_data, sizeof(log_data), "SCD30: in error state: %d, good: %ld, no data: %ld, sc30 reset: %ld, i2c reset: %ld", scd30ErrorState, scd30GoodMeas_count, scd30DataNotAvailable_count, scd30Reset_count, i2cReset_count);
AddLog(LOG_LEVEL_ERROR); AddLog(LOG_LEVEL_ERROR);
snprintf_P(log_data, sizeof(log_data), "SCD30: not answering, sending soft reset, counter: %ld", scd30Loop_count); snprintf_P(log_data, sizeof(log_data), "SCD30: clearing i2c bus");
AddLog(LOG_LEVEL_ERROR);
#endif
i2cReset_count++;
error = scd30.clearI2CBus();
if (error) {
scd30ErrorState = SCD30_STATE_ERROR_I2C_RESET;
#ifdef SCD30_DEBUG
snprintf_P(log_data, sizeof(log_data), "SCD30: error clearing i2c bus: 0x%lX", error);
AddLog(LOG_LEVEL_ERROR); AddLog(LOG_LEVEL_ERROR);
#endif #endif
scd30Reset_count++; } else {
error = scd30.softReset(); scd30ErrorState = ERROR_SCD30_NO_ERROR;
if (error)
{
#ifdef SCD30_DEBUG
snprintf_P(log_data, sizeof(log_data), "SCD30: resetting got error: 0x%lX", error);
AddLog(LOG_LEVEL_ERROR);
#endif
error >>= 8;
if (error == 4)
{
scd30ErrorState = SCD30_STATE_ERROR_SOFT_RESET;
}
else
{
scd30ErrorState = SCD30_STATE_ERROR_UNKNOWN;
}
}
else
{
scd30ErrorState = ERROR_SCD30_NO_ERROR;
}
}
break;
case SCD30_STATE_ERROR_SOFT_RESET:
{
//scd30IsDataValid = false;
#ifdef SCD30_DEBUG
snprintf_P(log_data, sizeof(log_data), "SCD30: in error state: %d, good: %ld, no data: %ld, sc30 reset: %ld, i2c reset: %ld", scd30ErrorState, scd30GoodMeas_count, scd30DataNotAvailable_count, scd30Reset_count, i2cReset_count);
AddLog(LOG_LEVEL_ERROR);
snprintf_P(log_data, sizeof(log_data), "SCD30: clearing i2c bus");
AddLog(LOG_LEVEL_ERROR);
#endif
i2cReset_count++;
error = scd30.clearI2CBus();
if (error)
{
scd30ErrorState = SCD30_STATE_ERROR_I2C_RESET;
#ifdef SCD30_DEBUG
snprintf_P(log_data, sizeof(log_data), "SCD30: error clearing i2c bus: 0x%lX", error);
AddLog(LOG_LEVEL_ERROR);
#endif
}
else
{
scd30ErrorState = ERROR_SCD30_NO_ERROR;
}
}
break;
default:
{
//scd30IsDataValid = false;
#ifdef SCD30_DEBUG
snprintf_P(log_data, sizeof(log_data), "SCD30: unknown error state: 0x%lX", scd30ErrorState);
AddLog(LOG_LEVEL_ERROR);
#endif
scd30ErrorState = SCD30_STATE_ERROR_SOFT_RESET; // try again
} }
} }
break;
if (scd30Loop_count > (SCD30_MAX_MISSED_READS * scd30Interval_sec)) default: {
{ //scd30IsDataValid = false;
scd30IsDataValid = false; #ifdef SCD30_DEBUG
AddLog_P2(LOG_LEVEL_ERROR, PSTR("SCD30: unknown error state: 0x%lX"), scd30ErrorState);
#endif
scd30ErrorState = SCD30_STATE_ERROR_SOFT_RESET; // try again
} }
} }
if (scd30Loop_count > (SCD30_MAX_MISSED_READS * scd30Interval_sec)) {
scd30IsDataValid = false;
}
} }
return (ERROR_SCD30_NO_ERROR);
} }
@ -370,8 +296,9 @@ int Scd30SetCommand(int command_code, uint16_t value)
break; break;
} }
} }
/*********************************************************************************************\ /*********************************************************************************************\
* Command Sensor92 * Command Sensor42
\*********************************************************************************************/ \*********************************************************************************************/
bool Scd30CommandSensor() bool Scd30CommandSensor()
@ -438,13 +365,13 @@ bool Scd30CommandSensor()
void Scd30Show(bool json) void Scd30Show(bool json)
{ {
char humidity[10]; if (scd30IsDataValid)
char temperature[10];
if (scd30Found && scd30IsDataValid)
{ {
char humidity[10];
dtostrfd(ConvertHumidity(scd30_Humid), Settings.flag2.humidity_resolution, humidity); dtostrfd(ConvertHumidity(scd30_Humid), Settings.flag2.humidity_resolution, humidity);
char temperature[10];
dtostrfd(ConvertTemp(scd30_Temp), Settings.flag2.temperature_resolution, temperature); dtostrfd(ConvertTemp(scd30_Temp), Settings.flag2.temperature_resolution, temperature);
if (json) { if (json) {
//ResponseAppend_P(PSTR(",\"SCD30\":{\"" D_JSON_CO2 "\":%d,\"" D_JSON_TEMPERATURE "\":%s,\"" D_JSON_HUMIDITY "\":%s}"), scd30_CO2, temperature, humidity); //ResponseAppend_P(PSTR(",\"SCD30\":{\"" D_JSON_CO2 "\":%d,\"" D_JSON_TEMPERATURE "\":%s,\"" D_JSON_HUMIDITY "\":%s}"), scd30_CO2, temperature, humidity);
ResponseAppend_P(PSTR(",\"SCD30\":{\"" D_JSON_CO2 "\":%d,\"" D_JSON_ECO2 "\":%d,\"" D_JSON_TEMPERATURE "\":%s,\"" D_JSON_HUMIDITY "\":%s}"), ResponseAppend_P(PSTR(",\"SCD30\":{\"" D_JSON_CO2 "\":%d,\"" D_JSON_ECO2 "\":%d,\"" D_JSON_TEMPERATURE "\":%s,\"" D_JSON_HUMIDITY "\":%s}"),
@ -477,21 +404,26 @@ bool Xsns42(byte function)
bool result = false; bool result = false;
switch (function) { if (FUNC_INIT == function) {
case FUNC_EVERY_SECOND: Scd30Detect();
Scd30Update(); }
break; else if (scd30Found) {
case FUNC_COMMAND: switch (function) {
result = Scd30CommandSensor(); case FUNC_EVERY_SECOND:
break; Scd30Update();
case FUNC_JSON_APPEND: break;
Scd30Show(1); case FUNC_COMMAND:
break; result = Scd30CommandSensor();
#ifdef USE_WEBSERVER break;
case FUNC_WEB_SENSOR: case FUNC_JSON_APPEND:
Scd30Show(0); Scd30Show(1);
break; break;
#endif // USE_WEBSERVER #ifdef USE_WEBSERVER
case FUNC_WEB_SENSOR:
Scd30Show(0);
break;
#endif // USE_WEBSERVER
}
} }
return result; return result;
} }

View File

@ -130,6 +130,7 @@ unsigned char cmdb[6];
void SPS30_Detect(void) void SPS30_Detect(void)
{ {
if (!I2cSetDevice(SPS30_ADDR)) { return; } if (!I2cSetDevice(SPS30_ADDR)) { return; }
I2cSetActiveFound(SPS30_ADDR, "SPS30");
uint8_t dcode[32]; uint8_t dcode[32];
sps30_get_data(SPS_CMD_GET_SERIAL,dcode,sizeof(dcode)); sps30_get_data(SPS_CMD_GET_SERIAL,dcode,sizeof(dcode));
@ -155,11 +156,8 @@ const char HTTP_SNS_SPS30_c[] PROGMEM ="{s}SPS30 " "TYPSIZ" "{m}%s " "um" "{e}";
//uint8_t sps30_inuse_hours; //uint8_t sps30_inuse_hours;
void SPS30_Every_Second() { void SPS30_Every_Second() {
if (!sps30_ready) return;
if (!sps30_running) return; if (!sps30_running) return;
if (uptime%10==0) { if (uptime%10==0) {
uint8_t vars[sizeof(float)*10]; uint8_t vars[sizeof(float)*10];
sps30_get_data(SPS_CMD_READ_MEASUREMENT,vars,sizeof(vars)); sps30_get_data(SPS_CMD_READ_MEASUREMENT,vars,sizeof(vars));
@ -192,16 +190,11 @@ void SPS30_Every_Second() {
} }
void SPS30_Show(bool json) { void SPS30_Show(bool json)
{
if (!sps30_running) { return; }
char str[64]; char str[64];
if (!sps30_ready) {
return;
}
if (!sps30_running) {
return;
}
if (json) { if (json) {
dtostrfd(sps30_result.PM1_0,PMDP,str); dtostrfd(sps30_result.PM1_0,PMDP,str);
ResponseAppend_P(PSTR(",\"SPS30\":{\"" "PM1_0" "\":%s"), str); ResponseAppend_P(PSTR(",\"SPS30\":{\"" "PM1_0" "\":%s"), str);
@ -248,16 +241,17 @@ void SPS30_Show(bool json) {
WSContentSend_PD(HTTP_SNS_SPS30_c,str); WSContentSend_PD(HTTP_SNS_SPS30_c,str);
#endif #endif
} }
} }
void CmdClean(void) { void CmdClean(void)
{
sps30_cmd(SPS_CMD_CLEAN); sps30_cmd(SPS_CMD_CLEAN);
ResponseTime_P(PSTR(",\"SPS30\":{\"CFAN\":\"true\"}}")); ResponseTime_P(PSTR(",\"SPS30\":{\"CFAN\":\"true\"}}"));
MqttPublishTeleSensor(); MqttPublishTeleSensor();
} }
bool SPS30_cmd(void) { bool SPS30_cmd(void)
{
bool serviced = true; bool serviced = true;
if (XdrvMailbox.data_len > 0) { if (XdrvMailbox.data_len > 0) {
char *cp=XdrvMailbox.data; char *cp=XdrvMailbox.data;
@ -280,33 +274,34 @@ bool SPS30_cmd(void) {
* Interface * Interface
\*********************************************************************************************/ \*********************************************************************************************/
bool Xsns44(byte function) bool Xsns44(byte function)
{ {
if (!I2cEnabled(XI2C_30)) { return false; } if (!I2cEnabled(XI2C_30)) { return false; }
bool result = false; bool result = false;
switch (function) { if (FUNC_INIT == function) {
case FUNC_EVERY_SECOND: SPS30_Detect();
SPS30_Every_Second(); }
break; else if (sps30_ready) {
case FUNC_JSON_APPEND: switch (function) {
SPS30_Show(1); case FUNC_EVERY_SECOND:
break; SPS30_Every_Second();
#ifdef USE_WEBSERVER break;
case FUNC_WEB_SENSOR: case FUNC_JSON_APPEND:
SPS30_Show(0); SPS30_Show(1);
break; break;
#endif // USE_WEBSERVER #ifdef USE_WEBSERVER
case FUNC_COMMAND_SENSOR: case FUNC_WEB_SENSOR:
if (XSNS_44 == XdrvMailbox.index) { SPS30_Show(0);
result = SPS30_cmd(); break;
} #endif // USE_WEBSERVER
break; case FUNC_COMMAND_SENSOR:
case FUNC_INIT: if (XSNS_44 == XdrvMailbox.index) {
SPS30_Detect(); result = SPS30_cmd();
break; }
break;
}
} }
return result; return result;
} }

View File

@ -36,8 +36,6 @@ uint8_t Vl53l0_index;
void Vl53l0Detect(void) void Vl53l0Detect(void)
{ {
if (vl53l0x_ready) { return; }
if (!I2cSetDevice(0x29)) { return; } if (!I2cSetDevice(0x29)) { return; }
if (!sensor.init()) { return; } if (!sensor.init()) { return; }
@ -65,8 +63,6 @@ const char HTTP_SNS_VL53L0X[] PROGMEM =
void Vl53l0Every_250MSecond(void) void Vl53l0Every_250MSecond(void)
{ {
if (!vl53l0x_ready) { return; }
uint16_t tbuff[5],tmp; uint16_t tbuff[5],tmp;
uint8_t flag; uint8_t flag;
@ -104,8 +100,6 @@ void Vl53l0Every_250MSecond(void)
void Vl53l0Show(boolean json) void Vl53l0Show(boolean json)
{ {
if (!vl53l0x_ready) { return; }
if (json) { if (json) {
ResponseAppend_P(PSTR(",\"VL53L0X\":{\"" D_JSON_DISTANCE "\":%d}"), vl53l0x_distance); ResponseAppend_P(PSTR(",\"VL53L0X\":{\"" D_JSON_DISTANCE "\":%d}"), vl53l0x_distance);
#ifdef USE_WEBSERVER #ifdef USE_WEBSERVER
@ -125,21 +119,23 @@ bool Xsns45(byte function)
bool result = false; bool result = false;
switch (function) { if (FUNC_INIT == function) {
case FUNC_EVERY_250_MSECOND: Vl53l0Detect();
Vl53l0Every_250MSecond(); }
break; else if (vl53l0x_ready) {
case FUNC_JSON_APPEND: switch (function) {
Vl53l0Show(1); case FUNC_EVERY_250_MSECOND:
break; Vl53l0Every_250MSecond();
break;
case FUNC_JSON_APPEND:
Vl53l0Show(1);
break;
#ifdef USE_WEBSERVER #ifdef USE_WEBSERVER
case FUNC_WEB_SENSOR: case FUNC_WEB_SENSOR:
Vl53l0Show(0); Vl53l0Show(0);
break; break;
#endif // USE_WEBSERVER #endif // USE_WEBSERVER
case FUNC_INIT: }
Vl53l0Detect();
break;
} }
return result; return result;
} }