STM32CubeWL/Projects/B-WL5M-SUBG1/Examples/BSP/BSP_Example/Src/sensors.c

351 lines
8.5 KiB
C

/**
******************************************************************************
* @file sensors.c
* @author MCD Application Team
* @brief This example code shows how to use the sensors supported by the
* B-WL5M-SUBG board
******************************************************************************
* @attention
*
* Copyright (c) 2022 STMicroelectronics.
* All rights reserved.
*
* This software is licensed under terms that can be found in the LICENSE file
* in the root directory of this software component.
* If no LICENSE file comes with this software, it is provided AS-IS.
*
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include "main.h"
/** @addtogroup STM32WLxx_HAL_Examples
* @{
*/
/** @addtogroup BSP
* @{
*/
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
#define CELSIUS_ASCII_CODE 248
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
/**
* @brief Demo of STTS22H temperature sensor.
*/
void Temperature_demo(void)
{
#if defined(USE_ENV_SENSOR_STTS22H_0)
float temperature;
temperature = 0;
BSP_LED_Init(LED_GREEN);
uint32_t ret = BSP_ENV_SENSOR_Init(ENV_SENSOR_STTS22H_0, ENV_TEMPERATURE);
if (ret != BSP_ERROR_NONE)
{
Error_Handler();
}
ret = BSP_ENV_SENSOR_Enable(ENV_SENSOR_STTS22H_0, ENV_TEMPERATURE);
if (ret != BSP_ERROR_NONE)
{
Error_Handler();
}
for(uint8_t i = 0; i < 10; i++)
{
ret = BSP_ENV_SENSOR_GetValue(ENV_SENSOR_STTS22H_0, ENV_TEMPERATURE, &temperature);
if (ret != BSP_ERROR_NONE)
{
Error_Handler();
}
printf("\tTemperature = %f\n", temperature);
HAL_Delay(1000);
BSP_LED_Toggle(LED_GREEN);
}
ret = BSP_ENV_SENSOR_Disable(ENV_SENSOR_STTS22H_0, ENV_TEMPERATURE);
if (ret != BSP_ERROR_NONE)
{
Error_Handler();
}
ret = BSP_ENV_SENSOR_DeInit(ENV_SENSOR_STTS22H_0);
if (ret != BSP_ERROR_NONE)
{
Error_Handler();
}
BSP_LED_DeInit(LED_GREEN);
#endif /* defined(USE_ENV_SENSOR_STTS22H_0) */
}
/**
* @brief Demo of ILPS22QS pressure sensor.
*/
void Pressure_demo(void)
{
#if defined(USE_ENV_SENSOR_ILPS22QS_0)
float pressure;
pressure = 0;
uint32_t ret = BSP_ENV_SENSOR_Init(ENV_SENSOR_ILPS22QS_0, ENV_PRESSURE);
if (ret != BSP_ERROR_NONE)
{
Error_Handler();
}
ret = BSP_ENV_SENSOR_SetOutputDataRate(ENV_SENSOR_ILPS22QS_0, ENV_PRESSURE, 4);
if (ret != BSP_ERROR_NONE)
{
Error_Handler();
}
ret = BSP_ENV_SENSOR_Enable(ENV_SENSOR_ILPS22QS_0, ENV_PRESSURE);
if (ret != BSP_ERROR_NONE)
{
Error_Handler();
}
for(uint8_t i = 0; i < 10; i++)
{
ret = BSP_ENV_SENSOR_GetValue(ENV_SENSOR_ILPS22QS_0, ENV_PRESSURE, &pressure);
if (ret != BSP_ERROR_NONE)
{
Error_Handler();
}
printf("\tPressure = %f\n", pressure);
HAL_Delay(1000);
}
// Disable sensor to put it in PowerDown (required condition for OneShot feature)
ret = BSP_ENV_SENSOR_Disable(ENV_SENSOR_ILPS22QS_0, ENV_PRESSURE);
if (ret != BSP_ERROR_NONE)
{
Error_Handler();
}
printf("\tGet Pressure with OneShot mode...\n");
ret = BSP_ENV_SENSOR_Set_One_Shot(ENV_SENSOR_ILPS22QS_0);
if (ret != BSP_ERROR_NONE)
{
Error_Handler();
}
uint8_t status;
for(uint8_t i = 0; i < 3; i++)
{
ret = BSP_ENV_SENSOR_Get_One_Shot_Status(ENV_SENSOR_ILPS22QS_0, &status);
if (ret != BSP_ERROR_NONE)
{
Error_Handler();
}
ret = BSP_ENV_SENSOR_GetValue(ENV_SENSOR_ILPS22QS_0, ENV_PRESSURE, &pressure);
if (ret != BSP_ERROR_NONE)
{
Error_Handler();
}
// At first iteration, status should be set to 1, next always 0 because BSP_ENV_SENSOR_Set_One_Shot is not recalled !
printf("\tPressure = %f (one shot status = %d)\n", pressure, status);
HAL_Delay(1000);
}
printf("\tGet Pressure with second OneShot mode...\n");
// Disable sensor to put it in PowerDown (required condition for OneShot feature)
ret = BSP_ENV_SENSOR_Disable(ENV_SENSOR_ILPS22QS_0, ENV_PRESSURE);
if (ret != BSP_ERROR_NONE)
{
Error_Handler();
}
ret = BSP_ENV_SENSOR_Set_One_Shot(ENV_SENSOR_ILPS22QS_0);
if (ret != BSP_ERROR_NONE)
{
Error_Handler();
}
HAL_Delay(1);
ret = BSP_ENV_SENSOR_Get_One_Shot_Status(ENV_SENSOR_ILPS22QS_0, &status);
if (ret != BSP_ERROR_NONE)
{
Error_Handler();
}
printf("\tPressure = %f (one shot status = %d)\n", pressure, status);
ret = BSP_ENV_SENSOR_Disable(ENV_SENSOR_ILPS22QS_0, ENV_PRESSURE);
if (ret != BSP_ERROR_NONE)
{
Error_Handler();
}
ret = BSP_ENV_SENSOR_DeInit(ENV_SENSOR_ILPS22QS_0);
if (ret != BSP_ERROR_NONE)
{
Error_Handler();
}
#endif /* defined(USE_ENV_SENSOR_ILPS22QS_0) */
}
/**
* @brief Demo of ISM330DHCX accelerometer sensor.
*/
void Accelero_demo(void)
{
#if defined(USE_MOTION_SENSOR_ISM330DHCX_0)
MOTION_SENSOR_Axes_t acceleration;
uint32_t ret = BSP_MOTION_SENSOR_Init(MOTION_SENSOR_ISM330DHCX_0, MOTION_ACCELERO);
if (ret != BSP_ERROR_NONE)
{
Error_Handler();
}
ret = BSP_MOTION_SENSOR_Enable(MOTION_SENSOR_ISM330DHCX_0, MOTION_ACCELERO);
if (ret != BSP_ERROR_NONE)
{
Error_Handler();
}
for(uint8_t i = 0; i < 10; i++)
{
memset(&acceleration, 0, sizeof(MOTION_SENSOR_Axes_t));
ret = BSP_MOTION_SENSOR_GetAxes(MOTION_SENSOR_ISM330DHCX_0, MOTION_ACCELERO, &acceleration);
if (ret != BSP_ERROR_NONE)
{
Error_Handler();
}
printf( "\tAccelero (x = %d, y = %d, z = %d)\n", acceleration.x, acceleration.y, acceleration.z);
HAL_Delay(1000);
}
ret = BSP_MOTION_SENSOR_Disable(MOTION_SENSOR_ISM330DHCX_0, MOTION_ACCELERO);
if (ret != BSP_ERROR_NONE)
{
Error_Handler();
}
ret = BSP_MOTION_SENSOR_DeInit(MOTION_SENSOR_ISM330DHCX_0);
if (ret != BSP_ERROR_NONE)
{
Error_Handler();
}
#endif /* USE_MOTION_SENSOR_ISM330DHCX_0 */
}
/**
* @brief Demo of ISM330DHCX gyroscope sensor.
*/
void Gyro_demo(void)
{
#if defined(USE_MOTION_SENSOR_ISM330DHCX_0)
MOTION_SENSOR_Axes_t angular_velocity;
uint32_t ret = BSP_MOTION_SENSOR_Init(MOTION_SENSOR_ISM330DHCX_0, MOTION_GYRO);
if (ret != BSP_ERROR_NONE)
{
Error_Handler();
}
ret = BSP_MOTION_SENSOR_Enable(MOTION_SENSOR_ISM330DHCX_0, MOTION_GYRO);
if (ret != BSP_ERROR_NONE)
{
Error_Handler();
}
for(uint8_t i = 0; i < 10; i++)
{
memset(&angular_velocity, 0, sizeof(MOTION_SENSOR_Axes_t));
ret = BSP_MOTION_SENSOR_GetAxes(MOTION_SENSOR_ISM330DHCX_0, MOTION_GYRO, &angular_velocity);
if (ret != BSP_ERROR_NONE)
{
Error_Handler();
}
printf("\tGyro (x = %d, y = %d, z = %d)\n", angular_velocity.x, angular_velocity.y, angular_velocity.z);
HAL_Delay(1000);
}
ret = BSP_MOTION_SENSOR_Disable(MOTION_SENSOR_ISM330DHCX_0, MOTION_GYRO);
if (ret != BSP_ERROR_NONE)
{
Error_Handler();
}
ret = BSP_MOTION_SENSOR_DeInit(MOTION_SENSOR_ISM330DHCX_0);
if (ret != BSP_ERROR_NONE)
{
Error_Handler();
}
#endif /* USE_MOTION_SENSOR_ISM330DHCX_0 */
}
/**
* @brief Demo of ISM330DHCX gyroscope sensor.
*/
void Magneto_demo(void)
{
#if defined(USE_MOTION_SENSOR_IIS2MDC_0)
MOTION_SENSOR_Axes_t angular_velocity;
uint32_t ret = BSP_MOTION_SENSOR_Init(MOTION_SENSOR_IIS2MDC_0, MOTION_MAGNETO);
if (ret != BSP_ERROR_NONE)
{
Error_Handler();
}
ret = BSP_MOTION_SENSOR_Enable(MOTION_SENSOR_IIS2MDC_0, MOTION_MAGNETO);
if (ret != BSP_ERROR_NONE)
{
Error_Handler();
}
for(uint8_t i = 0; i < 10; i++)
{
memset(&angular_velocity, 0, sizeof(MOTION_SENSOR_Axes_t));
ret = BSP_MOTION_SENSOR_GetAxes(MOTION_SENSOR_IIS2MDC_0, MOTION_MAGNETO, &angular_velocity);
if (ret != BSP_ERROR_NONE)
{
Error_Handler();
}
printf("\tMAGNETO (x = %d, y = %d, z = %d)\n", angular_velocity.x, angular_velocity.y, angular_velocity.z);
HAL_Delay(1000);
}
ret = BSP_MOTION_SENSOR_Disable(MOTION_SENSOR_IIS2MDC_0, MOTION_MAGNETO);
if (ret != BSP_ERROR_NONE)
{
Error_Handler();
}
ret = BSP_MOTION_SENSOR_DeInit(MOTION_SENSOR_IIS2MDC_0);
if (ret != BSP_ERROR_NONE)
{
Error_Handler();
}
#endif /* USE_MOTION_SENSOR_ISM330DHCX_0 */
}
/**
* @}
*/
/**
* @}
*/