Hi,
I want to use the LIS2DH sensor to any motion interrupt on int2. It seem that it's implemented by the driver so I started with the code found in this issue (https://github.com/zephyrproject-rtos/zephyr/issues/20285).
The interrupt don't seem to be triggered on motion and when I reconnect with RTTViewer the motion callback is called multiple times.
Here is my code and my prj.conf.
#include <zephyr.h>
#include <device.h>
#include <drivers/sensor.h>
#include <stdio.h>
#include <sys/util.h>
struct device *dev_lis2dh;
int motion_counter = 0;
double xyz[3] = {0,0,0};
static int read_sensor(struct device *sensor, enum sensor_channel channel)
{
struct sensor_value val[3];
int ret = 0;
ret = sensor_sample_fetch(sensor);
if (ret < 0 && ret != -EBADMSG) {
//printf("Sensor sample update error\n");
goto end;
}
ret = sensor_channel_get(sensor, channel, val);
if (ret < 0) {
printf("Cannot read sensor channels\n");
goto end;
}
printf("\n( x y z ) = ( %f %f %f )\n\n", sensor_value_to_double(&val[0]),
sensor_value_to_double(&val[1]),
sensor_value_to_double(&val[2]));
end:
return ret;
}
static int store_sensor(struct device *sensor, enum sensor_channel channel)
{
struct sensor_value val[3];
int ret = 0;
ret = sensor_sample_fetch(sensor);
if (ret < 0 && ret != -EBADMSG) {
//printf("Sensor sample update error\n");
goto end;
}
ret = sensor_channel_get(sensor, channel, val);
if (ret < 0) {
printf("Cannot read sensor channels\n");
goto end;
}
for(int i=0;i<3;i++) {
xyz[i] = sensor_value_to_double(&val[i]);
}
end:
return ret;
}
static void lis2dh_handler_data_ready(const struct device *dev, const struct sensor_trigger *trig)
{
//printf("lis2dh_handler_data_ready ~~> ##################### DATA \n");
}
static void lis2dh_handler_motion(const struct device *dev, const struct sensor_trigger *trig)
{
//printf("lis2dh_handler_motion ~~> ##################### MOTION\n");
//read_sensor(dev_lis2dh, SENSOR_CHAN_ACCEL_XYZ);
motion_counter++;
store_sensor(dev_lis2dh, SENSOR_CHAN_ACCEL_XYZ);
}
float lis2dh_from_lsb_hr_to_celsius(int16_t lsb)
{
return ( ( (float)lsb / 64.0f ) / 4.0f ) + 25.0f;
}
void main(void)
{
printf("\n\n\rLIS2DH example %s %s\n\r", __DATE__, __TIME__);
printf("lis2dh app test starting...\n");
int err = 0;
dev_lis2dh = DEVICE_DT_GET_ANY(st_lis2dh);
if (dev_lis2dh == NULL) {
printf("Device %s is not ready\n", dev_lis2dh->name);
return;
}
if (IS_ENABLED(CONFIG_LIS2DH_TRIGGER)) {
struct sensor_trigger trig = {
.type = SENSOR_TRIG_DELTA,
.chan = SENSOR_CHAN_ACCEL_XYZ,
};
if (sensor_trigger_set(dev_lis2dh, &trig, lis2dh_handler_motion) < 0) {
printf("Cannot configure trigger 2: lis2dh_handler_motion\n");
return;
};
// SENSOR_ATTR_SLOPE_TH
//
static struct sensor_value val_threshold; // = {0,200};
//sensor_degrees_to_rad(10, &val_threshold);
val_threshold.val1 = 19;
val_threshold.val2 = 613300;
err = sensor_attr_set(dev_lis2dh, SENSOR_CHAN_ACCEL_XYZ, SENSOR_ATTR_SLOPE_TH, &val_threshold);
if (err) {
printf("dev_lis2dh - Unable to set attrs TH\n");
}
// SENSOR_ATTR_SLOPE_DUR
// just val1 ... is used 0..127
static struct sensor_value val_duration;
val_duration.val1 = 1;
val_duration.val2 = 0;
err = sensor_attr_set(dev_lis2dh, SENSOR_CHAN_ACCEL_XYZ, SENSOR_ATTR_SLOPE_DUR, &val_duration);
if (err) {
printf("dev_lis2dh - Unable to set attrs DUR\n");
}
}
while (1) {
//printf("dev_lis2dh read data:\n");
if (read_sensor(dev_lis2dh, SENSOR_CHAN_ACCEL_XYZ) < 0) {
//printf("Failed to read accelerometer data\n");
}
printf("\nmotion %d ( x y z ) = ( %f %f %f )\n\n",motion_counter, xyz[0],xyz[1],xyz[2]);
k_busy_wait(1000000);
}
}
CONFIG_STDOUT_CONSOLE=y CONFIG_I2C=y CONFIG_SENSOR=y CONFIG_LIS2DH=y CONFIG_LIS2DH_TRIGGER_OWN_THREAD=y CONFIG_LIS2DH_ACCEL_RANGE_2G=y CONFIG_LIS2DH_ODR_1=y CONFIG_MAIN_STACK_SIZE=16384 CONFIG_HEAP_MEM_POOL_SIZE=16384 CONFIG_CBPRINTF_FP_SUPPORT=y CONFIG_UART_CONSOLE=n CONFIG_LOG_BACKEND_UART=n CONFIG_USE_SEGGER_RTT=y CONFIG_RTT_CONSOLE=y CONFIG_LOG_BACKEND_RTT=y CONFIG_SHELL_BACKEND_SERIAL=n CONFIG_SHELL_BACKEND_RTT=n CONFIG_LOG=y CONFIG_DEBUG=y CONFIG_PRINTK=y CONFIG_I2C_LOG_LEVEL_DBG=y CONFIG_GPIO_LOG_LEVEL_DBG=y CONFIG_SENSOR_LOG_LEVEL_DBG=y CONFIG_REGULATOR_LOG_LEVEL_DBG=y CONFIG_GPIO_AS_PINRESET=n