[作品提交] 【得捷电子Follow me第2期】任务4-分任务1:日历&时钟

Tristan_C   2023-9-2 11:50 楼主

本次是完成任务4,这是一个可选任务,我选择了任务1,日历&时钟——完成一个可通过互联网更新的万年历时钟,并显示当地的天气信息。

首先是互联网功能,该功能在之前的任务中,通过了WiFi实现了,并获得了互联网的时间,因此本任务可以沿用。接下去将一个互联网获取当地天气信息的功能。互联网获取天气的在线网站很多,比如心知天气,中国国家气象局等,都提供了在线获取的api接口,我们就选择中国国家气象局的接口。其接口如下

http://t.weather.sojson.com/api/weather/city/城市编号

其中城市编号以杭州为例,是101210101,将其替换城市编号即可,将其填入浏览器测试如下

115004n1z6tt1uoikmomzz.png

返回的json内容部分解析如下,包括了城市、温度、湿度,空气质量等较为详细的信息。

115004t9edvvdi808grvre.png

我们将接口定义在settings.toml中,类似获取苏宁的时间

115004p7s77b8bkzoikssu.png

而此处接口的方法,通获取时间一样,使用request的get即可。

为了显示中文的城市、天气等信息,我们还需要用到任务1中的中文显示功能,已经显示屏显示功能,因此本次需要import的内容如下

115004tvn038xqqx0vz3x0.png

为了方便使用,可以将获取时间的功能单独做成函数接口,接口返回时间字符串

115004ct6exdk74bbjj4ex.png

同样,获取天气也做成单独的函数接口,并解析json的数据,获取需要的内容,如城市、温度和湿度,并组成字符串返回

115004umgnhnhxqhxoik1p.png

还有更新显示屏的内容,接口传入内容字符串,然后将字符串更新到显示屏

115004c7gntt8uc81ns7zy.png

最后我们调用获取时间和天气信息接口并定时循环即可更新天气和时间了

115004fcmc7j7gy8gy68mh.png

开机启动打印信息

115004ckfqizkyzxtffmjc.png

在连接上网络之后,获取时间信息以及天气信息之后打印信息如下

115004pve9fcgkdmu23bm3.png

板载显示屏上更新的显示信息如下

115004h87bj1y11bbrwb91.png

115004hyhwfrag4fwp6cf4.png

完整代码如下:

import os
import wifi
import ssl
import socketpool
import adafruit_requests
import time
import displayio
import board
import digitalio

from adafruit_display_text import label
from adafruit_bitmap_font  import bitmap_font

print("Flow Me Task 4-1:Weter station & RTC")

updata_cnt    = 0 #用于更新的计数

display                     = board.DISPLAY
board.DISPLAY.brightness    = 0.5
board.DISPLAY.rotation      = 0
font                        = bitmap_font.load_font("lib\wenquanyi_9pt.pcf")

str_disp_0  = "欢迎参加Flow Me\n这是第二期"
str_disp_1  = "本次任务4-1:\n日历&时钟\n"
str_disp_2  = "通过互联网更新万年历时钟\n并显示当地天气"
color       = 0xFFFFFF

text_group  = displayio.Group()
text_area   = label.Label(font, text=str_disp_0 + str_disp_1 + str_disp_2, color=color)
text_area.x = 10
text_area.y = 10

#启动屏幕显示
text_group.append(text_area)
display.show(text_group)

print(f"ESP32 connecting to {os.getenv('WIFI_SSID')}")
wifi.radio.connect(os.getenv("WIFI_SSID"), os.getenv("WIFI_PASSWORD"))
print(f"ESP32 connected to {os.getenv('WIFI_SSID')}")
print(f"My MAC address: {[hex(i) for i in wifi.radio.mac_address]}")
print(f"My IP address: {wifi.radio.ipv4_address}")

socket_get      = socketpool.SocketPool(wifi.radio)
requests_get    = adafruit_requests.Session(socket_get, ssl.create_default_context())

def request_time():
    print("Get time from SUNING.")
    response_time = requests_get.get(os.getenv("SUNING_TIME_API"))
    time_str = response_time.json()['sysTime2']
    timestamp_get = response_time.json()['sysTime2']
    print(time_str)
    return time_str

def request_weater():
    print("Get weather from China National Meteorological.")
    try:
        response_weather = requests_get.get(os.getenv("HANGZHOU_WEATHER_API"))
    except ConnectionError as e:
        print("Connection Error:", e)
        print("Retrying in 60 seconds")

    weather_all = response_weather.json()

    city_info = weather_all['cityInfo']
    city_str = city_info['city']                            #取城市

    weather_data        = weather_all['data']
    temperature_str     = weather_data['wendu']             #取温度
    humidity_str        = weather_data['shidu']             #取湿度
    weather_data_now    = weather_data['forecast']
    type_str            = weather_data_now[0]['type']       #取天气类型

    weather_str = city_str + "\n" + temperature_str + "°C    " + humidity_str + " " * 4 + type_str

    print(weather_str)

    return weather_str

def updata_display(text_disp):
    text_area = label.Label(font, text=text_disp, scale=2)
    text_area.x = 10
    text_area.y = 10
    board.DISPLAY.show(text_area)

while True:
    weather_time = request_weater() + "\n" + request_time()

    updata_display(weather_time)

    #每秒获取一次时间
    time.sleep(0.9)

 

本帖最后由 Tristan_C 于 2023-9-2 22:03 编辑

回复评论 (2)

本次是完成任务4,这是一个可选任务,我选择了任务1,日历&时钟——完成一个可通过互联网更新的万年历时钟,并显示当地的天气信息。

恭喜完成作业!

点赞  2023-9-2 16:36
引用: lugl4313820 发表于 2023-9-2 16:36 本次是完成任务4,这是一个可选任务,我选择了任务1,日历&时钟——完成一个可通过互联网更新 ...

一起学习,前辈们都很厉害

点赞  2023-9-2 23:35
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复