• 基于Micropython的桌面信息小摆件


    转眼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的信息。

    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";
    
    • 1

     为了在小电视上显示股票信息,只要定时访问这个网址获取信息,然后显示到屏幕上。

    2.3 代码实现

     在原始代码的’ui’目录下新建’stock.py’用于实现股票信息相关的获取和显示,新增一个UI显示的函数,这里是一分钟刷新一次,实际可以根据需求自己修改。

    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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

     具体实现在stock_display()函数中,传入股票的ID和名字,这里有个小trick,输入的股票名字并没有使用,而是使用图片显示。原因有两个,一是本身汉字的字库不全,没法显示太多汉字,使用图片则无所谓显示的是什么;另一点是文字显示格式不太好调,直接用图片则简单又美观。

    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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

     实际代码比较简单,使用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

  • 相关阅读:
    如何进行找错和改错
    Effective Java 读书笔记
    第86步 时间序列建模实战:Transformer回归建模
    迭代器模式(Iterator)
    FPGA HLS 基于stream的池化单元 hls优化&约束
    Lua重回TOP 20,TIOBE 3月编程语言排行榜出炉
    【MySql系列】深入解析数据库索引
    XHTML基础知识了解
    Midway.js打通WebSocket前后端监听通道
    关于最新版本Burp Suite可以在哪个基本类别中找到控制其更新行为的“更新”子类别
  • 原文地址:https://blog.csdn.net/songdawww/article/details/132930082