Skip to content

Commit

Permalink
Update SEN6x to min 1second polling
Browse files Browse the repository at this point in the history
  • Loading branch information
tyeth committed Mar 5, 2025
1 parent 093d517 commit d4e88a3
Showing 1 changed file with 94 additions and 127 deletions.
221 changes: 94 additions & 127 deletions src/components/i2c/drivers/WipperSnapper_I2C_Driver_SEN6X.h
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,15 @@ class WipperSnapper_I2C_Driver_SEN6X : public WipperSnapper_I2C_Driver {
: WipperSnapper_I2C_Driver(i2c, sensorAddress) {
_i2c = i2c;
_sensorAddress = sensorAddress;
_massConcentrationPm1p0 = NAN;
_massConcentrationPm2p5 = NAN;
_massConcentrationPm4p0 = NAN;
_massConcentrationPm10p0 = NAN;
_ambientHumidity = NAN;
_ambientTemperature = NAN;
_vocIndex = NAN;
_noxIndex = NAN;
_co2 = 0uL;
}

/*******************************************************************************/
Expand All @@ -70,6 +79,63 @@ class WipperSnapper_I2C_Driver_SEN6X : public WipperSnapper_I2C_Driver {
return true;
}

/*******************************************************************************/
/*!
@brief Checks if sensor was read within last 1s, or is the first read.
@returns True if the sensor was recently read, False otherwise.
*/
bool hasBeenReadInLastSecond() {
return _lastRead != 0 && millis() - _lastRead < 1000;
}

/*******************************************************************************/
/*!
@brief Checks if the sensor is ready to be read
@returns True if the sensor is ready, False otherwise.
*/
/*******************************************************************************/
bool isSensorReady() {
bool isDataReady = false;
uint8_t padding = 0x0;
uint16_t error = _sen->getDataReady(padding, isDataReady);
if (error != 0 || !isDataReady) {
// failed, one more quick attempt
delay(100);
error = _sen->getDataReady(padding, isDataReady);
if (error != 0 || !isDataReady) {
return false;
}
}
return true;
}

/*******************************************************************************/
/*!
@brief Reads the sensor.
@returns True if the sensor was read successfully, False otherwise.
*/
/*******************************************************************************/
bool readSensorData() {
// dont read sensor more than once per second
if (hasBeenReadInLastSecond()) {
return true;
}

if (!isSensorReady()) {
return false;
}

uint16_t error = _sen->readMeasuredValues(
_massConcentrationPm1p0, _massConcentrationPm2p5,
_massConcentrationPm4p0, _massConcentrationPm10p0, _ambientHumidity,
_ambientTemperature, _vocIndex, _noxIndex, _co2);
if (error != 0) {
return false;
}
_lastRead = millis();
return true;
}

/*******************************************************************************/
/*!
@brief Gets the SEN6X's current temperature.
Expand All @@ -80,21 +146,10 @@ class WipperSnapper_I2C_Driver_SEN6X : public WipperSnapper_I2C_Driver {
*/
/*******************************************************************************/
bool getEventAmbientTemp(sensors_event_t *tempEvent) {
float massConcentrationPm1p0, massConcentrationPm2p5,
massConcentrationPm4p0, massConcentrationPm10p0, ambientHumidity,
ambientTemperature, vocIndex, noxIndex;
uint16_t co2;
uint16_t error;

error = _sen->readMeasuredValues(
massConcentrationPm1p0, massConcentrationPm2p5, massConcentrationPm4p0,
massConcentrationPm10p0, ambientHumidity, ambientTemperature, vocIndex,
noxIndex, co2);
if ((_tempSensorPeriod != 0 && error != 0) || ambientTemperature == NAN) {
if (!readSensorData() || _ambientTemperature == NAN) {
return false;
}

tempEvent->temperature = ambientTemperature;
tempEvent->temperature = _ambientTemperature;
return true;
}

Expand All @@ -108,21 +163,10 @@ class WipperSnapper_I2C_Driver_SEN6X : public WipperSnapper_I2C_Driver {
*/
/*******************************************************************************/
bool getEventRelativeHumidity(sensors_event_t *humidEvent) {
float massConcentrationPm1p0, massConcentrationPm2p5,
massConcentrationPm4p0, massConcentrationPm10p0, ambientHumidity,
ambientTemperature, vocIndex, noxIndex;
uint16_t co2;
uint16_t error;

error = _sen->readMeasuredValues(
massConcentrationPm1p0, massConcentrationPm2p5, massConcentrationPm4p0,
massConcentrationPm10p0, ambientHumidity, ambientTemperature, vocIndex,
noxIndex, co2);
if ((_humidSensorPeriod != 0 && error != 0) || ambientHumidity == NAN) {
if (!readSensorData() || _ambientHumidity == NAN) {
return false;
}

humidEvent->relative_humidity = ambientHumidity;
humidEvent->relative_humidity = _ambientHumidity;
return true;
}

Expand All @@ -139,21 +183,10 @@ class WipperSnapper_I2C_Driver_SEN6X : public WipperSnapper_I2C_Driver {
*/
/*******************************************************************************/
bool getEventNOxIndex(sensors_event_t *noxIndexEvent) {
float massConcentrationPm1p0, massConcentrationPm2p5,
massConcentrationPm4p0, massConcentrationPm10p0, ambientHumidity,
ambientTemperature, vocIndex, noxIndex;
uint16_t co2;
uint16_t error;

error = _sen->readMeasuredValues(
massConcentrationPm1p0, massConcentrationPm2p5, massConcentrationPm4p0,
massConcentrationPm10p0, ambientHumidity, ambientTemperature, vocIndex,
noxIndex, co2);
if ((_NOxIndexPeriod != 0 && error != 0) || noxIndex == NAN) {
if (!readSensorData() || _noxIndex == NAN) {
return false;
}

noxIndexEvent->nox_index = noxIndex;
noxIndexEvent->nox_index = _noxIndex;
return true;
}

Expand All @@ -167,21 +200,10 @@ class WipperSnapper_I2C_Driver_SEN6X : public WipperSnapper_I2C_Driver {
*/
/*******************************************************************************/
bool getEventVOCIndex(sensors_event_t *vocIndexEvent) {
float massConcentrationPm1p0, massConcentrationPm2p5,
massConcentrationPm4p0, massConcentrationPm10p0, ambientHumidity,
ambientTemperature, vocIndex, noxIndex;
uint16_t co2;
uint16_t error;

error = _sen->readMeasuredValues(
massConcentrationPm1p0, massConcentrationPm2p5, massConcentrationPm4p0,
massConcentrationPm10p0, ambientHumidity, ambientTemperature, vocIndex,
noxIndex, co2);
if ((_VOCIndexPeriod != 0 && error != 0) || vocIndex == NAN) {
if (!readSensorData() || _vocIndex == NAN) {
return false;
}

vocIndexEvent->voc_index = vocIndex;
vocIndexEvent->voc_index = _vocIndex;
return true;
}

Expand All @@ -195,23 +217,11 @@ class WipperSnapper_I2C_Driver_SEN6X : public WipperSnapper_I2C_Driver {
*/
/*******************************************************************************/
bool getEventPM10_STD(sensors_event_t *pm10StdEvent) {
float massConcentrationPm1p0, massConcentrationPm2p5,
massConcentrationPm4p0, massConcentrationPm10p0, ambientHumidity,
ambientTemperature, vocIndex, noxIndex;
uint16_t co2;
uint16_t error;

error = _sen->readMeasuredValues(
massConcentrationPm1p0, massConcentrationPm2p5, massConcentrationPm4p0,
massConcentrationPm10p0, ambientHumidity, ambientTemperature, vocIndex,
noxIndex, co2);
if ((_PM10SensorPeriod != 0 && error != 0) ||
massConcentrationPm1p0 == NAN ||
massConcentrationPm1p0 == OVERFLOW_SEN6X) {
if (!readSensorData() || _massConcentrationPm1p0 == NAN ||
_massConcentrationPm1p0 == OVERFLOW_SEN6X) {
return false;
}

pm10StdEvent->pm10_std = massConcentrationPm1p0;
pm10StdEvent->pm10_std = _massConcentrationPm1p0;
return true;
}

Expand All @@ -225,23 +235,11 @@ class WipperSnapper_I2C_Driver_SEN6X : public WipperSnapper_I2C_Driver {
*/
/*******************************************************************************/
bool getEventPM25_STD(sensors_event_t *pm25StdEvent) {
float massConcentrationPm1p0, massConcentrationPm2p5,
massConcentrationPm4p0, massConcentrationPm10p0, ambientHumidity,
ambientTemperature, vocIndex, noxIndex;
uint16_t co2;
uint16_t error;

error = _sen->readMeasuredValues(
massConcentrationPm1p0, massConcentrationPm2p5, massConcentrationPm4p0,
massConcentrationPm10p0, ambientHumidity, ambientTemperature, vocIndex,
noxIndex, co2);
if ((_PM25SensorPeriod != 0 && error != 0) ||
massConcentrationPm2p5 == NAN ||
massConcentrationPm2p5 == OVERFLOW_SEN6X) {
if (!readSensorData() || _massConcentrationPm2p5 == NAN ||
_massConcentrationPm2p5 == OVERFLOW_SEN6X) {
return false;
}

pm25StdEvent->pm25_std = massConcentrationPm2p5;
pm25StdEvent->pm25_std = _massConcentrationPm2p5;
return true;
}

Expand All @@ -255,23 +253,11 @@ class WipperSnapper_I2C_Driver_SEN6X : public WipperSnapper_I2C_Driver {
*/
/*******************************************************************************/
bool getEventPM40_STD(sensors_event_t *pm40StdEvent) {
float massConcentrationPm1p0, massConcentrationPm2p5,
massConcentrationPm4p0, massConcentrationPm10p0, ambientHumidity,
ambientTemperature, vocIndex, noxIndex;
uint16_t co2;
uint16_t error;

error = _sen->readMeasuredValues(
massConcentrationPm1p0, massConcentrationPm2p5, massConcentrationPm4p0,
massConcentrationPm10p0, ambientHumidity, ambientTemperature, vocIndex,
noxIndex, co2);
if ((_PM25SensorPeriod != 0 && error != 0) ||
massConcentrationPm4p0 == NAN ||
massConcentrationPm4p0 == OVERFLOW_SEN6X) {
if (!readSensorData() || _massConcentrationPm4p0 == NAN ||
_massConcentrationPm4p0 == OVERFLOW_SEN6X) {
return false;
}

pm40StdEvent->data[0] = massConcentrationPm4p0;
pm40StdEvent->data[0] = _massConcentrationPm4p0;
return true;
}

Expand All @@ -285,23 +271,11 @@ class WipperSnapper_I2C_Driver_SEN6X : public WipperSnapper_I2C_Driver {
*/
/*******************************************************************************/
bool getEventPM100_STD(sensors_event_t *pm100StdEvent) {
float massConcentrationPm1p0, massConcentrationPm2p5,
massConcentrationPm4p0, massConcentrationPm10p0, ambientHumidity,
ambientTemperature, vocIndex, noxIndex;
uint16_t co2;
uint16_t error;

error = _sen->readMeasuredValues(
massConcentrationPm1p0, massConcentrationPm2p5, massConcentrationPm4p0,
massConcentrationPm10p0, ambientHumidity, ambientTemperature, vocIndex,
noxIndex, co2);
if ((_PM100SensorPeriod != 0 && error != 0) ||
massConcentrationPm10p0 == NAN ||
massConcentrationPm10p0 == OVERFLOW_SEN6X) {
if (!readSensorData() || _massConcentrationPm10p0 == NAN ||
_massConcentrationPm10p0 == OVERFLOW_SEN6X) {
return false;
}

pm100StdEvent->pm100_std = massConcentrationPm10p0;
pm100StdEvent->pm100_std = _massConcentrationPm10p0;
return true;
}

Expand All @@ -315,27 +289,20 @@ class WipperSnapper_I2C_Driver_SEN6X : public WipperSnapper_I2C_Driver {
*/
/*******************************************************************************/
bool getEventCO2(sensors_event_t *co2Event) {
float massConcentrationPm1p0, massConcentrationPm2p5,
massConcentrationPm4p0, massConcentrationPm10p0, ambientHumidity,
ambientTemperature, vocIndex, noxIndex;
uint16_t co2;
uint16_t error;

error = _sen->readMeasuredValues(
massConcentrationPm1p0, massConcentrationPm2p5, massConcentrationPm4p0,
massConcentrationPm10p0, ambientHumidity, ambientTemperature, vocIndex,
noxIndex, co2);

if ((_CO2SensorPeriod != 0 && error != 0) || co2 == 0xFFFF) {
if (!readSensorData() || _co2 == 0xFFFF) {
return false;
}

co2Event->CO2 = co2;
co2Event->CO2 = _co2;
return true;
}

protected:
SensirionI2cSen66 *_sen; ///< SEN6X driver object
SensirionI2cSen66 *_sen = nullptr; ///< SEN6X driver object
float _massConcentrationPm1p0, _massConcentrationPm2p5,
_massConcentrationPm4p0, _massConcentrationPm10p0, _ambientHumidity,
_ambientTemperature, _vocIndex, _noxIndex; ///< Sensor float values
uint16_t _co2; ///< CO2 value
ulong _lastRead; ///< Last time the sensor was read
};

#endif // WipperSnapper_I2C_Driver_SEN6X

0 comments on commit d4e88a3

Please sign in to comment.