【得捷电子Follow me第1期】第三帖 连接网络获取天气预报
[复制链接]
今天再更一期链接网络获取天气预报,也是跟着大佬步骤走
第一步是连接WiFi,我们可以通过Micropython库中的network和socket库实现Wi-Fi连接并获取IP地址。
我们需要使用pycopy_upip库安装network库,然后通过network.WLAN类,使用WLAN.STA模式连接Wi-Fi接入点,并使用socket库实现TCP/IP通信。
第二部获取天气预报。
可以使用Python的requests库(需要安装)访问天气预报API,然后解析返回的JSON数据。天气预报服务提供商的API可以提供当前天气、未来几天的天气和其他相关信息。我们这里使用高德的接口,然后使用Micropython库中的urllib库和JSON库来连接API并解析数据。
第三步因为我的oled有点问题,有需要的可以参照这个办法显示出来。
我们可以使用Pico W的SSD1306 OLED屏幕显示天气预报信息。我们可以使用Micropython的GPIO库来控制OLED屏幕,并使用SSD1306库来处理图形和字符。在OLED屏幕上,可以显示当前天气、温度、湿度、气压等等信息,以及未来几天的天气趋势。
由于考虑定位问题,这里直接通过网络获取公网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 = '汤圆和奶茶'
password = 'tangyuan888'
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()
现象如下:
|