兆易GD32H759I-EVAL LVGL - [仪表盘]
[复制链接]
大家好,今天继上一节我们移植LVGL之后,我本地也跑了LVGL的benchmark。发现GD32H759I这个MCU在处理图像方面非常强大。非常适合跑一些大资源的项目,比如说涉及到LVGL方面的。或者是图像方面的。那么今天的帖子我将使用 兆易GD32H759I-EVAL 开发板结合LVGL来制作一个电脑的仪表盘。并且结合我自己编写的一个上位机程序,可以通过串口的方式把电脑的CPU 或者RAM的内存占用率发送给GD32H759I-EVAL。 通过串口中断的方式在回调函数中更新LVGL来实现实时查看CPU或者RAM使用率的效果。在本篇文章中你将会看到如何使用Gui-guider来创建LVGL元素并且在开发板上显示。
正文
今天我们先看效果:(上位机软件使用教程)
6月22日
开发板效果
WeChat_20240622043242
上位机源码:
import psutil
import math
import serial.tools.list_ports
import time
import tkinter as tk
from tkinter import ttk
from threading import Thread
def get_memory_usage():
"""获取当前系统的内存使用率并向上取整"""
memory_usage = psutil.virtual_memory().percent
return math.ceil(memory_usage)
def list_serial_ports():
"""列出可用的串口"""
ports = serial.tools.list_ports.comports()
return [port.device for port in ports]
def send_memory_usage():
"""不断获取内存使用率并发送到指定的串口"""
global sending
sending = True
serial_port = port_combobox.get()
baud_rate = int(baud_rate_combobox.get())
ser = serial.Serial(serial_port, baud_rate)
try:
while sending:
memory_usage = get_memory_usage()
hex_memory_usage = bytes([memory_usage]) # 将内存使用率转换为单字节
ser.write(hex_memory_usage)
status_label.config(text=f"Status: Sending (Port: {serial_port}, Baud Rate: {baud_rate})")
time.sleep(1) # 每秒获取一次
except KeyboardInterrupt:
print("Stopping...")
finally:
ser.close()
status_label.config(text="Status: Not sending")
def stop_sending():
"""停止发送内存使用率"""
global sending
sending = False
status_label.config(text="Status: Stopping... Please wait.")
time.sleep(2) # 等待2秒以确保线程停止
status_label.config(text="Status: Not sending")
# GUI
root = tk.Tk()
root.title("Memory Usage Sender")
# Prevent resizing of the window
root.resizable(False, False)
# Serial Port Selection
port_label = tk.Label(root, text="Select Serial Port:")
port_label.pack()
ports = list_serial_ports()
port_combobox = ttk.Combobox(root, values=ports, width=25)
port_combobox.pack()
# Baud Rate Selection
baud_rates = [9600, 19200, 38400, 57600, 115200]
baud_rate_label = tk.Label(root, text="Select Baud Rate:")
baud_rate_label.pack()
baud_rate_combobox = ttk.Combobox(root, values=baud_rates, width=10)
baud_rate_combobox.pack()
# Start Button
start_button = tk.Button(root, text="Start Sending", command=lambda: Thread(target=send_memory_usage).start(), pady=10)
start_button.pack()
# Add empty label for spacing
tk.Label(root).pack()
# Stop Button
stop_button = tk.Button(root, text="Stop Sending", command=stop_sending, pady=10)
stop_button.pack()
# Status Label
status_label = tk.Label(root, text="Status: Not sending")
status_label.pack()
root.geometry("300x250") # 设置窗口大小为300x250
# 将窗口显示在屏幕中心
root.eval('tk::PlaceWindow . center')
sending = False # 初始状态为未发送
root.mainloop()
接下来我们看下如何使用GUI-guider创建这个仪表盘并且实现这个功能的。(本文假设你已经下载和安装了GUI-guider)
1 - 打开GUI-guider
2- 创建新项目并且选择LVGL版本,选择8.35即可,上一章我们移植的LVGL是8.4。 并不冲突
3- 选择模拟器
4- 选择空项目
4- 根据屏幕大小选择不同的分辨率
4 - 使用拖拽的方式绘制LVGL的页面,从左向右三个框分别是LVGL支持的所有组件, LVGL主视图和模拟器生成代码的按钮。
5- 拖拽并且绘制仪表盘,可以在界面右侧更换背景颜色
6- 模拟并且生成代码
7- 选择C语言模拟器,并且点击确定
8 - 模拟器运行效果
9 - 导出生成的代码
10 - 导出后的文件夹
11 - 复制src 到项目目录
12- Keil 中新增分组,将Src文件夹生成所有可以包含的文件都包含进去
14- 新增文件的编译查找路径
15 - 程序主程序中,除了LVGL的核心移植还需要额外添加下述截图文件以及全局变量声明
16 - 在主程序中初始化串口, 初始化LVGL
17 - 中断回调函数中,更新LVGL的显示, 你可能需要引入#include "gui_guider.h"
现在我们来详细的梳理一下逻辑。 在单片机上,首先初始化串口以及中断回调。之后初始化LVGL,使屏幕可以正常显示仪表盘。然后启动上位机通过串口发送数据给单片机。当单片机收到数据之后触发中断,在中断中更新LVGL。
代码如下:
上位机软件:
上位机代码:
|