3275| 1
|
[入门教程] 掌控搭配虚谷显示天气信息 |
看到最近很流行用掌控来显示天气信息,大家都是用mPython X 或者 mPython 里的心知天气扩展包来处理和显示信息。不过心知天气需要注册并且领取密匙,我便琢磨着有没有其他途径来获取天气信息。刚好前阵子B站里面刷视频,刷到同济子豪兄的一个关于用jupyter处理并显示天气的视频,无需注册,利用python里的工具库,解析一个天气网站,获取指定城市的天气数据,处理信息并进行打印。 很有趣的一个视频,等等,一个用python,掌控用micropython,所需要的工具库,基本都通用,兴致勃勃的开始了“搬运”。经过各种折腾,利用掌控接收到天气信息可以实现,但是这个信息转换处理却出了问题。询问了下掌控群里的众位大佬,指出掌控板内置的micropython 只能处理“utf-8”的数据,很明显网页内的数据不是“utf-8”的类型,所以信息处理报错提示“unicode Error”。 看来只能退而求其次,先在其他设备上把城市的天气信息处理成“utf-8”的数据,再通过其他途径把处理过的数据发送给掌控板。 方案: 利用虚谷号的Jupyter来获取城市的天气信息并进行处理,利用 socket 工具库,虚谷号和掌控进行数据通讯,掌控显示所需要的天气信息。 技能点: 1. 虚谷号的Jupyter模式 2. python 的 socket、requests 工具库 3. socket 通讯的 TCP、UDP 模式(本次使用的UDP模式) 4. 数据处理:bytes、str、tuple、list、dict(字节、字符、元组、列表、字典) 老规矩,上代码: Jupyter 端: [mw_shl_code=python,true]# 导入所需的工具库 import requests import socket udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 建立套接字,UDP模式 udp_socket.bind(('', 50000)) while True: # 接收数据 recv_data = udp_socket.recvfrom(1024) print(recv_data) # 发送数据 url = r'http://wthrcdn.etouch.cn/weather_mini?citykey=101110101' jsonStr = requests.get(url).text udp_socket.sendto(jsonStr.encode('utf-8'), ('192.168.3.8', 10000)) # 发送 byte 类数据 到 掌控的ip和定义的端口号 udp_socket.close()[/mw_shl_code] 掌控端: [mw_shl_code=python,true]from mpython import * import network import usocket my_wifi = wifi() my_wifi.connectWiFi("WIFI名称", "WIFI密码") udp_s = usocket.socket(usocket.AF_INET, usocket.SOCK_DGRAM) oled.fill(0) oled.DispChar(my_wifi.sta.ifconfig()[0], 0, 0, 1) oled.show() udp_s.bind(("", 10000)) # 发送数据给虚谷号 udp_s.sendto(b'A', ('虚谷号ip', 虚谷号程序端已绑定的端口)) # 接收数据并处理 data = udp_s.recvfrom(1024) # type(data)='tuple' weather_data, addr = data # type(weather_data)='bytes' weather_dict = eval(weather_data) # type(weather_dict)='dict' weather = weather_dict['data'] # 提取字典里的天气数据 # 显示天气 oled.DispChar(weather['city'], 0, 15) oled.DispChar(weather['forecast'][0]['date'], 30, 15) oled.DispChar(weather['forecast'][0]['type'], 100, 15) oled.DispChar(weather['forecast'][0]['low'], 30, 30) oled.DispChar(weather['forecast'][0]['high'], 30, 45) oled.show() udp_s.close()[/mw_shl_code] 显示效果: P.S. citykey 处的数据是西安的。 |
© 2013-2025 Comsenz Inc. Powered by Discuz! X3.4 Licensed