X
首页
技术
模拟电子
单片机
半导体
电源管理
嵌入式
传感器
最能打国产芯
应用
汽车电子
工业控制
家用电子
手机便携
安防电子
医疗电子
网络通信
测试测量
物联网
最能打国产芯
大学堂
首页
直播
专题
TI 培训
论坛
汽车电子
国产芯片
电机驱动控制
电源技术
单片机
模拟电子
PCB设计
电子竞赛
DIY/开源
嵌入式系统
医疗电子
颁奖专区
【厂商专区】
【电子技术】
【创意与实践】
【行业应用】
【休息一下】
最能打国产芯
活动中心
直播
发现活动
颁奖区
电子头条
参考设计
下载中心
分类资源
文集
排行榜
电路图
Datasheet
最能打国产芯
DigiKey得捷技术专区
[作品提交] 【得捷电子Follow me第2期】+ 日历&时钟
swzswz
2023-9-10 16:42
楼主
本次最后一个任务是日历和时钟,日历和时钟,也就通过网络,利用API接口进行数据获取。本次通过高德地图获取天气数据,通过本地库获取时间。下面展开阐述。 # 一.准备工作 本次时钟与天气是分开阐述的,时间通过ntp库,连接服务器,进行时钟更新。天气利用高德API接口,通过将ip查找转换网络地址,再通过网络地址获取城市,最后通过城市,获取当地的天气,例如温度,湿度等等。 显示这个,需要用到中文库,借助第一期显示,需要用到中文字库转换。即将ttf字库转换为bdf,ocf文件。 需要用到的第三方库:
#二.函数功能讲解 本文定义了六个函数。 屏幕显示,屏幕显示借助中文字符,利用label显示字符,还可以控制屏幕区域,颜色 ```python def display_text_inboard(str_disp): display = board.DISPLAY board.DISPLAY.brightness = 0.8 board.DISPLAY.rotation = 0 font = bitmap_font.load_font("FZYTK.bdf") color = 0x494e8f str_disp = str_disp text_area = label.Label(font, text=str_disp, color=color) text_area.x = 15 text_area.y = 25 display.show(text_area) ``` wifi连接,不管是时钟还是天气,均需要联网 ```python def connect_wifi(ssid,password): ssid = ssid password = password wifi.radio.connect(ssid = ssid, password = password) print(f"My IP address: {wifi.radio.ipv4_address}") ``` 获取时间,这里用到ntp库,基体用法可以参考api,主要用到locatime和uodate两个函数。得到的时间信息是一个字典,空过键取值。 ```python def get_time(): ntp = adafruit_ntp.NTP(pool, server="ntp.aliyun.com", tz_offset=8) rtc.RTC().datetime = ntp.datetime now = time.localtime() print("Current time:{}-{}-{} {:02}:{:02}:{:02}".format(now.tm_year, now.tm_mon, now.tm_mday, now.tm_hour, now.tm_min,now.tm_sec)) time_str = "{}-{}-{} {:2}:{:2}:{:2}".format(now.tm_year, now.tm_mon, now.tm_mday, now.tm_hour, now.tm_min, now.tm_sec) return time_str ``` 获取网络IP,通过网络连接,利用ip查询获取网络ip。 ```python def get_ipv4(requests): requests = requests JSON_IP_URL = "http://ip.42.pl/raw" response = requests.get(JSON_IP_URL) ip_str = response.text print(ip_str) return ip_str ``` 高德API,需要注册高德API接口,新建应用,选择网络服务,获取接口应用。
获取城市,这个需要用到api,key后面参数填自己的key值。 ```python def get_city(ip_str,requests): ip_str = ip_str #key = key requests = requests str_data = 'https://restapi.amap.com/v3/ip?ip='+ip_str+'&output=JSON&key=xxxxxx' city = requests.get(str_data) print(city.json()) city_str = city.json() city = city_str["city"] return city ``` 获取天气,获取天气,控制键再分别获取地点,包括省和市位置,再获取天气,最后获取温度和湿度。 ```python def get_weather(time_str,city,requests): #key = key time_str = time_str city = city requests = requests response = requests.get('https://restapi.amap.com/v3/weather/weatherInfo?city='+city+'&key=xxxxxx') weather = response.json() print(weather) temp_str = weather["lives"][0]["temperature_float"] humi_str = weather["lives"][0]["humidity_float"] str_city = weather["lives"][0]["city"] str_province = weather["lives"][0]["province"] str_weather = weather["lives"][0]["weather"] print(temp_str + '\n' + humi_str + '\n' + str_province + '\n' + str_city + '\n' + str_weather) str_wt = "时间:"+ time_str + '\n' + "地点:"+ str_province + "省" + str_city + '\n'+ "天气:" + str_weather + '\n' + '温度:' + temp_str + '`C' + ' ' + '湿度:' + humi_str+ '%' return str_wt ``` 主程序,分别依次调用函数,注意函数依赖关系,将前者函数返回值作为下一个函数使用。 ```python if __name__ == "__main__": while True: ssid = "xxxxxx" #你自己的wifi名称 password = "xxxxxxx" #你自己的wifi密码 connect_wifi(ssid,password) pool = socketpool.SocketPool(wifi.radio) requests = adafruit_requests.Session(pool, ssl.create_default_context()) #key = "be4bf595febd17451fe22077e30dca03" ip_str = get_ipv4(requests) time_str = get_time() display_text_inboard("时间更新中:" + "\n" + time_str) city = get_city(ip_str,requests) str_wt = get_weather(time_str,city,requests) display_text_inboard(str_wt) ``` 总代码: ```python import board from adafruit_display_text import label from adafruit_bitmap_font import bitmap_font import wifi import rtc import adafruit_ntp import socketpool import time import ssl import adafruit_requests def display_text_inboard(str_disp): display = board.DISPLAY board.DISPLAY.brightness = 0.8 board.DISPLAY.rotation = 0 font = bitmap_font.load_font("FZYTK.bdf") color = 0x494e8f str_disp = str_disp text_area = label.Label(font, text=str_disp, color=color) text_area.x = 15 text_area.y = 25 display.show(text_area) def connect_wifi(ssid,password): ssid = ssid password = password wifi.radio.connect(ssid = ssid, password = password) print(f"My IP address: {wifi.radio.ipv4_address}") def get_time(): ntp = adafruit_ntp.NTP(pool, server="ntp.aliyun.com", tz_offset=8) rtc.RTC().datetime = ntp.datetime now = time.localtime() print("Current time:{}-{}-{} {:02}:{:02}:{:02}".format(now.tm_year, now.tm_mon, now.tm_mday, now.tm_hour, now.tm_min,now.tm_sec)) time_str = "{}-{}-{} {:2}:{:2}:{:2}".format(now.tm_year, now.tm_mon, now.tm_mday, now.tm_hour, now.tm_min, now.tm_sec) return time_str def get_ipv4(requests): requests = requests JSON_IP_URL = "http://ip.42.pl/raw" response = requests.get(JSON_IP_URL) ip_str = response.text print(ip_str) return ip_str def get_city(ip_str,requests): ip_str = ip_str #key = key requests = requests str_data = 'https://restapi.amap.com/v3/ip?ip='+ip_str+'&output=JSON&key=xxxxx' city = requests.get(str_data) print(city.json()) city_str = city.json() city = city_str["city"] return city def get_weather(time_str,city,requests): #key = key time_str = time_str city = city requests = requests response = requests.get('https://restapi.amap.com/v3/weather/weatherInfo?city='+city+'&key=xxxxxxx') weather = response.json() print(weather) temp_str = weather["lives"][0]["temperature_float"] humi_str = weather["lives"][0]["humidity_float"] str_city = weather["lives"][0]["city"] str_province = weather["lives"][0]["province"] str_weather = weather["lives"][0]["weather"] print(temp_str + '\n' + humi_str + '\n' + str_province + '\n' + str_city + '\n' + str_weather) str_wt = "时间:"+ time_str + '\n' + "地点:"+ str_province + "省" + str_city + '\n'+ "天气:" + str_weather + '\n' + '温度:' + temp_str + '`C' + ' ' + '湿度:' + humi_str+ '%' return str_wt if __name__ == "__main__": while True: ssid = "xxxx" password = "xxxxx" connect_wifi(ssid,password) pool = socketpool.SocketPool(wifi.radio) requests = adafruit_requests.Session(pool, ssl.create_default_context()) #key = "be4bf595febd17451fe22077e30dca03" ip_str = get_ipv4(requests) time_str = get_time() display_text_inboard("时间更新中:" + "\n" + time_str) city = get_city(ip_str,requests) str_wt = get_weather(time_str,city,requests) display_text_inboard(str_wt) ``` #三,现象 发现时间和天气可以更新,但是时间有点长,这个数据获取解析需要一定时间,另外显示文本也需要时间,有想法的大佬可以尝试用多线程试试。
天气显示
点赞
回复评论 (1)
沙发
lugl4313820
发现时间和天气可以更新,但是时间有点长,这个数据获取解析需要一定时间,另外显示文本也需要时间,有想法的大佬可以尝试用多线程试试。
期待更加精彩的后续。
点赞
2023-9-21 16:16
最新活动
是德科技有奖直播 | 应对未来高速算力芯片的设计与测试挑战
免费申请 | 上百份MPS MIE模块,免费试用还有礼!
TI 有奖直播 | 使用基于 Arm 的 AM6xA 处理器设计智能化楼宇
Follow me第二季第3期来啦!与得捷一起解锁高性能开发板【EK-RA6M5】超能力!
报名直播赢【双肩包、京东卡、水杯】| 高可靠性IGBT的新选择——安世半导体650V IGBT
30套RV1106 Linux开发板(带摄像头),邀您动手挑战边缘AI~
随便看看
空气净化器是否有用?是否物有所值
利用颜色开锁信不信由你?
max232串行口通信手册
NB-IoT和LoRa对比各自的优势特点是什么
求助:各位好:我想请教一下:430f135自动复位时,如何保留内存不被初始化
DSP系统的降噪技术
RF技术与无线实时仓储管理系统
关于通过以太网下载NK的问题
EEWORLD大学堂----直播回放:ams 投影照明 (MLA) 增强汽车与道路的沟通
使用vhdl设计10mhz分频为1mhz的分频器 占空比按要求设定为10%
电话远程控制系统改进版
求基于AT89C2051的频率计设计
EEWORLD-C2000(178328661)
关于keil51的编程
【AT-START-F425测评】USB转CAN之四 完成收发测试
单片机爱好者我自己家做了个电梯谁能用单片机控制
一堆闲置的板子,包括F7DIS和MSP432等等
ArcPad7.0在定制的wince内核中运行
MODBUS网络化控制求助
dm9000的问题
电子工程世界版权所有
京B2-20211791
京ICP备10001474号-1
京公网安备 11010802033920号
回复
写回复
收藏
回复