Open
Description
Hello, all how to put sleep and wakeup in every 10 seconds. in this DISCO_IOT_MultiEvent example code, I made some changes as below but my device still takes 160uA current. how to implement sleep and wakeup for measurement of my LSM6DSL gyro low power mode. I added my code below. kindly help me to solve this problem
// Includes.
#include <LSM6DSLSensor.h>
#define SerialPort Serial
#define I2C2_SCL PB10
#define I2C2_SDA PB11
#define INT1 PD11
// Components.
LSM6DSLSensor *AccGyr;
//Interrupts.
volatile int mems_event = 0;
uint16_t step_count = 0;
char report[256];
void INT1Event_cb();
void sendOrientation();
TwoWire *dev_i2c;
void setup() {
// Initialize serial for output.
SerialPort.begin(9600);
// Initialize I2C bus.
dev_i2c = new TwoWire(I2C2_SDA, I2C2_SCL);
dev_i2c->begin();
//Interrupts.
attachInterrupt(INT1, INT1Event_cb, RISING);
// Initlialize Components.
AccGyr = new LSM6DSLSensor(dev_i2c, LSM6DSL_ACC_GYRO_I2C_ADDRESS_LOW);
AccGyr->Enable_X();
// Enable all HW events.
AccGyr->Enable_Pedometer();
AccGyr->Enable_Tilt_Detection();
AccGyr->Enable_Free_Fall_Detection();
AccGyr->Enable_Single_Tap_Detection();
AccGyr->Enable_Double_Tap_Detection();
AccGyr->Enable_6D_Orientation();
LSM6DSL_ACC_GYRO_W_SleepMode_G(Handeler,LSM6DSL_ACC_GYRO_SLEEP_G_ENABLED);
LSM6DSL_ACC_GYRO_W_SLEEP_DUR(Handeler, 0x0A) ;
}
void loop() {
if (mems_event)
{
mems_event = 0;
LSM6DSL_Event_Status_t status;
AccGyr->Get_Event_Status(&status);
if (status.StepStatus)
{
// New step detected, so print the step counter
AccGyr->Get_Step_Counter(&step_count);
snprintf(report, sizeof(report), "Step counter: %d", step_count);
SerialPort.println(report);
}
if (status.FreeFallStatus)
{
// Output data.
SerialPort.println("Free Fall Detected!");
}
if (status.TapStatus)
{
// Output data.
SerialPort.println("Single Tap Detected!");
}
if (status.DoubleTapStatus)
{
// Output data.
SerialPort.println("Double Tap Detected!");
}
if (status.TiltStatus)
{
// Output data.
SerialPort.println("Tilt Detected!");
}
if (status.D6DOrientationStatus)
{
// Send 6D Orientation
sendOrientation();
}
}
}
void INT1Event_cb()
{
mems_event = 1;
}
void sendOrientation()
{
uint8_t xl = 0;
uint8_t xh = 0;
uint8_t yl = 0;
uint8_t yh = 0;
uint8_t zl = 0;
uint8_t zh = 0;
AccGyr->Get_6D_Orientation_XL(&xl);
AccGyr->Get_6D_Orientation_XH(&xh);
AccGyr->Get_6D_Orientation_YL(&yl);
AccGyr->Get_6D_Orientation_YH(&yh);
AccGyr->Get_6D_Orientation_ZL(&zl);
AccGyr->Get_6D_Orientation_ZH(&zh);
if ( xl == 0 && yl == 0 && zl == 0 && xh == 0 && yh == 1 && zh == 0 )
{
sprintf( report, "\r\n ________________ " \
"\r\n | | " \
"\r\n | * | " \
"\r\n | | " \
"\r\n | | " \
"\r\n | | " \
"\r\n | | " \
"\r\n |________________| \r\n" );
}
else if ( xl == 1 && yl == 0 && zl == 0 && xh == 0 && yh == 0 && zh == 0 )
{
sprintf( report, "\r\n ________________ " \
"\r\n | | " \
"\r\n | * | " \
"\r\n | | " \
"\r\n | | " \
"\r\n | | " \
"\r\n | | " \
"\r\n |________________| \r\n" );
}
else if ( xl == 0 && yl == 0 && zl == 0 && xh == 1 && yh == 0 && zh == 0 )
{
sprintf( report, "\r\n ________________ " \
"\r\n | | " \
"\r\n | | " \
"\r\n | | " \
"\r\n | | " \
"\r\n | | " \
"\r\n | * | " \
"\r\n |________________| \r\n" );
}
else if ( xl == 0 && yl == 1 && zl == 0 && xh == 0 && yh == 0 && zh == 0 )
{
sprintf( report, "\r\n ________________ " \
"\r\n | | " \
"\r\n | | " \
"\r\n | | " \
"\r\n | | " \
"\r\n | | " \
"\r\n | * | " \
"\r\n |________________| \r\n" );
}
else if ( xl == 0 && yl == 0 && zl == 0 && xh == 0 && yh == 0 && zh == 1 )
{
sprintf( report, "\r\n __*_____________ " \
"\r\n |________________| \r\n" );
}
else if ( xl == 0 && yl == 0 && zl == 1 && xh == 0 && yh == 0 && zh == 0 )
{
sprintf( report, "\r\n ________________ " \
"\r\n |________________| " \
"\r\n * \r\n" );
}
else
{
sprintf( report, "None of the 6D orientation axes is set in LSM6DSL - accelerometer.\r\n" );
}
SerialPort.print(report);
}