1、简述-基于Nucleo-L476L的健康运动助手
基于Nucleo-L476L的健康运动助手是一个基于STM32L476L的便携运动健康电子助手的原型设计。实现以下功能:
启动后不读取传感器数据,降低功耗。当检测到运动数据后,启动计步器,开始计算运动步数,同时读取运动环境的温度和湿度,同时读取大气压,折算运动位置的海拔。在中止运动一段时间后,停止计数,并输出运动量。
2、采用的硬件
采用Nucleo-STM32L476和X-NUCLEO-IKS01A3。其中应用到的四种传感器有:
3、开发环境和工具
3.1 开发环境使用Arduino1.8.9
3.2 开发需要先安装以上4种传感器的arduino驱动程序,然后直接在程序中引用库就可以了。
4、实现代码
这个代码使用了2个标志位mems_event = 0 和 ped_event=0,分别启动中断,上升沿启动内部置位的变化。
同时设定了一个IDLEPERIOD,演示设置位10000ms,即10秒,之后就退出计数。
/**
******************************************************************************
* @brief Arduino test application for the STMicrolectronics X-NUCLEO-IKS01A3
******************************************************************************
*/
// Includes
#include <LSM6DSOSensor.h>
#include <LIS2DW12Sensor.h>
#include <LPS22HHSensor.h>
#include <STTS751Sensor.h>
#ifdef ARDUINO_SAM_DUE
#define DEV_I2C Wire1
#elif defined(ARDUINO_ARCH_STM32)
#define DEV_I2C Wire
#elif defined(ARDUINO_ARCH_AVR)
#define DEV_I2C Wire
#else
#define DEV_I2C Wire
#endif
#define SerialPort Serial
#define INT_1 4
#define IDLEPERIOD 10000
// Components
LSM6DSOSensor *AccGyr;
LIS2DW12Sensor *Acc2;
LPS22HHSensor *Press;
STTS751Sensor *Temp;
//Interrupts.
volatile int mems_event = 0;
volatile int ped_event = 0;
uint16_t step_count = 0;
char report[256];
uint32_t previous_tick;
void INT0Event_cb();
void INT1Event_cb();
void runningmode();
void setup() {
// Led.
pinMode(LED_BUILTIN, OUTPUT);
// Initialize serial for output.
SerialPort.begin(115200);
// Initialize I2C bus.
DEV_I2C.begin();
//Interrupts.
attachInterrupt(A3, INT0Event_cb, RISING);
attachInterrupt(INT_1, INT1Event_cb, RISING);
//1. Using LSM6DSOSensor for Pedometer
AccGyr = new LSM6DSOSensor (&DEV_I2C);
AccGyr->Enable_X();
AccGyr->Enable_G();
AccGyr->Enable_Pedometer();
previous_tick = millis();
//2. Using LIS2DW12Sensor for wakeup detection
Acc2 = new LIS2DW12Sensor (&DEV_I2C);
Acc2->Enable_X();
Acc2->Enable_Wake_Up_Detection();
//3. Using LPS22HHSensor
Press = new LPS22HHSensor(&DEV_I2C);
Press->Enable();
//4. Using STTS751Sensor
Temp = new STTS751Sensor (&DEV_I2C);
Temp->Enable();
}
void loop() {
if (mems_event)
{
mems_event=0;
LIS2DW12_Event_Status_t status;
Acc2->Get_Event_Status(&status);
if (status.WakeUpStatus)
{
// Output data.
SerialPort.println("Wake up Detected!");
runningmode();
}
}
}
void runningmode()
{
bool idel=1;
while (idel){
if (ped_event)
{
ped_event=0;
LSM6DSO_Event_Status_t status;
AccGyr->Get_X_Event_Status(&status);
if (status.StepStatus)
{
// New step detected, so print the step counter
AccGyr->Get_Step_Count(&step_count);
//snprintf(report, sizeof(report), "Step counter: %d", step_count);
//SerialPort.println(report);
}
}
// Print the step counter in any case every 3000 ms
uint32_t current_tick = millis();
if((current_tick - previous_tick) >= IDLEPERIOD)
{
AccGyr->Get_Step_Count(&step_count);
snprintf(report, sizeof(report), "Step counter: %d", step_count);
SerialPort.println(report);
previous_tick = millis();
// Read pressure and temperature.
float pressure = 0, temperature2 = 0;
Press->GetPressure(&pressure);
//Read temperature
float temperature = 0;
Temp->GetTemperature(&temperature);
SerialPort.print("| Pres[hPa]: ");
SerialPort.print(pressure, 2);
SerialPort.print(" | Temp[C]: ");
SerialPort.print(temperature, 2);
SerialPort.print("\n ");
// Quit the while loop,
idel=0;
}
}
}
void INT1Event_cb()
{
ped_event = 1;
}
void INT0Event_cb()
{
mems_event = 1;
}
5、结果演示
5.1 初步显示计步器功能
5.2 综合计步器和环境温度和气压显示功能
显示唤醒后,开始计算运动步数,这里用手的摇动来显示结果,同时显示出环境温度和大气压。
6. 基于Nucleo-L476L的传感器数据读取的几点说明和建议
演示视频:
此内容由EEWORLD论坛网友北方原创,如需转载或用于商业用途需征得作者同意并注明出处