黄山派lvgl8学习笔记(3)导入陀螺仪传感器数据
本文介绍了在黄山派开发板上使用LVGL8和LSM6DS六轴传感器的过程。首先通过menuconfig配置传感器使能和I2C接口,然后创建lv_sensor.c/h文件实现传感器初始化、数据采集等功能。在LVGL界面中创建标签控件,通过定时器实时更新并显示陀螺仪数据。最终实现了一个带背景色切换按钮和实时陀螺仪数据显示的GUI界面。文章详细说明了配置步骤、代码实现方法及传感器数据读取显示的完整流程。
嘉立创黄山派下载watch ui demo 教程(sf32)-CSDN博客
(简笔)黄山派sf32 lvgl8更换播放器music demo-CSDN博客
黄山派lvgl8学习笔记(1)画一个一个全白的背景-CSDN博客
黄山派lvgl8学习笔记(2)导入头文件和新建一个按钮控件-CSDN博客
上篇博客,我们讲了如何引入自己的头文件到工程中去并且完成了一个可以通过按键来切换背景颜色的任务,这篇我们继续来说下如何使用黄山派的六轴传感器并新建一个标签来显示在背景上。
一,LSM6DS 传感器并完成初始化
我们这个工程里,点开来看,只有lvgl8的项目工程,并没有黄山派板载的传感器这些,所有我们要先进行传感器的初始化,黄山派里,官方已经给我们准备好了初始化和读取数据的这些函数,我们只需要调用即可,不用从hal库层重写传感器初始化这些。而调用这些函数,就需要我们先在menuconfig里,进行配置。

我们先进入黄山派的官方,看看官方是如何进行传感器的初始化黄山派—sensor
点开界面就可以看到黄山派传感器的介绍了。

这里有一点,如下图所示,黄山派各个传感器是单独的电源,所以我们要先对电源进行初始化,才可以使能传感器。

介绍完毕,我们进入到lvgl的工程(project)里去,用下面的命令打开menuconfig配置界面
scons --board=sf32lb52-lchspi-ulp --menuconfig
然后在下图红框里的路径下,使能6D Sensor

使能完成后吗,继续回车,然后对LSM6DSL进行使能。结束后esc返回

继续进入下面这个界面,找到MMC56x03进行使能

然后对I2C3 进行配置(传感器所用到的I2C接口)

完成好这些后,我们按D便可进行保存

按下回车,保存完成后显示如下所示

然后退出即可。看不懂的,可以直接去官网,这里配置和官网配置的一样(黄山派—sensor)
(关于menuconfig官网也提到了些menuconfig)
二,编写传感器代码并在lvgl中使用
我们已经配置好了引脚并且对其完成了初始化,接下来我们继续看下sensor如何使用
sensor (这个和前面黄山派sensor一样),进入后,拉到最下面,我们就能看到官网的写法

这里我们对其进行重新一直,我们现在lv_user下创建lv_sensor.c和lv_sensor.h两个文件,并且将下面代码复制进去(均来自官方)
// this file is lv_sensor.c
#include "lv_sensor.h"
void board_io_init(void)
{
HAL_PIN_Set(PAD_PA40, I2C3_SCL, PIN_PULLUP, 1);
HAL_PIN_Set(PAD_PA39, I2C3_SDA, PIN_PULLUP, 1);
}
// 初始化所有传感器
void sensors_init(struct rt_sensor_config *cfg)
{
cfg->intf.dev_name = "i2c3";
rt_hw_ltr303_init("ltr303", cfg);
rt_hw_mmc56x3_init("mmc56x3", cfg);
cfg->intf.user_data = (void *)LSM6DSL_ADDR_DEFAULT;
cfg->irq_pin.pin = RT_PIN_NONE;
rt_hw_lsm6dsl_init("lsm6d", cfg);
}
// 打开并配置传感器设备
void open_and_config_devices(rt_device_t *ltr303_dev, rt_device_t *mmc56x3_dev,
rt_device_t *lsm6d_dev, rt_device_t *lsm6d_gyro_dev, rt_device_t *lsm6d_step_dev)
{
*ltr303_dev = rt_device_find("li_ltr303");
if (*ltr303_dev == RT_NULL)
rt_kprintf("Can't find device:%s\n", "ltr303");
else {
rt_err_t ret = rt_device_open(*ltr303_dev, RT_DEVICE_FLAG_RDONLY);
if (ret != RT_EOK)
rt_kprintf("open device failed! err: %d\n", ret);
rt_device_control(*ltr303_dev, RT_SENSOR_CTRL_SET_POWER, (void *)RT_SENSOR_POWER_NORMAL);
}
*mmc56x3_dev = rt_device_find("mag_mmc56x3");
if (*mmc56x3_dev == RT_NULL)
rt_kprintf("Can't find device:%s\n", "mmc56x3");
else {
rt_err_t ret = rt_device_open(*mmc56x3_dev, RT_DEVICE_FLAG_RDONLY);
if (ret != RT_EOK)
rt_kprintf("open device failed! err: %d\n", ret);
}
*lsm6d_dev = rt_device_find("acce_lsm");
*lsm6d_gyro_dev = rt_device_find("gyro_lsm");
*lsm6d_step_dev = rt_device_find("step_lsm");
if (*lsm6d_dev == RT_NULL || *lsm6d_gyro_dev == RT_NULL || *lsm6d_step_dev == RT_NULL)
rt_kprintf("Can't find device:%s\n", "lsm6d");
else {
rt_err_t ret = rt_device_open(*lsm6d_dev, RT_DEVICE_FLAG_RDONLY);
ret += rt_device_open(*lsm6d_gyro_dev, RT_DEVICE_FLAG_RDONLY);
ret += rt_device_open(*lsm6d_step_dev, RT_DEVICE_FLAG_RDONLY);
if (ret != RT_EOK)
rt_kprintf("open device failed! err: %d\n", ret);
rt_device_control(*lsm6d_dev, RT_SENSOR_CTRL_SET_ODR, (void *)1660);
rt_device_control(*lsm6d_gyro_dev, RT_SENSOR_CTRL_SET_ODR, (void *)1660);
}
}
// 传感器数据采集与打印
void sensors_loop(rt_device_t ltr303_dev, rt_device_t mmc56x3_dev,
rt_device_t lsm6d_dev, rt_device_t lsm6d_gyro_dev, rt_device_t lsm6d_step_dev)
{
struct rt_sensor_data ltr303, mmc56x3, lsm6d_acce, lsm6d_gyro, lsm6d_step;
rt_size_t res;
res = rt_device_read(ltr303_dev, 0, <r303, 1);
if (res != 1)
rt_kprintf("read data failed!size is %d\n", res);
else
rt_kprintf("light: %d lux\n", ltr303.data.light);
res = rt_device_read(mmc56x3_dev, 0, &mmc56x3, 1);
if (res != 1)
rt_kprintf("read data failed!size is %d\n", res);
else
rt_kprintf("mag, x: %d, y: %d, z: %d\n", mmc56x3.data.mag.x, mmc56x3.data.mag.y, mmc56x3.data.mag.z);
res = rt_device_read(lsm6d_dev, 0, &lsm6d_acce, 1);
if (res != 1)
rt_kprintf("read data failed!size is %d\n", res);
else
rt_kprintf("acce, x: %d, y: %d, z: %d\n", lsm6d_acce.data.acce.x, lsm6d_acce.data.acce.y, lsm6d_acce.data.acce.z);
res = rt_device_read(lsm6d_gyro_dev, 0, &lsm6d_gyro, 1);
if (res != 1)
rt_kprintf("read data failed!size is %d\n", res);
else
rt_kprintf("gyro, x: %d, y: %d, z: %d\n", lsm6d_gyro.data.gyro.x, lsm6d_gyro.data.gyro.y, lsm6d_gyro.data.gyro.z);
res = rt_device_read(lsm6d_step_dev, 0, &lsm6d_step, 1);
if (res != 1)
rt_kprintf("read data failed!size is %d\n", res);
else
rt_kprintf("lsm6d step, step: %d\n", lsm6d_step.data.step);
rt_thread_mdelay(100);
rt_kprintf("\n");
}
#ifndef SENSOR_H
#define SENSOR_H
#ifdef __cplusplus
extern "C" {
#endif
#include "sensor_liteon_ltr303.h"
#include "sensor_memsic_mmc56x3.h"
#include "st_lsm6dsl_sensor_v1.h"
#include "stdio.h"
#include "string.h"
#include "drv_gpio.h"
void lv_sensor_loop(rt_device_t ltr303_dev, rt_device_t mmc56x3_dev,
rt_device_t lsm6d_dev, rt_device_t lsm6d_gyro_dev,
rt_device_t lsm6d_step_dev);
void board_io_init(void);
void sensors_init(struct rt_sensor_config *cfg);
void open_and_config_devices(rt_device_t *ltr303_dev, rt_device_t *mmc56x3_dev,
rt_device_t *lsm6d_dev, rt_device_t *lsm6d_gyro_dev,
rt_device_t *lsm6d_step_dev);
void sensors_loop(rt_device_t ltr303_dev, rt_device_t mmc56x3_dev,
rt_device_t lsm6d_dev, rt_device_t lsm6d_gyro_dev,
rt_device_t lsm6d_step_dev);
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif /* SENSOR_H */
我们要在lvgl下输出传感器的数据,要先创建一个标签,然后赋值给这个标签。并且实时更新这个传感器的数据给标签
// this file is lv_user1.c
#include "lv_user1.h"
#include "../lvgl.h"
#include "lv_sensor.h"
static uint8_t current_color = COLOR_WHITE;
static lv_obj_t *gyro_label;
static rt_device_t lsm6d_gyro_dev;
static void btn_event_cb(lv_event_t * e)
{
lv_event_code_t code = lv_event_get_code(e);
lv_obj_t * scr = lv_scr_act();
if(code == LV_EVENT_CLICKED) {
current_color = (current_color + 1) % 3;
switch(current_color) {
case COLOR_WHITE:
lv_obj_set_style_bg_color(scr, lv_color_white(), 0);
break;
case COLOR_GRAY:
lv_obj_set_style_bg_color(scr, lv_color_make(128, 128, 128), 0);
break;
case COLOR_BLUE:
lv_obj_set_style_bg_color(scr, lv_color_make(0, 0, 255), 0);
break;
}
}
}
static void gyro_update_timer(lv_timer_t * timer)
{
struct rt_sensor_data lsm6d_gyro;
rt_size_t res = rt_device_read(lsm6d_gyro_dev, 0, &lsm6d_gyro, 1);
if(res == 1) {
char buf[64];
snprintf(buf, sizeof(buf), "Gyro:\nX: %d\nY: %d\nZ: %d",
lsm6d_gyro.data.gyro.x,
lsm6d_gyro.data.gyro.y,
lsm6d_gyro.data.gyro.z);
lv_label_set_text(gyro_label, buf);
}
}
void my_demo_white(void)
{
rt_device_t ltr303_dev, mmc56x3_dev, lsm6d_dev, lsm6d_step_dev;
open_and_config_devices(<r303_dev, &mmc56x3_dev, &lsm6d_dev, &lsm6d_gyro_dev, &lsm6d_step_dev);
lv_obj_t *scr = lv_scr_act();
lv_obj_set_style_bg_color(scr, lv_color_white(), 0);
lv_obj_set_style_bg_opa(scr, LV_OPA_COVER, 0);
lv_obj_t * btn = lv_btn_create(scr);
lv_obj_set_size(btn, 100, 50);
lv_obj_set_pos(btn, 50, 50);
lv_obj_add_event_cb(btn, btn_event_cb, LV_EVENT_ALL, NULL);
lv_obj_set_style_bg_color(btn, lv_color_make(0, 255, 0), 0);
lv_obj_set_style_bg_opa(btn, LV_OPA_COVER, 0);
lv_obj_t * label = lv_label_create(btn);
lv_label_set_text(label, "Toggle");
lv_obj_center(label);
gyro_label = lv_label_create(scr);
lv_obj_set_pos(gyro_label, 50, 110);
lv_label_set_text(gyro_label, "Gyro:\nX: 0\nY: 0\nZ: 0");
lv_obj_set_style_text_color(gyro_label, lv_color_black(), 0);
lv_timer_create(gyro_update_timer, 100, NULL); // 每100ms更新一次
}
编译下载通过

感谢各位愿意耐心读完,有问题欢迎前来指正
更多推荐



所有评论(0)