首先感谢硬禾学堂提供的这次学习提高的机会,很开心能够参加此次的2024寒假在家一起练活动。我选择的是平台3带显示屏的、基于RP2040的多功能嵌入式编程学习、硬件调试平台
12指神探是基于树莓派RP2040的一块开发板,基于RP2040微控制器、搭配240*240分辨率的LCD彩屏、两个轻触按键和一个拨轮,12根管脚支持对外供电、3个ADC模拟信号输入、最多9根通用数字IO,适合嵌入式系统学习、控制、调试。
活动链接:https://www.eetree.cn/activity/15
12指神探介绍:https://www.eetree.cn/platform/2585
这里我选择的是任务4:基于RP2040的LVGL图形化控制终端
lvgl是一款很好用的比较轻量的跨平台图形化界面,在windows、linux、esp32、esp8266、stm32、rp2040等等常见的平台都可以运行,对单片机的性能要求也适中。
Lvgl可以使用c\c++和mpy(microPython)两种方式开发,因为以前使用过c\c++的版本,这次想挑战学习一下mpy的方式。
MPY_LVGL的编译可以基于linux,MAC OS,甚至听说windows也可以,这里推荐使用linux,因为linux不像MAC那样难以获取,也不像windows那样坑比较多。
1、安装linux
1.1安装模拟器VMware
使用linux有很多方式,比如实体机安装,虚拟机安装。虚拟机也有很多,比如windows系统自带,VMwar,VirtualBox等等,使用方法大同小异,这里笔者就以自己习惯使用的WMware来进行演示。
1.2下载Ubuntu镜像
这里笔者使用的Ubuntu的系统镜像是Ubuntu 20.04.6 LTS,不低于这个版本的应该也可以。
1.3安装
新建虚拟机并安装系统,新建虚拟机的时候配置在允许的范围内稍微高一点,编译的速度会快一点(可能吧)。
2、Git
2.1打开github的MPY_lvgl页面
https://github.com/lvgl/lv_micropython
下翻页面找到Raspberry Pi Pico port
现在我们根据操作说明来git所需文件。
2.2在主文件夹下新建一个“rp2040”文件夹,主文件夹就是Ubuntu桌面上那个以你的用户名命名的文件夹,一般来说新安装的系统桌面只有这么一个文件夹。
2.3双击打开rp2040文件夹,右键在终端打开,弹出linux命令终端窗口,依次键入或者复制粘贴前3条命令
git clone https://github.com/lvgl/lv_micropython.git
cd lv_micropython
git submodule update --init --recursive lib/lv_bindings
等待全部文件都下载完毕之后(大概率需要搭梯子,不然速度会很慢),进行下一步。
3、安装相关软件
安装好python、pip、cmake、gcc-arm-none-eabi等等相关的软件,又是漫长的等待。
4、链接相关库
配置好屏幕驱动,根据自己的需要在lv_conf.h文件中启用字库和其他需要的功能。
5、编译
依次键入或者复制粘贴后3条命令:
make -C ports/rp2 BOARD=PICO submodules
make -j -C mpy-cross
make -j -C ports/rp2 BOARD=PICO USER_C_MODULES=../../lib/lv_bindings/bindings.cmake
开始编译
6、测试
把编译好的固件firmware.uf2拷贝到自己的电脑,按住USB口旁边的按键插上数据线,这时12指神探的板子会进入刷估计的模式,在电脑上会识别为一个U盘。
把刚编译好的固件拷贝到这个U盘中,等待板子重启就完成了刷机。
打开Thonny等工具(或者串口助手也行),设置好对应的串口号,点击停止,会弹出microPython的欢迎提示。
说明固件正常运行了。
输入
help(“modules”)
查看输出的模块中如果有LVGL就说明lvgl也编译成功了。
7、制作素材
从网上找个喜欢的温度计图片,或者使用PS等软件自己画个温度计模块。
转换成合适的大小,12指神探的屏幕尺寸是240点×240点,开始的时候我使用的是240X240的背景图片,然后运行提示超大了,只好把不需要的地方切掉,做成了两个小的图片。
8、设置模块
做温度计,需要两个模块,一个是label,用于显示字符,一个是bar,用于模拟温度计的指示条。当然还需要img来显示背景图片。详细使用方式可以查看后面的程序代码,或者看前面的视频介绍。
具体使用方式可以查看lvgl官网说明:https://docs.lvgl.io/8.3/
9、选择温湿度传感器
找一个温湿度传感器模块,我使用的是常见的AHT10温湿度传感器模块,这个模块使用的IIC接口,驱动也很好找。
10、完成
把准备好的AHT10温湿度传感器接到12指神探引出的IO口上。
使用Thonny上传准备好的背景图片和传感器驱动。
写好mpy程序,驱动程序的名字建议写成mian.py这样以后上电就可以自动运行。
import gc
gc.collect()
import sys
sys.path.append('.')
from st77xx import *
import utime
from machine import Pin, I2C
import ahtx0
# 引用库文件
spi=machine.SPI(
0,
baudrate=24_000_000,
polarity=1,
phase=1,
sck=machine.Pin(2,machine.Pin.OUT),
mosi=machine.Pin(3,machine.Pin.OUT),
)
Pin(9,Pin.OUT).value(1)
Pin(8,Pin.OUT).value(0)
i2c = I2C(0,scl=Pin(21), sda=Pin(20))
sensor = ahtx0.AHT10(i2c)
# 配置相关引脚
import lvgl as lv
lv.init()
lcd=St7789(rot=3,res=(240,240),spi=spi,cs=4,dc=1,bl=13,rst=0,rp2_dma=rp2_dma,factor=4)
# 初始化LVGL,初始化屏幕
scr = lv.obj()
try:
with open('./back1.png', 'rb') as f:
png_data = f.read()
except:
print("找不到图片文件...")
sys.exit()
img = lv.img_dsc_t({"data_size": len(png_data),"data": png_data})
back1 = lv.img(scr)
back1.set_src(img)
back1.align(lv.ALIGN.CENTER,-80,0)
try:
with open('./back2.png', 'rb') as f:
png_data = f.read()
except:
print("找不到图片文件...")
sys.exit()
img = lv.img_dsc_t({"data_size": len(png_data),"data": png_data})
back2 = lv.img(scr)
back2.set_src(img)
back2.align(lv.ALIGN.CENTER,80,0)
lv.scr_load(scr)
# 设置背景
bar1 = lv.bar(lv.scr_act())
bar_red = lv.style_t()
bar_red.init()
bar_red.set_bg_opa(lv.OPA.COVER)
bar_red.set_bg_color(lv.palette_main(0))
bar_red.set_radius(0)
bar1 = lv.bar(lv.scr_act())
bar1.set_range(0,50)
bar1.remove_style_all() # To have a clean start
bar1.add_style(bar_red, lv.PART.INDICATOR)
bar1.set_size(8, 100)
bar1.align(lv.ALIGN.CENTER,-81,-15)
bar1.set_value(26, lv.ANIM.ON)
# 设置温度显示条
bar2 = lv.bar(lv.scr_act())
bar_blue = lv.style_t()
bar_blue.init()
bar_blue.set_bg_opa(lv.OPA.COVER)
bar_blue.set_bg_color(lv.palette_main(lv.PALETTE.BLUE))
bar_blue.set_radius(0)
bar2 = lv.bar(lv.scr_act())
bar2.set_range(0,100)
bar2.remove_style_all() # To have a clean start
bar2.add_style(bar_blue, lv.PART.INDICATOR)
bar2.set_size(8, 100)
bar2.align(lv.ALIGN.CENTER,82,-15)
bar2.set_value(40, lv.ANIM.ON)
# 设置湿度显示条
temshow = lv.label(lv.scr_act())
temshow.align(lv.ALIGN.CENTER,0,-30)
temshow.set_style_text_font(lv.font_montserrat_32, 0)
temshow.set_text("24.0C")
temlab = lv.label(lv.scr_act())
temlab.align(lv.ALIGN.CENTER,0,-55)
temlab.set_text("Temperature")
Humshow = lv.label(lv.scr_act())
Humshow.set_style_text_font(lv.font_montserrat_32, 0)
Humshow.align(lv.ALIGN.CENTER,0,30)
Humshow.set_text("40.0%")
Humlab = lv.label(lv.scr_act())
Humlab.align(lv.ALIGN.CENTER,-12,5)
Humlab.set_text("Humidity:")
# 设置温湿度文本显示
tems=0
hums=0
while 1:
lv.timer_handler()
tems=sensor.temperature
hums=sensor.relative_humidity
temshow.set_text("%0.1fC" % tems)
bar1.set_value(int(tems), lv.ANIM.ON)
Humshow.set_text("%0.1f%%" % hums)
bar2.set_value(int(hums), lv.ANIM.ON)
gc.collect()
utime.sleep(1)
# 循环读取温湿度信息并显示
上传并点击运行,如果屏幕显示出了温湿度计的画面,并且可以正常跟随AHT10的度数变化,那么我们基于12指神探的lvgl温湿度计就制作完成了。