文章目录
-
- [1. 硬件设备](#1. 硬件设备)
- [2. Micropython](#2. Micropython)
- [2.1 准备开发环境](#2.1 准备开发环境)
- [2.2 信息获取](#2.2 信息获取)
- [2.3 代码实现](#2.3 代码实现)
- [3. 总结](#3. 总结)
转眼2023年已快到十一了,突然发现今年还没有任何产出,赶紧抓紧时间搜寻一番,更新一个简单的小制作。后续再努力,多写写正经内容,以便更好的总结之前的经验。
本次将介绍一个基于Micropython的桌面信息小摆件,可以显示实时时间、日期、天气等信息,在此基础上添加股票信息显示,可以为办公或生活空间增添一抹趣味。
1. 硬件设备
这次用的硬件实际是开源的pyClock,可以自己制作,不过为了方便我是直接买了成品,外形就是一个小电视。注意要买基于ESP32主控的模块,这样性能强一些,可以实现更多功能。
2. Micropython
首先,我们需要了解一下Micropython是什么。Python相信大部分人都不陌生,而Micropython是一种轻量级的Python编程语言,专为微控制器(如Arduino)设计。这意味着我们可以使用Python编写代码来控制硬件设备,从而实现更多功能。
本模块自带了支持Micropython的固件,如果没有自己更新一下即可,ESP32本身也是可以支持Micropython的,总的来说使用起来非常方便。不过,脚本语言的缺点同样存在,如资源消耗太多,运行比较慢,时不时有莫名其妙的BUG😔。
2.1 准备开发环境
Micropython不同于Python,这里使用的开发环境是Thonny 4.0,软件比较简单,支持基本的代码编写、运行,上传下载代码、文件等功能。具体如何使用参考相关的教程,下载好代码后载入已有的开源工程就可以开始写代码了。
2.2 信息获取
模块自带的有时间、天气等信息,作为一个桌面小摆件已经可以用了,不过实用价值不大,所以本文添加了获取股票信息的功能。这样在开盘时间就可以实时关注自己的股票信息,防止错过关键时间。
股票信息获取很简单,只需要访问"http://qt.gtimg.cn/q="+"股票ID"就可以获取相关的信息。比如,访问"https://qt.gtimg.cn/q=sh600519"就可以获得茅台的当前股价信息,每个信息由'~'符号分隔,只需要选择自己关注的值就可以了,具体每个含义建议比对各股票App的信息。
python
v_sh600519="1~贵州茅台~600519~1781.99~1818.69~1819.00~28431~11863~16569~1781.99~0~1781.98~26~1781.92~15~1781.88~7~1781.71~1~1782.00~1~1782.99~27~1783.00~4~1784.00~1~1784.46~3~~20230915155953~-36.70~-2.02~1819.78~1781.30~1781.99/28431/5105749077~28431~510575~0.23~32.49~~1819.78~1781.30~2.12~22385.32~22385.32~11.14~2000.56~1636.82~1.84~13~1795.84~31.11~35.69~~~1.16~510574.9077~0.0000~0~ ~GP-A~4.76~-2.01~2.68~34.29~29.64~1935.00~1285.18~-3.73~-1.14~4.21~1256197800~1256197800~15.29~5.37~1256197800~~~-2.74~0.00~~CNY~0~___D__F__N";
为了在小电视上显示股票信息,只要定时访问这个网址获取信息,然后显示到屏幕上。
2.3 代码实现
在原始代码的'ui'目录下新建'stock.py'用于实现股票信息相关的获取和显示,新增一个UI显示的函数,这里是一分钟刷新一次,实际可以根据需求自己修改。
python
stock_tick = 61
def UI_Display(datetime):
global stock_tick
if global_var.UI_Change:
global_var.UI_Change = 0
d.fill(BLACK)
if stock_tick != datetime[5]:
stock_tick = datetime[5]
stock_display(sgm, sgm_name, sgm_img)
具体实现在stock_display()函数中,传入股票的ID和名字,这里有个小trick,输入的股票名字并没有使用,而是使用图片显示。原因有两个,一是本身汉字的字库不全,没法显示太多汉字,使用图片则无所谓显示的是什么;另一点是文字显示格式不太好调,直接用图片则简单又美观。
python
def stock_display(stock_id, stock_name, stock_img):
for i in range(5):#失败会重试,最多5次
try:
stockURL = urequest.urlopen(stock_url+stock_id)
text = stockURL.read(1000).split(b'~')
curr_price = text[3].decode('utf-8')
today_open = text[5].decode('utf-8')
up_down = text[31].decode('utf-8')
up_down_per = text[32].decode('utf-8') + r'%'
if up_down[0] == '-':
color = GREEN
else:
color = RED
if stock_img is not None:
d.Picture(0, 0, stock_img)
else:
d.printStr(stock_id, 0, 0, color, size=3)
printChinese('当 前 ',10,50,color=color,backcolor=BLACK,size=2)
d.printStr(' ', 110, 50, BLACK, size=3)
d.printStr(curr_price, 110, 50, color, size=3)
printChinese('今 开 ',10,100,color=color,backcolor=BLACK,size=2)
d.printStr(' ', 110, 100, BLACK, size=3)
d.printStr(today_open, 110, 100, color, size=3)
printChinese('涨 跌 ',10,150,color=color,backcolor=BLACK,size=2)
d.printStr(' ', 110, 150, BLACK, size=3)
d.printStr(up_down, 110, 150, color, size=3)
printChinese('涨跌幅 ',10,200,color=color,backcolor=BLACK,size=2)
d.printStr(' ', 110, 200, BLACK, size=3)
d.printStr(up_down_per, 110, 200, color, size=3)
return None
except:
d.printStr("Can not get stock!", 0, 0, WHITE, size=2)
print("Can not get stock!",i)
gc.collect() #内存回收
time.sleep_ms(1000)
实际代码比较简单,使用urequest库直接读取然后显示,这里有几点注意事项:
- ESP32性能有限,所以返回内容最大只读取1000,然后以b'~'分割。
- 输出内容要以'utf-8'解码,否则可能会乱码。
- 部分汉字原生不支持,需要找个取字模软件,添加到hanzi_24x24_dict字典里
- 屏幕刷新速度比较慢,更新内容如果整个清屏则会有闪烁感,所以使用部分更新的办法,即要更新部分先显示黑色空格,然后再显示内容。
最后,显示效果如下:
PS.本文部分内容由AI生成,如有雷同纯属巧合。
PS.PS.最近股票跌的好惨 /(ㄒoㄒ)/~~
3. 总结
在这个简短的文章中,介绍了基于Micropython的桌面信息小摆件。这个小摆件可以显示实时时间、日期、天气、股票等信息,为您的办公或生活空间增添一抹趣味。