这次的活动其实非常适合新手练习,项目比较简单,我选择了趁这次机会用CircuitPython完成项目,因为是第一次使用CircuitPython开发所以算是边学边开发,这篇项目总结报告算是一个教学向的文章,如果有想要试试CircuitPython开发的可以通过这次活动练练手。
一.开发板和开发环境介绍
首先介绍一下板子Adafruit ESP32-S3 TFT Feather,拿到板子只要下载circuit python固件就可以了,下载方式也很简单,快速按rst按键两次进入UF2模式,在把circuit python固件放到发现的U盘即可。开发过程中如果要调试当然可以选择在线调试,或者是选择结合其他IDE,不过我发现这次的开发板相当贴心我们可以直接在自带的液晶显示屏上看到报错,勉强可以完成开发。
二.准备工作
有了方便的开发板和开发环境,之后的工作其实就相对简单了,不过circuit python的资料相对较少,有一些问题要说一下。
- 我们的开发板型号是Feather ESP32-S3 TFT PSRAM选择固件时不能选错我也把官网地址放出来https://circuitpython.org/board/adafruit_feather_esp32s3_tft/
记得选择.uf2文件下载。
- 刷完固件,我们的项目结构看起来很吓人东西很多,其实没什么主要是code.py这个是我们项目的核心代码用来运行程序
Lib文件夹是用来放我们的各种模块文件的,这样我们就可以发挥Python的强大了
其他的空间可以放各种其他资源比如我这个项目要用到的背景图片
- 各种库的调用
adafruit_led_animation库可以轻松控制LED动态效果
displayio库是CircuitPython内置库用来控制屏幕的输出
adafruit_bitmap_font库,用于加载自定义字体
三.功能介绍和实现
接着是功能介绍,我选择的是“分任务1:日历&时钟——完成一个可通过互联网更新的万年历时钟,并显示当地的天气信息”。任务比较简单而且可以在完成分任务后顺便完成必做任务,非常适合我们。“任务1:控制屏幕显示中文”用来显示天气,“任务2:网络功能使用”用来获得地区天气,“任务3:控制WS2812B”用来控制一下LED。
任务1:控制屏幕显示中文
# 导入外部库adafruit_display_text里的lable,用于显示标签
from adafruit_display_text import label
# 加载字体并定义字体颜色
font = bitmap_font.load_font("/font/sytq_16.pcf")
nun_font = bitmap_font.load_font("/font/DingTalk_ncn_60.pcf")
color = 0xf26957
# 初始化日期标签并设置x,y轴绘图坐标,然后将标签添加到图像组
date = label.Label(font, text="", color=color)
date.x = 50
date.y = 20
group.append(date)
label.Label方法可以用来显示内容例如:
date = label.Label(font, text="10月17日 周二", color=color)就可以在屏幕上显示出“10月17日 周二”,
任务2:网络功能使用
注册
# 导入os库,用来获取wifi信息
import os
# 导入rtc库,实现RTC时钟
import rtc
# 导入wifi、time库备用
import wifi
import time
# 导入网络库备用
import ssl
import socketpool
import adafruit_ntp
import adafruit_requests
# 使用os.getenv函数,从setting.toml文件里获取wifi ssid和密码
ssid = os.getenv("CIRCUITPY_WIFI_SSID")
password = os.getenv("CIRCUITPY_WIFI_PASSWORD")
然后是最重要的settings.tmol文件的编写,写好WiFi密码和WiFi名,之后就可以看到显示的ip地址了。
任务3:控制WS2812B(必做任务)
# 从digitalio内置库导入DigitalInOut, Direction, Pull
from digitalio import DigitalInOut, Direction, Pull
# 导入neopixel内置库
import neopixel
# 从adafruit_led_animation.animation.blink库导入Blink
from adafruit_led_animation.animation.blink import Blink
# 从adafruit_led_animation.color库导入五种颜色定义
from adafruit_led_animation.color import JADE, BLACK, ORANGE, GOLD, OLD_LACE
# 初始化像素灯引脚
pixel_pin = board.NEOPIXEL
# 设置像素灯数量,这样分开写方便以后修改代码,例如外接ws2812灯带或者矩阵
num_pixels = 1
# 初始化像素灯
pixels = neopixel.NeoPixel(
pixel_pin, num_pixels, brightness=0.2, auto_write=False, pixel_order=neopixel.GRB
)
# 初始化blink动态效果
blink = Blink(pixels, speed=0.5, color=BLACK)
# 初始化btn按钮对象
btn = DigitalInOut(board.BOOT0)
# 设置btn引脚为输入
btn.direction = Direction.INPUT
# 设置btn引脚为上拉
btn.pull = Pull.UP
天气时钟
因为使用了高德的天气API所以我们看一下如何使用,其实是非常简单的http
发送
返回
# 使用adafruit_ntp.NTP函数初始化ntp服务,第一个函数是确定网络连接端口,
# 第二个函数设置时区,中国是+8时区,第三个函数用来指定ntp服务器地址
pool = socketpool.SocketPool(wifi.radio)
ntp = adafruit_ntp.NTP(pool, tz_offset=8, server="ntp.aliyun.com")
# 使用ntp时间更新系统时间
rtc.RTC().datetime = ntp.datetime
def get_wday(wday):
if (wday == 0):
return "周一"
elif (wday == 1):
return "周二"
elif (wday == 2):
return "周三"
elif (wday == 3):
return "周四"
elif (wday == 4):
return "周五"
elif (wday == 5):
return "周六"
elif (wday == 6):
return "周日"
# 初始化requests对象
pool = socketpool.SocketPool(wifi.radio)
requests = adafruit_requests.Session(pool, ssl.create_default_context())
def get_weather():
# 设置城市id
city = "340100"
# 这个函数使用的是高德API,使用该API需要先去注册相关账户,申请key。
key = "0154a9c43e2b7d940f39e72a07c599c8"
# 拼接天气链接url
getweather_url = "https://restapi.amap.com/v3/weather/weatherInfo?city=" + city + "&key=" + key
# 获取天气json数据
response = requests.get(getweather_url)
json_resp = response.json()
# 关闭连接
response.close()
# 解析json数据,并返回温度和天气信息
for da in json_resp["lives"]:
#print(da["temperature"])
return da["temperature"], da["weather"]
# 先创建一个status变量,用来在设备启动时获取天气信息
status = "boot"
# 定义led_color变量,用于五种颜色切换
led_color = 0
# 每秒获取一次本地RTC时间
t = time.localtime()
# 首次启动或者本地RTC时间的分钟属性为0时,更新日期标签和天气标签
if (status == "boot" or t.tm_min == 0):
# 更新日期标签
date.text = "%d月%d日" % (t.tm_mon, t.tm_mday)
week.text = get_wday(t.tm_wday)
# 获取天气信息
str_t, str_tz = get_weather()
# 更新温度标签
temp.text = "%s°" % (str_t)
# 更新天气标签
tempzh.text = str_tz
status = "updated"
# 每隔1秒 更新一次时钟标签,用于动态显示
if (t.tm_sec % 2 == 0):
timeL.text = "%02d:%02d" % ( t.tm_hour, t.tm_min)
timeL.color = 0xf26957
else:
timeL.text = "%02d:%02d" % ( t.tm_hour, t.tm_min)
timeL.color = 0xD9D7C9
# 刷新屏幕
display.show(group)
# 休眠1秒
time.sleep(1)
最后看一下完整代码第一次用Python开发有点乱,但是最后的效果不错对circuit python真的相当喜欢比硬写C语言好的多尤其是可以应用Python的各种库函数,大大方便了我们的开发难度,想我这样第一次接触circuit python的开发者也可以快速上手。很感谢这次机会学到了不少新的知识,尤其开发板特别吸引人,希望能多多举办,越办越好。
以下是我的项目视频:https://training.eeworld.com.cn/video/38035
这个链接是我的项目代码:https://download.eeworld.com.cn/detail/khalilduboa/629655?type__2276=n4mx27D%3D3QqrG8DlxGr8D9DRxGqopjhp0AoD&alichlgref=http%3A%2F%2Fbbs.eeworld.com.cn%2Fmy%2Fhome.php%3Fcur%3Dmyhome%26act%3Ddownload
|