Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
LittlevGL_LVGL
瑞萨_RA6M4
基于RT-Thread+瑞萨RA6M4 + LVGL:智慧家庭之空气质量监测
发布于 2022-07-21 15:28:26 浏览:902
订阅该版
[tocm] # 整体架构 以前使用下列传感器做了空气质量监测采集器: |项目 | 传感器型号 | | --- | --- | |甲醛 | 达特 WZ-S-K | |TVOC、二氧化碳 |Sensirion SGP30 | |PM 2.5 | 攀藤 G7 | |温湿度、气压 | 博世 BME280 | 这个采集器通过串口输出各种测量值,本次实验借助瑞萨实现数据的图形化显示。 ![overview.png](https://oss-club.rt-thread.org/uploads/20220721/34422602c01c2e539185f1e226045369.png "overview.png") # 屏幕驱动 鉴于上次[“不太成功的经历”](https://club.rt-thread.org/ask/article/179b02ff485459cd.html),我又买了一块 [1.8 寸 160x128](https://m.tb.cn/h.fyrZUqm?tk=0Qhe2JKWvEM) 的小屏幕。它的驱动芯片 ST7735,在 RT-Thread 里一搜索,找到了这个 [PR](https://github.com/RT-Thread/rt-thread/pull/1435/),从中提取 `spi_lcd_st7735.c`。 基于此,实现一个跟 `drv_spi_ili9488` 相同的 `lcd_fill_array()` 接口: ```c void lcd_fill_array(rt_uint16_t x_start, rt_uint16_t y_start, rt_uint16_t x_end, rt_uint16_t y_end, void *pcolor) { rt_uint32_t size = 0; rt_uint8_t *array = RT_NULL; size = (x_end - x_start + 1) * (y_end - y_start + 1) * 3 /* 24bit */; array = (rt_uint8_t *)rt_malloc(size); if (!array) { LOG_E("not enough memory"); return ; } rt_uint32_t *color_p = (rt_uint32_t *)pcolor; for (rt_uint16_t i = 0; i < size / 3; i++) { array[3 * i] = *color_p >> 16; array[3 * i + 1] = *color_p >> 8; array[3 * i + 2] = *color_p; color_p++; } priv_region(x_start, y_start, x_end - x_start + 1, y_end - y_start + 1); priv_draw(array, size); rt_free(array); } ``` 为了方便切换两种屏幕型号,创建一个 `drv_lcd.c` 模块,根据编译开关选择驱动: ```c #if (defined use_st7735) #include "../lcd/drv_spi_st7735.c" #elif (defined use_ili9488) #include "../lcd/drv_spi_ili9488.c" #endif ``` 如果你也在使用 Keil + 灵活配置包 (或者叫做 **让 Keil 不灵活**的配置包),或许会更理解我为什么这么做。 # 绘制折线图 LVGL 提供了方便的双轴折线图,可以在一张图上取值范围大不相同的两组数据,比如温度($\degree C$)和 PM2.5($μg/m^3$)。 创建两个系列,`ser1` 用于显示温度,`ser2` 用于显示 PM2.5。LVGL Chart 的数据为 `int`,所以温度的单位设为 $0.1 \degree C$,PM2.5 为 $μg/m^3$。 ```c ser1 = lv_chart_add_series(chart1, lv_palette_main(LV_PALETTE_RED), LV_CHART_AXIS_PRIMARY_Y); ser2 = lv_chart_add_series(chart1, lv_palette_main(LV_PALETTE_BLUE), LV_CHART_AXIS_SECONDARY_Y); lv_chart_set_range(chart1, LV_CHART_AXIS_PRIMARY_Y, -200, 450); lv_chart_set_range(chart1, LV_CHART_AXIS_SECONDARY_Y, 10, 150); ``` # 数据的更新 参照 LVGL 的例子,在一个 `lv_timer` 的回调里更新各系列的数据。考虑到数据来自串口,通过以下这种简单的方式实现线程安全。 ```c struct { uint8_t t_new; uint8_t pm2p5_new; int t; int pm2p5; int last_t; int last_pm2p5; } new_data_state = {0}; void chart_add_temp_measurement(float v) { if (new_data_state.t_new) return; new_data_state.t = (int)(v * 10); new_data_state.t_new = 1; } void chart_add_pm2p5_measurement(float v) { if (new_data_state.pm2p5_new) return; new_data_state.pm2p5 = ((int)v); new_data_state.pm2p5_new = 1; } static void add_new_data(lv_timer_t * timer) { LV_UNUSED(timer); if ((0 == new_data_state.t_new) && (0 == new_data_state.pm2p5_new)) return; if (new_data_state.t_new) { new_data_state.last_t = new_data_state.t; new_data_state.t_new = 0; } if (new_data_state.pm2p5_new) { new_data_state.last_pm2p5 = new_data_state.pm2p5; new_data_state.pm2p5_new = 0; } lv_chart_set_next_value(chart1, ser1, new_data_state.last_t); lv_chart_set_next_value(chart1, ser2, new_data_state.pm2p5_new + lv_rand(20, 30)); } ``` # 感想 * FSP 不好用,不直观,使用的术语有点奇怪,比如 * Stacks:WTF? * Connectivity:我只见过把 BLE/Wi-Fi 等合称 Connectivity,或许是我孤陋寡闻。 * RT-Studio + FSP 使用起来有一定难度,如何理顺逻辑是一个大课题; * Keil + FSP:让 Keil 变得很不灵活 以上是不好的,也有很多好的方面: * RT-Thread 这种组件、软件包架构很好; * RT-Thread 代码风格优雅,只要有机会,还会使用。 最后,强烈建议论坛支持 [MathJax](https://www.mathjax.org/)。 ![微信图片_20220721152550.jpg](https://oss-club.rt-thread.org/uploads/20220721/16ace2d57fe510ceac305a95fb30b9c2.jpg.webp "微信图片_20220721152550.jpg") [smart_home.zip](https://club.rt-thread.org/file_download/c1e06f9e5fe7882a)
0
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
FLWX_7778
这家伙很懒,什么也没写!
文章
3
回答
0
被采纳
0
关注TA
发私信
相关文章
1
LittlevGL + DMA2D 显示图案扭曲
2
LittleVGL2RTT软件包还有在维护吗,测试遇到一些问题求解
3
使用littlevgl2rtt软件包实例运行不成功,emwin正常
4
关于littlevgl2rtt软件包刷频慢的解决方案?
5
移植了littlevGUI之后,用动态 线程去跑例程会卡死
6
lvgl的字体、图片文件如何升级?
7
qemu-vexpress-a9bsp下的littvgl工程可以实现触屏操作吗?
8
LVGL控件刷新死机问题
9
在lvgl上设置一个时间显示的label,一段时间后所有控件消失。
10
littlevgl2rtt和littlevgl的pc模拟器源码不兼容吗?
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
freemodbus
PWM
flash
cubemx
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
中断
编译报错
Debug
SFUD
rt_mq_消息队列_msg_queue
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
a1012112796
10
个答案
1
次被采纳
踩姑娘的小蘑菇
4
个答案
1
次被采纳
红枫
4
个答案
1
次被采纳
张世争
4
个答案
1
次被采纳
Ryan_CW
4
个答案
1
次被采纳
本月文章贡献
catcatbing
3
篇文章
5
次点赞
YZRD
2
篇文章
5
次点赞
qq1078249029
2
篇文章
2
次点赞
xnosky
2
篇文章
1
次点赞
Woshizhapuren
1
篇文章
5
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部