Pico W是一款低成本的微控制器开发板,可用于物联网和嵌入式系统开发。要使用Pico W连接网络并获取天气预报,我们需要遵循以下步骤:
1. 连接Wi-Fi: Pico W支持Wi-Fi连接,可以使用WebREPL或其他网络库实现与Wi-Fi接入点的通信。我们可以通过Micropython库中的network和socket库实现Wi-Fi连接并获取IP地址。首先,我们需要使用pycopy_upip库安装network库,然后通过network.WLAN类,使用WLAN.STA模式连接Wi-Fi接入点,并使用socket库实现TCP/IP通信。
2. 获取天气预报: 在连接Wi-Fi之后,我们可以使用Python的requests库(需要安装)访问天气预报API,然后解析返回的JSON数据。天气预报服务提供商的API可以提供当前天气、未来几天的天气和其他相关信息。我们这里使用高德的接口,然后使用Micropython库中的urllib库和JSON库来连接API并解析数据。
3. 显示天气预报: 在获取天气预报数据之后,我们可以使用Pico W的SSD1306 OLED屏幕显示天气预报信息。我们可以使用Micropython的GPIO库来控制OLED屏幕,并使用SSD1306库来处理图形和字符。在OLED屏幕上,可以显示当前天气、温度、湿度、气压等等信息,以及未来几天的天气趋势。
通过以上步骤,我们可以使用Pico W连接网络并获取天气预报。需要注意的是,需要确保Pico W能够稳定连接Wi-Fi,并能及时获取和显示天气预报信息。
由于考虑定位问题,这里直接通过网络获取公网IP,查询所在城市,在通过高德的接口获取到城市代码,从而实现自动获取所在地区的天气。
import network
import socket
from time import sleep
from picozero import pico_temp_sensor, pico_led
import machine
import ubinascii
import urequests
import ujson
from machine import Pin
import time
from machine import PWM
from machine import I2C
from ssd1306 import SSD1306_I2C
ssid = 'ssid'
password = 'xxxxxx'
TEMP = "12"
HUMI = "13"
def connect():
#Connect to WLAN
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(ssid, password)
while wlan.isconnected() == False:
print('Waiting for connection...')
sleep(1)
print(wlan.ifconfig())
ip = wlan.ifconfig()[0]
print(f'Connected on {ip}')
def open_socket():
ip = urequests.get('http://ip.42.pl/raw')
ip_str = ip.content.decode('ascii')
print(ip_str)
ip.close()
str_data = 'https://restapi.amap.com/v3/ip?ip='+ip_str+'&output=JSON&key=1e459c41f6b32822efa6442e74ca09c0'
city = urequests.get(str_data)
city_str = city.content.decode('ascii')
#print(city_str)
parsed_city = ujson.loads(city_str)
adcode = parsed_city["adcode"]
city.close()
r = urequests.get('https://restapi.amap.com/v3/weather/weatherInfo?key=1e459c41f6b32822efa6442e74ca09c0&city='+adcode)
w_str = r.content.decode('ascii')
print(r.text)
#print(w_str)
parsed_w = ujson.loads(w_str)
#print (parsed_w)
#w_f = parsed_w["temperature"]
temp_str = parsed_w["lives"][0]["temperature_float"]
humi_str = parsed_w["lives"][0]["humidity_float"]
global TEMP
TEMP = temp_str
global HUMI
HUMI = humi_str
#print(parsed_w["lives"][0]["temperature"])
print (temp_str)
print (humi_str)
#print (parsed_wf)
r.close()
WIDTH = 128
HEIGHT = 64
i2c = I2C(1)
oled = SSD1306_I2C(WIDTH, HEIGHT, i2c)
try:
connect()
open_socket()
while True:
time.sleep(0.1)
oled.fill(0)
TEMP_disp = "temp:"+TEMP
oled.text(TEMP_disp,5,10)
HUMI_disp = "humi:"+HUMI
oled.text(HUMI_disp,5,30)
oled.show()
except KeyboardInterrupt:
machine.reset()
最后实现的效果如下图:
引用: 火辣西米秀 发表于 2023-5-21 08:35 连接网络获取天气预报之前,怎么和天气预报服务提供商的API对接呢
我用的高德的免费API,有兴趣可以看看,也有说明文档