基于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

相关推荐
思则变3 小时前
[Pytest] [Part 2]增加 log功能
开发语言·python·pytest
漫谈网络3 小时前
WebSocket 在前后端的完整使用流程
javascript·python·websocket
try2find4 小时前
安装llama-cpp-python踩坑记
开发语言·python·llama
博观而约取5 小时前
Django ORM 1. 创建模型(Model)
数据库·python·django
精灵vector7 小时前
构建专家级SQL Agent交互
python·aigc·ai编程
Zonda要好好学习7 小时前
Python入门Day2
开发语言·python
Vertira7 小时前
pdf 合并 python实现(已解决)
前端·python·pdf
太凉7 小时前
Python之 sorted() 函数的基本语法
python
项目題供诗7 小时前
黑马python(二十四)
开发语言·python
晓13138 小时前
OpenCV篇——项目(二)OCR文档扫描
人工智能·python·opencv·pycharm·ocr