2019-11-24 00:18:12 [显示全部楼层]
3275浏览
查看: 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]

显示效果:
掌控搭配虚谷显示天气信息图1

掌控搭配虚谷显示天气信息图2

P.S. citykey 处的数据是西安的。

gada888  版主

发表于 2019-11-25 14:28:23

不错
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4 备案 沪公网安备31011502402448

© 2013-2025 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail