当前位置: 首页 > news >正文

黄山派lvgl8学习笔记(3)导入陀螺仪传感器数据

嘉立创黄山派下载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, &ltr303, 1);if (res != 1)rt_kprintf("read data failed!size is %d\n", res);elsert_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);elsert_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);elsert_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);elsert_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);elsert_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(&ltr303_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更新一次
}

编译下载通过 

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

http://www.dtcms.com/a/296583.html

相关文章:

  • 解决VSCode中“#include错误,请更新includePath“问题
  • 深度分析Java内存结构
  • 基础NLP | 01 机器学习 深度学习基础介绍
  • JavaScript 文件在页面渲染中的加载机制详解
  • CF每日5题(1500-1600)
  • Unity3D + VR头显 × RTSP|RTMP播放器:构建沉浸式远程诊疗系统的技术实践
  • Springboot宠物用品商城的设计与实现
  • 深入理解 eMMC RPMB 与 OP-TEE 在 Linux 系统中的应用开发
  • 云祺容灾备份系统AWS S3对象存储备份与恢复实操手册
  • 字符串匹配经典问题整理
  • 深度分析Java内存回收机制
  • DGMR压缩技术:让大规模视觉Transformer模型体积减半而性能不减
  • 数据库第5章期末复习(仅供参考哦)
  • MDO7350A示波器的介绍【PINTECH品致】
  • 如何把Excel文件导入Navicat?
  • EXCEL——INDEX和MATCH傻傻分不清?
  • matplotlib.pyplot: 底层原理简析与进阶技巧
  • 2025暑期—07深度学习应用-YOLO
  • 如何查看docker实例是否挂载目录,以及挂载了哪些目录
  • TLSF(Two-Level Segregated Fit)内存分配器深入解析
  • 力扣.26删除有序数组中的重复项力扣121.买卖人股票的最佳时机力扣.1143最长公共子序列力扣72.编辑距离力扣12.整数转罗马数字
  • 同花顺前端潜在面试题目与答案
  • Redis的Pipeline
  • 期货交易系统:市场生态中的功能映射与价值逻辑
  • VB解除excel保护工作表
  • VTK开发day2:切片矩阵
  • 量子威胁下的区块链进化:后量子密码学时代的分布式账本革命
  • linux-process
  • 跨境支付入门~国际支付结算(基础篇)
  • QT开发---字符编码与QString和QByteArray