基于Micropython的桌面信息小摆件

文章目录

    • [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库直接读取然后显示,这里有几点注意事项:

  1. ESP32性能有限,所以返回内容最大只读取1000,然后以b'~'分割。
  2. 输出内容要以'utf-8'解码,否则可能会乱码。
  3. 部分汉字原生不支持,需要找个取字模软件,添加到hanzi_24x24_dict字典里
  4. 屏幕刷新速度比较慢,更新内容如果整个清屏则会有闪烁感,所以使用部分更新的办法,即要更新部分先显示黑色空格,然后再显示内容。

最后,显示效果如下:

PS.本文部分内容由AI生成,如有雷同纯属巧合。

PS.PS.最近股票跌的好惨 /(ㄒoㄒ)/~~

3. 总结

在这个简短的文章中,介绍了基于Micropython的桌面信息小摆件。这个小摆件可以显示实时时间、日期、天气、股票等信息,为您的办公或生活空间增添一抹趣味。

Github: https://github.com/songdaw/py_stock

码云:https://gitee.com/songdaw/py_stock

相关推荐
阡之尘埃2 小时前
Python数据分析案例61——信贷风控评分卡模型(A卡)(scorecardpy 全面解析)
人工智能·python·机器学习·数据分析·智能风控·信贷风控
丕羽5 小时前
【Pytorch】基本语法
人工智能·pytorch·python
bryant_meng5 小时前
【python】Distribution
开发语言·python·分布函数·常用分布
m0_594526306 小时前
Python批量合并多个PDF
java·python·pdf
工业互联网专业7 小时前
Python毕业设计选题:基于Hadoop的租房数据分析系统的设计与实现
vue.js·hadoop·python·flask·毕业设计·源码·课程设计
钱钱钱端7 小时前
【压力测试】如何确定系统最大并发用户数?
自动化测试·软件测试·python·职场和发展·压力测试·postman
慕卿扬7 小时前
基于python的机器学习(二)—— 使用Scikit-learn库
笔记·python·学习·机器学习·scikit-learn
Json____7 小时前
python的安装环境Miniconda(Conda 命令管理依赖配置)
开发语言·python·conda·miniconda
小袁在上班7 小时前
Python 单元测试中的 Mocking 与 Stubbing:提高测试效率的关键技术
python·单元测试·log4j
白狐欧莱雅7 小时前
使用python中的pygame简单实现飞机大战游戏
经验分享·python·游戏·pygame