【得捷电子Follow me第2期】任务4-分任务1:日历&时钟
[复制链接]
本帖最后由 Tristan_C 于 2023-9-2 22:03 编辑
本次是完成任务4,这是一个可选任务,我选择了任务1,日历&时钟——完成一个可通过互联网更新的万年历时钟,并显示当地的天气信息。
首先是互联网功能,该功能在之前的任务中,通过了WiFi实现了,并获得了互联网的时间,因此本任务可以沿用。接下去将一个互联网获取当地天气信息的功能。互联网获取天气的在线网站很多,比如心知天气,中国国家气象局等,都提供了在线获取的api接口,我们就选择中国国家气象局的接口。其接口如下
http://t.weather.sojson.com/api/weather/city/城市编号
其中城市编号以杭州为例,是101210101,将其替换城市编号即可,将其填入浏览器测试如下
返回的json内容部分解析如下,包括了城市、温度、湿度,空气质量等较为详细的信息。
我们将接口定义在settings.toml中,类似获取苏宁的时间
而此处接口的方法,通获取时间一样,使用request的get即可。
为了显示中文的城市、天气等信息,我们还需要用到任务1中的中文显示功能,已经显示屏显示功能,因此本次需要import的内容如下
为了方便使用,可以将获取时间的功能单独做成函数接口,接口返回时间字符串
同样,获取天气也做成单独的函数接口,并解析json的数据,获取需要的内容,如城市、温度和湿度,并组成字符串返回
还有更新显示屏的内容,接口传入内容字符串,然后将字符串更新到显示屏
最后我们调用获取时间和天气信息接口并定时循环即可更新天气和时间了
开机启动打印信息
在连接上网络之后,获取时间信息以及天气信息之后打印信息如下
板载显示屏上更新的显示信息如下
完整代码如下:
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)
|