Re-order MODBUS registers; add Fahrenheit

This commit is contained in:
mj 2022-03-27 14:51:52 +02:00
parent 399d6ba8c5
commit d386d05fb7
3 changed files with 54 additions and 44 deletions

View File

@ -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;

View File

@ -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;

View File

@ -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)