Added MODBUS registers for sensor return (error) value

This commit is contained in:
Jan Mrna 2022-08-15 21:08:09 +02:00
parent 87ca42af91
commit 7acf7ab819

View File

@ -90,9 +90,11 @@ enum
REGISTER_NUM_PMC_NUMBER_4_0 = 30016, /* 1 / m^3 */
REGISTER_NUM_PMC_NUMBER_10_0 = 30017, /* 1 / m^3 */
REGISTER_NUM_TYPICAL_PARTICLE_SIZE = 30018, /* nm */
REGISTER_NUM_T_SCD4x = 30019, /* deg C */
REGISTER_NUM_T_SCD4x_F = 30020, /* deg F */
REGISTER_NUM_RH_SCD4x = 30021 /* % */
REGISTER_NUM_READ_ERR_T = 30019, /* deg C */
REGISTER_NUM_READ_ERR_RH = 30020, /* deg C */
REGISTER_NUM_READ_ERR_CO2 = 30021, /* deg C */
REGISTER_NUM_READ_ERR_VOC = 30022, /* deg C */
REGISTER_NUM_READ_ERR_PMC = 30023, /* deg C */
/* VOC Index has initial blackout beriod, when the data is not ready. VOC index is 0 during this period */
} data_registers_numbers;
@ -148,6 +150,12 @@ uint8_t sps30_is_connected = 0;
uint8_t sgp40_is_connected = 0;
/* Sensirion library for VOC */
GasIndexAlgorithmParams voc_params;
/* Sensor return value variables */
int8_t read_error_temperature;
int8_t read_error_rh;
int8_t read_error_co2;
int8_t read_error_voc;
int8_t read_error_pmc;
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
@ -461,12 +469,12 @@ int main(void)
{
/* TODO: Check the data */
/* Read SHT4x data (always connected) */
sht4x_measure(&T_SHT4x, &RH_SHT4x);
read_error_temperature = read_error_rh = sht4x_measure(&T_SHT4x, &RH_SHT4x);
TF_SHT4x = CELSIUS_TO_FAHRENHEIT(T_SHT4x);
/* Read SCD4x data (if connected) */
if (scd4x_is_connected == 1)
{
if (scd4x_read_measurement(&CO2, &T_SCD4x, &RH_SCD4x) != SCD4X_OK) {
if ((read_error_co2 = scd4x_read_measurement(&CO2, &T_SCD4x, &RH_SCD4x)) != SCD4X_OK) {
/* read failed, either I2C fail or CRC error */
// TODO something
}
@ -481,7 +489,7 @@ int main(void)
/* Read SPS30 data (if connected) */
if (sps30_is_connected == 1)
{
sps30_read_measured_values(&PM_SPS30);
read_error_pmc = sps30_read_measured_values(&PM_SPS30);
}
/* TODO: Process data and light a desired color of LED */
/* TODO: Add hystheresis */
@ -490,7 +498,7 @@ int main(void)
if (sgp40_is_connected == 1)
{
//sgp40_measure_raw_signal(&voc_ticks);
sgp40_measure_raw_signal_compensated(&voc_ticks_compensated, RH_SHT4x, T_SHT4x);
read_error_voc = sgp40_measure_raw_signal_compensated(&voc_ticks_compensated, RH_SHT4x, T_SHT4x);
// sgp40_measure_raw_signal(&voc_ticks);
/* Sensirion VOC library */
GasIndexAlgorithm_process(&voc_params, voc_ticks_compensated, (int32_t*)&voc_index);
@ -1040,21 +1048,27 @@ int8_t modbus_slave_callback(modbus_transaction_t *transaction)
MODBUS_ASSERT(sps30_is_connected);
transaction->input_registers[i] = (uint16_t)PM_SPS30.typical_particle_size;
break;
case REGISTER_NUM_T_SCD4x:
transaction->input_registers_signed[i] = (int16_t)T_SCD4x;
break;
case REGISTER_NUM_T_SCD4x_F:
transaction->input_registers_signed[i] = (int16_t)TF_SCD4x;
break;
case REGISTER_NUM_RH_SCD4x:
transaction->input_registers[i] = (uint16_t)RH_SCD4x;
break;
case REGISTER_NUM_SERIAL_NUMBER_1:
transaction->input_registers[i] = (uint16_t)sensor_config.serial_number_1;
break;
case REGISTER_NUM_SERIAL_NUMBER_2:
transaction->input_registers[i] = (uint16_t)sensor_config.serial_number_2;
break;
case REGISTER_NUM_READ_ERR_T:
transaction->input_registers[i] = (uint16_t)read_error_temperature;
break;
case REGISTER_NUM_READ_ERR_RH:
transaction->input_registers[i] = (uint16_t)read_error_rh;
break;
case REGISTER_NUM_READ_ERR_CO2:
transaction->input_registers[i] = (uint16_t)read_error_co2;
break;
case REGISTER_NUM_READ_ERR_VOC:
transaction->input_registers[i] = (uint16_t)read_error_voc;
break;
case REGISTER_NUM_READ_ERR_PMC:
transaction->input_registers[i] = (uint16_t)read_error_pmc;
break;
default:
return MODBUS_ERROR_FUNCTION_NOT_IMPLEMENTED;
}