[经验分享] 【得捷电子Follow me第1期】第三帖 连接网络获取天气预报

29447945   2023-5-16 22:22 楼主

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()

最后实现的效果如下图:

微信截图_20230516215456.png

微信图片_20230516215645.jpg

回复评论 (2)

 连接网络获取天气预报之前,怎么和天气预报服务提供商的API对接呢

点赞  2023-5-21 08:35
引用: 火辣西米秀 发表于 2023-5-21 08:35  连接网络获取天气预报之前,怎么和天气预报服务提供商的API对接呢

我用的高德的免费API,有兴趣可以看看,也有说明文档

点赞  2023-5-22 09:00
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复