diff --git a/Core/Inc/msb.h b/Core/Inc/msb.h index 2da6e3c..5b920ea 100644 --- a/Core/Inc/msb.h +++ b/Core/Inc/msb.h @@ -1,4 +1,3 @@ - #ifndef MSB_CENTRAL_H #define MSB_CENTRAL_H @@ -21,7 +20,10 @@ typedef enum { int8_t msb_init(); #ifdef SENSOR_TEMP -int8_t central_temp_measure(uint16_t *temp, uint16_t *humidity); +/// @brief Measure the temperature and humidity of central MSB SHT30 +/// @param out +/// @return error code +int8_t central_temp_measure(float *temp, float *humidity); #endif #ifdef SENSOR_TOF diff --git a/Core/Src/monitor.c b/Core/Src/monitor.c index 7898238..a84f333 100644 --- a/Core/Src/monitor.c +++ b/Core/Src/monitor.c @@ -4,6 +4,7 @@ #include "cmsis_os.h" #include "msb.h" #include "msb_conf.h" +#include "sht30.h" #include "stm32f405xx.h" #include @@ -46,12 +47,12 @@ void vTempMonitor(void *pv_params) .data = { 0 } }; struct __attribute__((__packed__)) { - uint16_t temp; - uint16_t humidity; + float temp; + float humidity; } temp_sensor_data; - uint16_t temp_dat = 0; - uint16_t humidity_dat = 0; + float temp_dat = 0; + float humidity_dat = 0; for (;;) { if (central_temp_measure(&temp_dat, &humidity_dat)) { @@ -62,10 +63,13 @@ void vTempMonitor(void *pv_params) temp_sensor_data.humidity = humidity_dat; #ifdef LOG_VERBOSE - printf("Board Temperature:\t%d\r\n", temp_sensor_data.temp); - printf("Board Humidity:\t%d\r\n", temp_sensor_data.humidity); + printf("Board Temperature: %f\n", temp_sensor_data.temp); + printf("Board Humidity:%f\n", temp_sensor_data.humidity); #endif + printf("Board Temperature: %f\n", temp_sensor_data.temp); + printf("Board Humidity:%f\n", temp_sensor_data.humidity); + endian_swap(&temp_sensor_data.temp, sizeof(temp_sensor_data.temp)); endian_swap(&temp_sensor_data.humidity, diff --git a/Core/Src/msb.c b/Core/Src/msb.c index bb39a07..beda0e5 100644 --- a/Core/Src/msb.c +++ b/Core/Src/msb.c @@ -3,6 +3,7 @@ #include "lsm6dso_reg.h" #include "main.h" #include "motion_fx.h" +#include "sht30.h" #include #include #include @@ -49,14 +50,42 @@ VL6180xDev_t tof; uint32_t adc1_buf[3]; #endif +static inline uint8_t sht30_i2c_write(uint8_t *data, uint8_t dev_address, + uint8_t length) +{ + return HAL_I2C_Master_Transmit(&hi2c3, dev_address, data, length, + HAL_MAX_DELAY); +} + +static inline uint8_t sht30_i2c_read(uint8_t *data, uint16_t command, + uint8_t dev_address, uint8_t length) +{ + return HAL_I2C_Mem_Read(&hi2c3, dev_address, command, sizeof(command), + data, length, HAL_MAX_DELAY); +} + +// blocking read uses master transmit (in blocking mode) +static inline uint8_t sht30_i2c_blocking_read(uint8_t *data, uint16_t command, + uint8_t dev_address, + uint8_t length) +{ + uint8_t command_buffer[2] = { (command & 0xff00u) >> 8u, + command & 0xffu }; + // write command to sht30 before reading + sht30_i2c_write(command_buffer, dev_address, sizeof(command_buffer)); + HAL_Delay(1); // 1 ms delay to ensure sht30 returns to idle state + return HAL_I2C_Master_Receive(&hi2c3, dev_address, data, length, + HAL_MAX_DELAY); +} + int8_t msb_init() { #ifdef SENSOR_TEMP /* Initialize the Onboard Temperature Sensor */ - temp_sensor = (sht30_t){ - .i2c_handle = &hi2c3, - }; - assert(!sht30_init(&temp_sensor)); /* This is always connected */ + assert(!sht30_init(&temp_sensor, (Write_ptr)sht30_i2c_write, + (Read_ptr)sht30_i2c_read, + (Read_ptr)sht30_i2c_blocking_read, + (SHT30_I2C_ADDR))); /* This is always connected */ #endif #ifdef SENSOR_IMU @@ -109,18 +138,15 @@ int8_t msb_init() } #ifdef SENSOR_TEMP -/// @brief Measure the temperature and humidity of central MSB SHT30 -/// @param out -/// @return error code -int8_t central_temp_measure(uint16_t *temp, uint16_t *humidity) +int8_t central_temp_measure(float *temp, float *humidity) { osStatus_t mut_stat = osMutexAcquire(i2c_mutex, osWaitForever); if (mut_stat) return mut_stat; - HAL_StatusTypeDef hal_stat = sht30_get_temp_humid(&temp_sensor); - if (hal_stat) - return hal_stat; + uint8_t status = sht30_get_temp_humid(&temp_sensor); + if (status) + return status; *temp = temp_sensor.temp; *humidity = temp_sensor.humidity; diff --git a/Drivers/Embedded-Base b/Drivers/Embedded-Base index 7ccd7ef..6e8d052 160000 --- a/Drivers/Embedded-Base +++ b/Drivers/Embedded-Base @@ -1 +1 @@ -Subproject commit 7ccd7efa4ef4614fd58a25c3fc455b99c1d5219d +Subproject commit 6e8d05283e858487eb9ba0fd35f9809d48dd9f4b