628|2

141

帖子

4

TA的资源

一粒金砂(中级)

楼主
 

【得捷电子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)

 

最新回复

本次是完成任务4,这是一个可选任务,我选择了任务1,日历&时钟——完成一个可通过互联网更新的万年历时钟,并显示当地的天气信息。 恭喜完成作业!   详情 回复 发表于 2023-9-2 16:36
点赞 关注
 
 

回复
举报

6841

帖子

11

TA的资源

版主

沙发
 

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

恭喜完成作业!

点评

一起学习,前辈们都很厉害  详情 回复 发表于 2023-9-2 23:35
 
 
 

回复

141

帖子

4

TA的资源

一粒金砂(中级)

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

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

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表