2024寒假练-基于带屏12指神探和MICROPYTHON_LVGL制作的温湿度计
该项目使用了带屏版12指神探和MPY_LVGL,实现了温湿度计的设计,它的主要功能为:基于带屏版12指神探和MPY_LVGL的温湿度计,使用AHT10采集温湿度信息,并在屏幕上以文字和图形的方式直观的进行显示。。
标签
嵌入式系统
显示
长风今破浪
更新2024-03-29
88

首先感谢硬禾学堂提供的这次学习提高的机会,很开心能够参加此次的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图形化控制终端

image.png

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

  image.png

现在我们根据操作说明来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的欢迎提示。

说明固件正常运行了。 1710398839918.png

输入

help(“modules”)

查看输出的模块中如果有LVGL就说明lvgl也编译成功了。

image.png

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温湿度计就制作完成了。image.png

附件下载
12指-lvglmpy-温度计.rar
包含mpy_lvgl固件、背景图片、AHT10驱动以及温湿度计主程序
团队介绍
单片机爱好者,暂时没有团队。 感谢“Maker羊毛党”群的各位大佬兄弟们的指点。
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号