diff --git a/fw/Core/Inc/main.h b/fw/Core/Inc/main.h index 5e2126d..20ac803 100644 --- a/fw/Core/Inc/main.h +++ b/fw/Core/Inc/main.h @@ -102,6 +102,7 @@ int8_t uart_enable_interrupts(void); #define MEASUREMENT_PERIOD_S 6 #define RESET_MAGIC_NUMBER 0xABCD #define MODBUS_ASSERT(x) if (x == 0) return MODBUS_ERROR_FUNCTION_NOT_IMPLEMENTED +#define CELSIUS_TO_FAHRENHEIT(x) (x * 9 / 5 + 320) extern uint16_t usart2_rx_message_index; extern uint16_t usart2_rx_message_len; diff --git a/fw/Core/Src/main.c b/fw/Core/Src/main.c index 030cfc0..387c409 100644 --- a/fw/Core/Src/main.c +++ b/fw/Core/Src/main.c @@ -72,25 +72,28 @@ const uint16_t tim21_period = MEASUREMENT_PERIOD_S * (SYSTEM_CLOCK_HZ / tim21_pr /* Input registers memory map implementation */ enum { - REGISTER_NUM_CO2 = 30010, /* ppm */ - REGISTER_NUM_T_SHT4x = 30011, /* deg C */ - REGISTER_NUM_RH_SHT4x = 30012, /* % */ - REGISTER_NUM_T_SCD4x = 30013, /* deg C */ - REGISTER_NUM_RH_SCD4x = 30014, /* % */ - REGISTER_NUM_T_SHT4x_SIGNED = 30015, /* deg C */ - REGISTER_NUM_T_SCD4x_SIGNED = 30016, /* deg C */ - REGISTER_NUM_PMC_MASS_1_0 = 30017, /* ug / m^3 */ - REGISTER_NUM_PMC_MASS_2_5 = 30018, /* ug / m^3 */ - REGISTER_NUM_PMC_MASS_4_0 = 30019, /* ug / m^3 */ - REGISTER_NUM_PMC_MASS_10_0 = 30020, /* ug / m^3 */ - REGISTER_NUM_PMC_NUMBER_0_5 = 30021, /* 1 / m^3 */ - REGISTER_NUM_PMC_NUMBER_1_0 = 30022, /* 1 / m^3 */ - REGISTER_NUM_PMC_NUMBER_2_5 = 30023, /* 1 / m^3 */ - REGISTER_NUM_PMC_NUMBER_4_0 = 30024, /* 1 / m^3 */ - REGISTER_NUM_PMC_NUMBER_10_0 = 30025, /* 1 / m^3 */ - REGISTER_NUM_TYPICAL_PARTICLE_SIZE = 30026, /* nm */ - REGISTER_NUM_VOC_RAW = 30027, /* raw VOC ticks */ - REGISTER_NUM_VOC_INDEX = 30028 /* VOC index as calculated by Sensirion library (1 to 500, average 100) */ + REGISTER_NUM_T = 30010, /* deg C */ + REGISTER_NUM_T_F = 30011, /* deg F */ + REGISTER_NUM_RH = 30012, /* %, from SHT4x */ + REGISTER_NUM_CO2 = 30013, /* ppm */ + REGISTER_NUM_VOC_INDEX = 30014, /* VOC index as calculated by Sensirion library (1 to 500, average 100) */ + REGISTER_NUM_VOC_TICKS = 30015, /* raw VOC ticks */ + REGISTER_NUM_NOX_INDEX = 30016, + REGISTER_NUM_NOX_TICKS = 30017, + REGISTER_NUM_PMC_MASS_1_0 = 30018, /* ug / m^3 */ + REGISTER_NUM_PMC_MASS_2_5 = 30019, /* ug / m^3 */ + REGISTER_NUM_PMC_MASS_4_0 = 30020, /* ug / m^3 */ + REGISTER_NUM_PMC_MASS_10_0 = 30021, /* ug / m^3 */ + REGISTER_NUM_PMC_NUMBER_0_5 = 30022, /* 1 / m^3 */ + REGISTER_NUM_PMC_NUMBER_1_0 = 30023, /* 1 / m^3 */ + REGISTER_NUM_PMC_NUMBER_2_5 = 30024, /* 1 / m^3 */ + REGISTER_NUM_PMC_NUMBER_4_0 = 30025, /* 1 / m^3 */ + REGISTER_NUM_PMC_NUMBER_10_0 = 30026, /* 1 / m^3 */ + REGISTER_NUM_TYPICAL_PARTICLE_SIZE = 30027, /* nm */ + REGISTER_NUM_T_SCD4x = 30028, /* deg C */ + REGISTER_NUM_T_SCD4x_F = 30029, /* deg F */ + REGISTER_NUM_RH_SCD4x = 30030 /* % */ + /* VOC Index has initial blackout beriod, when the data is not ready. VOC index is 0 during this period */ } data_registers_numbers; @@ -117,7 +120,7 @@ enum } identification_registers_numbers; /* Variables to store the measured data */ -int16_t T_SCD4x, T_SHT4x; +int16_t T_SCD4x, T_SHT4x, TF_SCD4x, TF_SHT4x; uint16_t CO2, RH_SCD4x, RH_SHT4x; sps30_data_t PM_SPS30; /* VOC related varibles */ @@ -354,7 +357,7 @@ int main(void) /* TODO: Check the data */ /* Read SHT4x data (always connected) */ sht4x_measure(&T_SHT4x, &RH_SHT4x); - + TF_SHT4x = CELSIUS_TO_FAHRENHEIT(T_SHT4x); /* Read SCD4x data (if connected) */ if (scd4x_is_connected == 1) { @@ -362,6 +365,7 @@ int main(void) /* read failed, either I2C fail or CRC error */ // TODO something } + TF_SCD4x = CELSIUS_TO_FAHRENHEIT(T_SCD4x); if (CO2 > 0) { co2_valid = 1; } else { @@ -871,26 +875,25 @@ int8_t modbus_slave_callback(modbus_transaction_t *transaction) { switch (register_number) { + case REGISTER_NUM_T: + transaction->input_registers_signed[i] = (int16_t)T_SHT4x; + break; + case REGISTER_NUM_T_F: + transaction->input_registers_signed[i] = (int16_t)TF_SHT4x; + break; + case REGISTER_NUM_RH: + transaction->input_registers[i] = (uint16_t)RH_SHT4x; + break; case REGISTER_NUM_CO2: transaction->input_registers[i] = (uint16_t)CO2; break; - case REGISTER_NUM_T_SHT4x: - transaction->input_registers[i] = (uint16_t)T_SHT4x; + case REGISTER_NUM_VOC_INDEX: + MODBUS_ASSERT(sgp40_is_connected); + transaction->input_registers[i] = (uint16_t)voc_index; break; - case REGISTER_NUM_RH_SHT4x: - transaction->input_registers[i] = (uint16_t)RH_SHT4x; - break; - case REGISTER_NUM_T_SCD4x: - transaction->input_registers[i] = (uint16_t)T_SCD4x; - break; - case REGISTER_NUM_RH_SCD4x: - transaction->input_registers[i] = (uint16_t)RH_SCD4x; - break; - case REGISTER_NUM_T_SHT4x_SIGNED: - transaction->input_registers_signed[i] = (int16_t)T_SHT4x; - break; - case REGISTER_NUM_T_SCD4x_SIGNED: - transaction->input_registers_signed[i] = (int16_t)T_SCD4x; + case REGISTER_NUM_VOC_TICKS: + MODBUS_ASSERT(sgp40_is_connected); + transaction->input_registers[i] = (uint16_t)voc_ticks_compensated; break; case REGISTER_NUM_PMC_MASS_1_0: MODBUS_ASSERT(sps30_is_connected); @@ -932,13 +935,14 @@ 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_VOC_RAW: - MODBUS_ASSERT(sgp40_is_connected); - transaction->input_registers[i] = (uint16_t)voc_ticks_compensated; + case REGISTER_NUM_T_SCD4x: + transaction->input_registers_signed[i] = (int16_t)T_SCD4x; break; - case REGISTER_NUM_VOC_INDEX: - MODBUS_ASSERT(sgp40_is_connected); - transaction->input_registers[i] = (uint16_t)voc_index; + 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; default: return MODBUS_ERROR_FUNCTION_NOT_IMPLEMENTED; diff --git a/fw/Core/Src/scd4x.c b/fw/Core/Src/scd4x.c index 958d35c..7c9bb9e 100644 --- a/fw/Core/Src/scd4x.c +++ b/fw/Core/Src/scd4x.c @@ -28,9 +28,14 @@ int8_t scd4x_send_cmd(scd4x_cmd_t cmd) int8_t scd4x_get_serial(uint8_t serial[6]) { uint8_t buffer[16]; + int result; scd4x_send_cmd(SCD4X_GET_SERIAL_NUMBER); - i2c_receive(SCD4X_I2C_ADDRESS << 1, buffer, 9); + result = i2c_receive(SCD4X_I2C_ADDRESS << 1, buffer, 9); + if (result != I2C_OK) { + return SCD4X_ERROR; + } + return SCD4X_OK; } int8_t scd4x_read_data(uint8_t *buffer, int len)