diff --git a/drivers/include/sen5x.h b/drivers/include/sen5x.h index 0675e9d594..c9ea0879b4 100644 --- a/drivers/include/sen5x.h +++ b/drivers/include/sen5x.h @@ -1,11 +1,14 @@ /* - * Copyright (C) 2023 TUÚ Braunschweig Institut für Betriebssysteme und Rechnerverbund + * Copyright (C) 2023 TU Braunschweig Institut für Betriebssysteme und Rechnerverbund * * This file is subject to the terms and conditions of the GNU Lesser * General Public License v2.1. See the file LICENSE in the top level * directory for more details. */ +#ifndef SEN5X_H +#define SEN5X_H + /** * @defgroup drivers_sen5x Sensirion Embedded I2C SEN5x Driver * @ingroup drivers_sensors @@ -16,7 +19,7 @@ * * @file * - * @author Daniel Prigoshij + * @author Daniel Prigoshij */ #ifndef SEN5X_H @@ -38,20 +41,34 @@ extern "C" { * @brief Wrapper for measured values */ typedef struct { - uint16_t mass_concentration_pm1p0; /**< raw value is scaled with factor 10: PM1.0 [µg/m³] = value / 10 */ - uint16_t mass_concentration_pm2p5; /**< raw value is scaled with factor 10: PM2.5 [µg/m³] = value / 10 */ - uint16_t mass_concentration_pm4p0; /**< raw value is scaled with factor 10: PM4.0 [µg/m³] = value / 10 */ - uint16_t mass_concentration_pm10p0; /**< raw value is scaled with factor 10: PM10.0 [µg/m³] = value / 10 */ - uint16_t number_concentration_pm0p5; /**< raw value is scaled with factor 10: PM0.5 [#/cm³] = value / 10 */ - uint16_t number_concentration_pm1p0; /**< raw value is scaled with factor 10: PM1.0 [#/cm³] = value / 10 */ - uint16_t number_concentration_pm2p5; /**< raw value is scaled with factor 10: PM2.5 [#/cm³] = value / 10 */ - uint16_t number_concentration_pm4p0; /**< raw value is scaled with factor 10: PM4.0 [#/cm³] = value / 10 */ - uint16_t number_concentration_pm10p0; /**< raw value is scaled with factor 10: PM10.0 [#/cm³] = value / 10 */ - uint16_t typical_particle_size; /**< raw value is scaled with factor 1000: Size [µm] = value / 1000*/ - int16_t ambient_humidity; /**< raw value is scaled with factor 100: RH [%] = value / 100 */ - int16_t ambient_temperature; /**< raw value is scaled with factor 200: T [°C] = value / 200 */ - int16_t voc_index; /**< raw value is scaled with factor 10: VOC Index = value / 10 */ - int16_t nox_index; /**< raw value is scaled with factor 10: NOx Index = value / 10 */ + uint16_t mass_concentration_pm1p0; /**< raw value is scaled with factor 10: + PM1.0 [µg/m³] = value / 10 */ + uint16_t mass_concentration_pm2p5; /**< raw value is scaled with factor 10: + PM2.5 [µg/m³] = value / 10 */ + uint16_t mass_concentration_pm4p0; /**< raw value is scaled with factor 10: + PM4.0 [µg/m³] = value / 10 */ + uint16_t mass_concentration_pm10p0; /**< raw value is scaled with factor 10: + PM10.0 [µg/m³] = value / 10 */ + uint16_t number_concentration_pm0p5; /**< raw value is scaled with factor 10: + PM0.5 [#/cm³] = value / 10 */ + uint16_t number_concentration_pm1p0; /**< raw value is scaled with factor 10: + PM1.0 [#/cm³] = value / 10 */ + uint16_t number_concentration_pm2p5; /**< raw value is scaled with factor 10: + PM2.5 [#/cm³] = value / 10 */ + uint16_t number_concentration_pm4p0; /**< raw value is scaled with factor 10: + PM4.0 [#/cm³] = value / 10 */ + uint16_t number_concentration_pm10p0; /**< raw value is scaled with factor 10: + PM10.0 [#/cm³] = value / 10 */ + uint16_t typical_particle_size; /**< raw value is scaled with factor 1000: + Size [µm] = value / 1000*/ + int16_t ambient_humidity; /**< raw value is scaled with factor 100: + RH [%] = value / 100 */ + int16_t ambient_temperature; /**< raw value is scaled with factor 200: + T [°C] = value / 200 */ + int16_t voc_index; /**< raw value is scaled with factor 10: + VOC Index = value / 10 */ + int16_t nox_index; /**< raw value is scaled with factor 10: + NOx Index = value / 10 */ } sen5x_measurement_t; /** @@ -74,15 +91,21 @@ typedef struct { * * @param[inout] dev Device descriptor of the driver * @param[in] params Initialization parameters + * + * @return 0 on success + * @return < 0 on error */ -void sen5x_init(sen5x_t *dev, const sen5x_params_t *params); +int sen5x_init(sen5x_t *dev, const sen5x_params_t *params); /** * @brief Execute a reset on the given device * * @param[inout] dev Device descriptor of the driver + * + * @return 0 on success + * @return < 0 on error */ -void sen5x_reset(const sen5x_t *dev); +int sen5x_reset(const sen5x_t *dev); /** * @brief Starts a continuous measurement @@ -92,7 +115,8 @@ void sen5x_reset(const sen5x_t *dev); void sen5x_wake(const sen5x_t *dev); /** - * @brief Starts a continuous measurement without PM. Only humidity, temperature, VOC and NOx are measured. + * @brief Starts a continuous measurement without PM. Only humidity, + * temperature, VOC and NOx are measured. * * @param[inout] dev Device descriptor of the driver */ @@ -116,7 +140,7 @@ void sen5x_clean_fan(const sen5x_t *dev); * @brief Sets the fan to maximum speed, to clean it within 10 seconds * * @param[inout] dev Device descriptor of the driver - * + * * @return 0 if no new measurements are available * @return 1 if new measuremtns are ready to be read */ @@ -146,7 +170,8 @@ void sen5x_read_pm_values(const sen5x_t *dev, sen5x_measurement_t *values); * @param[in] slope Normalized temperature offset slope * @param[in] time_constant Time constant in seconds */ -void sen5x_set_temperature_offset(const sen5x_t *dev, int16_t temp_offset, int16_t slope, uint16_t time_constant); +void sen5x_set_temperature_offset(const sen5x_t *dev, + int16_t temp_offset, int16_t slope, uint16_t time_constant); /** * @brief Set a custom temperature offset to the ambient temperature @@ -159,7 +184,8 @@ void sen5x_set_temperature_offset(const sen5x_t *dev, int16_t temp_offset, int16 void sen5x_get_temperature_offset(const sen5x_t *dev, int16_t *temp_offset, int16_t *slope, uint16_t *time_constant); /** - * @brief Set the parameter for a warm start on the device, to improve initial accuracy of the ambient temperature output + * @brief Set the parameter for a warm start on the device, to improve initial + * accuracy of the ambient temperature output * * @param[inout] dev Device descriptor of the driver * @param[in] warm_start Warm start behavior as a value in the range from @@ -168,7 +194,7 @@ void sen5x_get_temperature_offset(const sen5x_t *dev, int16_t *temp_offset, int1 void sen5x_set_warm_start(const sen5x_t *dev, uint16_t warm_start); /** - * @brief Get the warm start paramater + * @brief Get the warm start parameter * * @param[inout] dev Device descriptor of the driver * @param[out] warm_start Warm start behavior as a value in the range from @@ -181,13 +207,14 @@ void sen5x_get_warm_start(const sen5x_t *dev, uint16_t *warm_start); * * @param[inout] dev Device descriptor of the driver * @param[in] index_offset VOC index representing typical (average) conditions - * @param[in] learning_time_offset_hours Time constant to estimate the VOC algorithm offset from the - * history in hours - * @param[in] learning_time_gain_hours Time constant to estimate the VOC algorithm gain from the history - * in hours + * @param[in] learning_time_offset_hours Time constant to estimate the VOC + * algorithm offset from the history in hours + * @param[in] learning_time_gain_hours Time constant to estimate the VOC + * algorithm gain from the history in hours * @param[in] gating_max_duration_minutes Maximum duration of gating in minutes * @param[in] std_initial Initial estimate for standard deviation - * @param[in] gain_factor Gain factor to amplify or to attenuate the VOC index output + * @param[in] gain_factor Gain factor to amplify or to attenuate + * the VOC index output */ void sen5x_set_voc_algorithm_tuning( const sen5x_t *dev, int16_t index_offset, int16_t learning_time_offset_hours, @@ -195,17 +222,19 @@ void sen5x_set_voc_algorithm_tuning( int16_t std_initial, int16_t gain_factor); /** - * @brief Get the VOC Algortihm tuning parameters + * @brief Get the VOC Algorithm tuning parameters * - * @param[inout] dev Device descriptor of the driver - * @param[out] index_offset VOC index representing typical (average) conditions - * @param[out] learning_time_offset_hours Time constant to estimate the VOC algorithm offset from the - * history in hours - * @param[out] learning_time_gain_hours Time constant to estimate the VOC algorithm gain from the history - * in hours + * @param[inout] dev Device descriptor of the driver + * @param[out] index_offset VOC index representing typical + * (average) conditions + * @param[out] learning_time_offset_hours Time constant to estimate the VOC + * algorithm offset from the history in hours + * @param[out] learning_time_gain_hours Time constant to estimate the VOC + * algorithm gain from the history in hours * @param[out] gating_max_duration_minutes Maximum duration of gating in minutes * @param[out] std_initial Initial estimate for standard deviation - * @param[out] gain_factor Gain factor to amplify or to attenuate the VOC index output + * @param[out] gain_factor Gain factor to amplify or to attenuate + * the VOC index output */ void sen5x_get_voc_algorithm_tuning( const sen5x_t *dev, int16_t *index_offset, int16_t *learning_time_offset_hours, @@ -217,15 +246,18 @@ void sen5x_get_voc_algorithm_tuning( * * @param[inout] dev Device descriptor of the driver * @param[in] index_offset NOx index representing typical (average) conditions - * @param[in] learning_time_offset_hours Time constant to estimate the NOx algorithm offset from the - * history in hours - * @param[in] learning_time_gain_hours The time constant to estimate the NOx algorithm gain from the - * history has no impact for NOx. This parameter is still in place for - * consistency reasons with the VOC tuning parameters command. + * @param[in] learning_time_offset_hours Time constant to estimate the NOx algorithm offset + * from the history in hours + * @param[in] learning_time_gain_hours The time constant to estimate the + * NOx algorithm gain from the history has no + * impact for NOx. This parameter is still in place + * for consistency reasons with the VOC tuning + * parameters command. * This parameter must always be set to 12 hours * @param[in] gating_max_duration_minutes Maximum duration of gating in minutes * @param[in] std_initial Initial estimate for standard deviation - * @param[in] gain_factor Gain factor to amplify or to attenuate the NOx index output + * @param[in] gain_factor Gain factor to amplify or to attenuate + * the NOx index output */ void sen5x_set_nox_algorithm_tuning( const sen5x_t *dev, int16_t index_offset, int16_t learning_time_offset_hours, @@ -233,19 +265,22 @@ void sen5x_set_nox_algorithm_tuning( int16_t std_initial, int16_t gain_factor); /** - * @brief Get the NOx Algortihm tuning parameters - * + * @brief Get the NOx Algorithm tuning parameters + * * @param[inout] dev Device descriptor of the driver - * @param[out] index_offset NOx index representing typical (average) conditions - * @param[out] learning_time_offset_hours Time constant to estimate the NOx algorithm offset from the - * history in hours - * @param[out] learning_time_gain_hours The time constant to estimate the NOx algorithm gain from the - * history has no impact for NOx. This parameter is still in place for - * consistency reasons with the VOC tuning parameters command. + * @param[out] index_offset NOx index representing typical(average) conditions + * @param[out] learning_time_offset_hours Time constant to estimate the NOx algorithm + * offset from the history in hours + * @param[out] learning_time_gain_hours The time constant to estimate the + * NOx algorithm gain from the history has no + * impact for NOx. This parameter is still in place + * for consistency reasons with the VOC tuning + * parameters command. * This parameter must always be set to 12 hours * @param[out] gating_max_duration_minutes Maximum duration of gating in minutes * @param[out] std_initial Initial estimate for standard deviation - * @param[out] gain_factor Gain factor to amplify or to attenuate the NOx index output + * @param[out] gain_factor Gain factor to amplify or to attenuate + * the NOx index output */ void sen5x_get_nox_algorithm_tuning( const sen5x_t *dev, int16_t *index_offset, int16_t *learning_time_offset_hours, @@ -256,7 +291,7 @@ void sen5x_get_nox_algorithm_tuning( * @brief Set the mode for the RH/T acceleration algorithm * * @param[inout] dev Device descriptor of the driver - * @param[in] mode RH/T accelaration mode: + * @param[in] mode RH/T acceleration mode: * = 0: Low Acceleration * = 1: High Acceleration * = 2: Medium Acceleration @@ -267,7 +302,7 @@ void sen5x_set_rht_acceleration(const sen5x_t *dev, uint16_t mode); * @brief Get the mode for the RH/T acceleration algorithm * * @param[inout] dev Device descriptor of the driver - * @param[out] mode RH/T accelaration mode: + * @param[out] mode RH/T acceleration mode: * = 0: Low Acceleration * = 1: High Acceleration * = 2: Medium Acceleration diff --git a/drivers/saul/init_devs/auto_init_sen5x.c b/drivers/saul/init_devs/auto_init_sen5x.c index 201a371459..b11da5ee32 100644 --- a/drivers/saul/init_devs/auto_init_sen5x.c +++ b/drivers/saul/init_devs/auto_init_sen5x.c @@ -136,4 +136,4 @@ void auto_init_sen5x(void) saul_reg_add(&(saul_entries[(i * 4) + j])); } } -} \ No newline at end of file +} diff --git a/drivers/saul/init_devs/init.c b/drivers/saul/init_devs/init.c index 53e39e9698..59bc579ca9 100644 --- a/drivers/saul/init_devs/init.c +++ b/drivers/saul/init_devs/init.c @@ -283,6 +283,10 @@ void saul_init_devs(void) extern void auto_init_seesaw_soil(void); auto_init_seesaw_soil(); } + if (IS_USED(MODULE_SEN5X)) { + extern void auto_init_sen5x(void); + auto_init_sen5x(); + } if (IS_USED(MODULE_SGP30)) { extern void auto_init_sgp30(void); auto_init_sgp30(); diff --git a/drivers/sen5x/Makefile b/drivers/sen5x/Makefile index 48422e909a..7131c04432 100644 --- a/drivers/sen5x/Makefile +++ b/drivers/sen5x/Makefile @@ -1 +1 @@ -include $(RIOTBASE)/Makefile.base +include $(RIOTMAKE)/driver_with_saul.mk diff --git a/drivers/sen5x/include/sen5x_constants.h b/drivers/sen5x/include/sen5x_constants.h index 594019a057..054c2be233 100644 --- a/drivers/sen5x/include/sen5x_constants.h +++ b/drivers/sen5x/include/sen5x_constants.h @@ -6,6 +6,9 @@ * directory for more details. */ +#ifndef SEN5X_CONSTANTS_H +#define SEN5X_CONSTANTS_H + /** * @ingroup drivers_sen5x * @{ @@ -13,7 +16,7 @@ * @file * @brief Internal addresses, registers and constants * - * @author Daniel Prigoshij + * @author Daniel Prigoshij */ #ifndef SEN5X_CONSTANTS_H @@ -25,8 +28,8 @@ extern "C" { /* define here the addresses, register and constants of the driver */ -#ifndef SEN5X_I2C_ADDRESS -#define SEN5X_I2C_ADDRESS (0x69) +#ifndef SEN5X_ADRESS_I2C +#define SEN5X_ADRESS_I2C (0x69) #endif #ifdef __cplusplus diff --git a/drivers/sen5x/include/sen5x_params.h b/drivers/sen5x/include/sen5x_params.h index 3cc2c220df..a2ce43d27f 100644 --- a/drivers/sen5x/include/sen5x_params.h +++ b/drivers/sen5x/include/sen5x_params.h @@ -6,14 +6,17 @@ * directory for more details. */ +#ifndef SEN5X_PARAMS_H +#define SEN5X_PARAMS_H + /** * @ingroup drivers_sen5x * * @{ * @file - * @brief Default configuration + * @brief Default configuration for SEN50/54/55 * - * @author Daniel Prigoshij + * @author Daniel Prigoshij */ #ifndef SEN5X_PARAMS_H @@ -21,6 +24,7 @@ #include "board.h" #include "sen5x.h" +#include "saul_reg.h" #include "sen5x_constants.h" #include "periph/i2c.h" @@ -36,14 +40,16 @@ extern "C" { #define SEN5X_PARAM_I2C_DEV I2C_DEV(0) #endif #ifndef SEN5X_PARAM_ADDR -#define SEN5X_PARAM_ADDR SEN5X_I2C_ADDRESS +#define SEN5X_PARAM_ADDR SEN5X_ADRESS_I2C #endif - #ifndef SEN5X_PARAMS #define SEN5X_PARAMS { .i2c_dev = SEN5X_PARAM_I2C_DEV, \ .i2c_addr = SEN5X_PARAM_ADDR } #endif +#ifndef SEN5X_SAUL_INFO +#define SEN5X_SAUL_INFO { .name = "sen5x" } +#endif /**@}*/ /** diff --git a/drivers/sen5x/include/sensirion_i2c_hal.h b/drivers/sen5x/include/sensirion_i2c_hal.h index b41cc1101d..64a45c5b99 100644 --- a/drivers/sen5x/include/sensirion_i2c_hal.h +++ b/drivers/sen5x/include/sensirion_i2c_hal.h @@ -34,6 +34,7 @@ #include "sensirion_config.h" #include "sen5x_params.h" +#include "sen5x_constants.h" #include "xtimer.h" #include "periph/i2c.h" diff --git a/drivers/sen5x/sen5x.c b/drivers/sen5x/sen5x.c index ca32a872f3..df5175964e 100644 --- a/drivers/sen5x/sen5x.c +++ b/drivers/sen5x/sen5x.c @@ -13,7 +13,7 @@ * @file * @brief Device driver implementation for the Sensirion Embedded I2C SEN5x Driver * - * @author Daniel Prigoshij + * @author Daniel Prigoshij * * @} */ @@ -24,7 +24,7 @@ #include "sensirion_i2c_hal.h" #include "sen5x_i2c.h" -void sen5x_init(sen5x_t *dev, const sen5x_params_t *params) +int sen5x_init(sen5x_t *dev, const sen5x_params_t *params) { /* check parameters */ assert(dev && params); @@ -32,17 +32,18 @@ void sen5x_init(sen5x_t *dev, const sen5x_params_t *params) dev->params = *params; i2c_init(dev->params.i2c_dev); - sen5x_reset(dev); + return sen5x_reset(dev); } -void sen5x_reset(const sen5x_t *dev) +int sen5x_reset(const sen5x_t *dev) { assert(dev); i2c_acquire(dev->params.i2c_dev); - sen5x_device_reset(); + int result = sen5x_device_reset(); i2c_release(dev->params.i2c_dev); + return result; } void sen5x_wake(const sen5x_t *dev) @@ -87,7 +88,7 @@ bool sen5x_data_ready_flag(const sen5x_t *dev) return status; } -void sen5x_read_values(sen5x_t *dev ,sen5x_measurement_t *values) +void sen5x_read_values(const sen5x_t *dev ,sen5x_measurement_t *values) { assert(dev && values); i2c_acquire(dev->params.i2c_dev); diff --git a/drivers/sen5x/sen5x_saul.c b/drivers/sen5x/sen5x_saul.c index 44fbb36baf..9c88ff28a5 100644 --- a/drivers/sen5x/sen5x_saul.c +++ b/drivers/sen5x/sen5x_saul.c @@ -23,116 +23,126 @@ static int read_mass_concentration_pm1p0(const void *dev, phydat_t *res) { sen5x_t *d = (sen5x_t *)dev; + sen5x_measurement_t values; - sen5x_read_pm_values(d, &d->values); - - res->val[0] = (int16_t)d->values.mass_concentration_pm1p0; + sen5x_read_pm_values(d, &values); + + res->val[0] = (int16_t)values.mass_concentration_pm1p0; res->unit = UNIT_GPM3; - res->scale = -5; + res->scale = -7; return 1; } static int read_mass_concentration_pm2p5(const void *dev, phydat_t *res) { sen5x_t *d = (sen5x_t *)dev; + sen5x_measurement_t values; - sen5x_read_pm_values(d, &d->values); - - res->val[0] = (int16_t)d->values.mass_concentration_pm2p5; + sen5x_read_pm_values(d, &values); + + res->val[0] = (int16_t)values.mass_concentration_pm2p5; res->unit = UNIT_GPM3; - res->scale = -5; + res->scale = -7; return 1; } static int read_mass_concentration_pm4p0(const void *dev, phydat_t *res) { sen5x_t *d = (sen5x_t *)dev; + sen5x_measurement_t values; - sen5x_read_pm_values(d, &d->values); - - res->val[0] = (int16_t)d->values.mass_concentration_pm4p0; + sen5x_read_pm_values(d, &values); + + res->val[0] = (int16_t)values.mass_concentration_pm4p0; res->unit = UNIT_GPM3; - res->scale = -5; + res->scale = -7; return 1; } static int read_mass_concentration_pm10p0(const void *dev, phydat_t *res) { sen5x_t *d = (sen5x_t *)dev; + sen5x_measurement_t values; - sen5x_read_pm_values(d, &d->values); - - res->val[0] = (int16_t)d->values.mass_concentration_pm10p0; + sen5x_read_pm_values(d, &values); + + res->val[0] = (int16_t)values.mass_concentration_pm10p0; res->unit = UNIT_GPM3; - res->scale = -5; + res->scale = -7; return 1; } static int read_number_concentration_pm0p5(const void *dev, phydat_t *res) { sen5x_t *d = (sen5x_t *)dev; + sen5x_measurement_t values; - sen5x_read_pm_values(d, &d->values); + sen5x_read_pm_values(d, &values); - res->val[0] = (int16_t)d->values.number_concentration_pm0p5; + res->val[0] = (int16_t)values.number_concentration_pm0p5; res->unit = UNIT_CPM3; - res->scale = -5; + res->scale = -7; return 1; } static int read_number_concentration_pm1p0(const void *dev, phydat_t *res) { sen5x_t *d = (sen5x_t *)dev; + sen5x_measurement_t values; - sen5x_read_pm_values(d, &d->values); + sen5x_read_pm_values(d, &values); - res->val[0] = (int16_t)d->values.number_concentration_pm1p0; + res->val[0] = (int16_t)values.number_concentration_pm1p0; res->unit = UNIT_CPM3; - res->scale = -5; + res->scale = -7; return 1; } static int read_number_concentration_pm2p5(const void *dev, phydat_t *res) { sen5x_t *d = (sen5x_t *)dev; + sen5x_measurement_t values; - sen5x_read_pm_values(d, &d->values); + sen5x_read_pm_values(d, &values); - res->val[0] = (int16_t)d->values.number_concentration_pm2p5; + res->val[0] = (int16_t)values.number_concentration_pm2p5; res->unit = UNIT_CPM3; - res->scale = -5; + res->scale = -7; return 1; } static int read_number_concentration_pm4p0(const void *dev, phydat_t *res) { sen5x_t *d = (sen5x_t *)dev; + sen5x_measurement_t values; - sen5x_read_pm_values(d, &d->values); + sen5x_read_pm_values(d, &values); - res->val[0] = (int16_t)d->values.number_concentration_pm4p0; + res->val[0] = (int16_t)values.number_concentration_pm4p0; res->unit = UNIT_CPM3; - res->scale = -5; + res->scale = -7; return 1; } static int read_number_concentration_pm10p0(const void *dev, phydat_t *res) { sen5x_t *d = (sen5x_t *)dev; + sen5x_measurement_t values; - sen5x_read_pm_values(d, &d->values); + sen5x_read_pm_values(d, &values); - res->val[0] = (int16_t)d->values.number_concentration_pm10p0; + res->val[0] = (int16_t)values.number_concentration_pm10p0; res->unit = UNIT_CPM3; - res->scale = -5; + res->scale = -7; return 1; } static int read_typical_particle_size(const void *dev, phydat_t *res) { sen5x_t *d = (sen5x_t *)dev; + sen5x_measurement_t values; - sen5x_read_pm_values(d, &d->values); + sen5x_read_pm_values(d, &values); - res->val[0] = (int16_t)d->values.typical_particle_size; + res->val[0] = (int16_t)values.typical_particle_size; res->unit = UNIT_M; res->scale = -3; @@ -141,24 +151,26 @@ static int read_typical_particle_size(const void *dev, phydat_t *res) { static int read_ambient_humidity(const void *dev, phydat_t *res) { sen5x_t *d = (sen5x_t *)dev; + sen5x_measurement_t values; - sen5x_read_pm_values(d, &d->values); + sen5x_read_values(d, &values); - res->val[0] = (int16_t)d->values.ambient_humidity; + res->val[0] = (int16_t)values.ambient_humidity; res->unit = UNIT_PERCENT; - res->scale = 2; + res->scale = -2; return 1; } static int read_ambient_temperature(const void *dev, phydat_t *res) { sen5x_t *d = (sen5x_t *)dev; + sen5x_measurement_t values; - sen5x_read_pm_values(d, &d->values); + sen5x_read_values(d, &values); - res->val[0] = ((int16_t)d->values.ambient_temperature) / 2; + res->val[0] = ((int16_t)values.ambient_temperature) / 2; res->unit = UNIT_TEMP_C; - res->scale = 2; + res->scale = -2; return 1; } @@ -234,4 +246,4 @@ const saul_driver_t sen5x_ambient_temperature_driver = { .read = read_ambient_temperature, .write = saul_write_notsup, .type = SAUL_SENSE_TEMP -}; \ No newline at end of file +}; diff --git a/drivers/sen5x/sensirion_i2c_hal.c b/drivers/sen5x/sensirion_i2c_hal.c index d4ee11e521..eefae8a04c 100644 --- a/drivers/sen5x/sensirion_i2c_hal.c +++ b/drivers/sen5x/sensirion_i2c_hal.c @@ -40,17 +40,17 @@ void sensirion_i2c_hal_init(void) { // initialize the bus - i2c_init(I2C_DEVICE); + i2c_init(SEN5X_PARAM_I2C_DEV); // first, acquire the shared bus again - i2c_acquire(I2C_DEVICE); + i2c_acquire(SEN5X_PARAM_I2C_DEV); } /** * Release all resources initialized by sensirion_i2c_hal_init(). */ void sensirion_i2c_hal_free(void) { - i2c_release(I2C_DEVICE); + i2c_release(SEN5X_PARAM_I2C_DEV); } /** @@ -64,7 +64,7 @@ void sensirion_i2c_hal_free(void) { * @returns 0 on success, error code otherwise */ int8_t sensirion_i2c_hal_read(uint8_t address, uint8_t* data, uint16_t count) { - return i2c_read_bytes(I2C_DEVICE, address, data, count, 0); + return i2c_read_bytes(SEN5X_PARAM_I2C_DEV, address, data, count, 0); } /** @@ -79,7 +79,7 @@ int8_t sensirion_i2c_hal_read(uint8_t address, uint8_t* data, uint16_t count) { * @returns 0 on success, error code otherwise */ int8_t sensirion_i2c_hal_write(uint8_t address, const uint8_t* data, uint16_t count) { - return i2c_write_bytes(I2C_DEVICE, address, data, count, 0); + return i2c_write_bytes(SEN5X_PARAM_I2C_DEV, address, data, count, 0); } /** diff --git a/pkg/driver_sen5x/driver_sen5x.mk b/pkg/driver_sen5x/driver_sen5x.mk new file mode 100644 index 0000000000..5c7374c1bf --- /dev/null +++ b/pkg/driver_sen5x/driver_sen5x.mk @@ -0,0 +1,4 @@ +MODULE = driver_sen5x + +# $(shell rm sensirion_i2c_hal.c sensirion_i2c_hal.h sen5x_i2c_example_usage.c) +include $(RIOTBASE)/Makefile.base \ No newline at end of file diff --git a/tests/drivers/sen5x/Makefile b/tests/drivers/sen5x/Makefile new file mode 100644 index 0000000000..5911e3314d --- /dev/null +++ b/tests/drivers/sen5x/Makefile @@ -0,0 +1,9 @@ +include ../Makefile.drivers_common + +DRIVER ?= sen5x + +USEMODULE += $(DRIVER) +USEMODULE += printf_float +USEMODULE += xtimer + +include $(RIOTBASE)/Makefile.include \ No newline at end of file