第一部分:
视频地址:https://training.eeworld.com.cn/video/38393
第二部分:
任务1:屏幕显示中文
1.固件烧录
详见 Adafruit ESP32-S3 TFT Feather开发板使用入门
简单来讲就是,在此链接下载固件Feather ESP32-S3 TFT Download (circuitpython.org),双击reset按键进入UF2模式,将下载好的UF2文件拖入fthrs3bootusb设备,设备自动重启后,电脑会显示链接名为Circuitpy的盘
2.Circuit python常用库下载
下载地址:https://circuitpython.org/libraries
建议不要一次下载太多,只下载任务需要的库。本次我们需要adafruit_bitmap_font和adafruit_display_text这2个库,我们将这两个库下载后放到磁盘中lib
3程序编写
import board
import displayio
from adafruit_display_text import bitmap_label
from adafruit_bitmap_font import bitmap_font
# 加载位图字体
font = bitmap_font.load_font("/font/wenquanyi_9pt.pcf")
# 创建图像组
group = displayio.Group()
# 指定文本颜色为白色(0xFFFFFF)
color = 0xFFFFFF
# 要显示的文本字符串
text1 = "今天是星期日"
text2 = "早上好"
# 创建一个位图标签对象,使用指定的位图字体和文本,同时将文本放大n倍
text_area1 = bitmap_label.Label(font, text=text1, scale=2)
# 设置文本标签的位置
text_area1.x = 30 # X坐标
text_area1.y = 50 # Y坐标
text_area2 = bitmap_label.Label(font, text=text2, scale=3)
text_area2.x = 70
text_area2.y = 100
group.append(text_area1)
group.append(text_area2)
# 在显示设备上显示文本标签
board.DISPLAY.show(group)
# 进入无限循环,保持程序运行
while True:
pass
这里需要修改文字的颜色,样式,位置均可以在对应的地方进行修改。由于我们打印了两个不同大小和位置的文本,这里建立了一个图像组进行打印输出。
成果展示:
任务2:网络功能使用
(1)WIFI连接
为了使用wifi链接和配置wifi,我们引入了wifi库,它可以用来连接wifi和显示ip。
# 导入所需的库
import board # 与硬件平台交互的库
import wifi # 处理无线网络连接的库
import terminalio # 提供终端IO支持的库
import displayio # 用于管理和显示图形界面的库
from adafruit_display_text import bitmap_label # 用于显示位图文本的库
from adafruit_bitmap_font import bitmap_font # 用于处理位图字体的库
# 加载位图字体
font = bitmap_font.load_font("/font/wenquanyi_9pt.pcf")
# 指定文本颜色为白色(0xFFFFFF)
color = 0xFFFFFF
# 连接到Wi-Fi网络(SSID: 'Atimie', 密码: '877121357')
wifi.radio.connect('Atimie', '877121357')
# 获取Wi-Fi网络的IPv4地址
text1 = "IP地址:" + str(wifi.radio.ipv4_address)
# 创建一个位图标签对象,使用指定的位图字体和文本,同时将文本放大n倍
text_area1 = bitmap_label.Label(font, text=text1, scale=2)
# 设置文本标签的位置
text_area1.x = 10 # X坐标
text_area1.y = 50 # Y坐标
# 在显示设备上显示文本标签
board.DISPLAY.show(text_area1)
# 进入无限循环,保持程序运行
while True:
pass
成品展示:
(2)创建热点
和连接WIFI使用的库相同,下面的程序是主程序。
# 定义Wi-Fi热点的名称和密码
SSID = "esp32"
PASSWORD = "12345678"
# 启动Wi-Fi热点
wifi.radio.start_ap(SSID, PASSWORD)
# 创建文本内容,显示热点名称和密码
text1 = "热点:" + SSID + "\n" + "密码:" + PASSWORD
# 加载位图字体
font = bitmap_font.load_font("/font/wenquanyi_9pt.pcf")
# 指定文本颜色为白色(0xFFFFFF)
color = 0xFFFFFF
# 创建一个位图标签对象,使用指定的位图字体和文本,同时将文本放大n倍
text_area1 = bitmap_label.Label(font, text=text1, scale=2)
# 设置文本标签的位置
text_area1.x = 10 # X坐标
text_area1.y = 50 # Y坐标
# 在显示设备上显示文本标签
board.DISPLAY.show(text_area1)
# 进入无限循环,保持程序运行
while True:
pass
成果展示:
任务3:控制WS2812B
首先在lib文件夹中导入需要用到的固件库
在11. 控制 NeoPixels—MicroPython中文 1.17 文档官网文档中详细讲解了如何控制板载LED
这里我们用了之前程序写过的显示中文的方法来在屏幕上输出当前的led颜色
# 导入必要的库和模块
import board
import time
import neopixel
import digitalio
from adafruit_display_text import label
from adafruit_bitmap_font import bitmap_font
# 在板上设置 NeoPixel,并调整亮度
pixel = neopixel.NeoPixel(board.NEOPIXEL, 1)
pixel.brightness = 0.7
# 使用数字输入/输出设置按钮
button = digitalio.DigitalInOut(board.BUTTON)
button.direction = digitalio.Direction.INPUT # 设置为输入
button.pull = digitalio.Pull.UP # 设置上拉电阻
but_in = 3 # 初始化按钮输入的变量
# 在板上设置一个 LED
led = digitalio.DigitalInOut(board.LED)
led.direction = digitalio.Direction.OUTPUT
# 设置显示器和字体文件
display = board.DISPLAY
font_file = "/font/wenquanyi_9pt.pcf"
font = bitmap_font.load_font(font_file)
下面是函数和主循环部分
# 定义检查按钮状态的函数
def check_button():
global but_in
if not button.value:
but_in += 1
if but_in > 3:
but_in = 0
time.sleep(0.2)
# 定义显示颜色信息的函数
def display_color_info(color, text):
text_area = label.Label(font, text=text, color=color)
text_area.x = 80
text_area.y = 60
scale = 2
pixel.fill(color)
display.show(text_area)
# 定义显示信息的函数
def dispinfo(str):
if str == "RED":
display_color_info(0xFF0000, "红色")
elif str == "GREEN":
display_color_info(0x00FF00, "绿色")
elif str == "BLUE":
display_color_info(0x0000FF, "蓝色")
else:
display_color_info(0xFFFFFF, "按下按键以开始")
# 无限循环
while True:
check_button()
if but_in == 0:
dispinfo("RED")
elif but_in == 1:
dispinfo("BLUE")
elif but_in == 2:
dispinfo("GREEN")
else:
dispinfo("START")
time.sleep(0.5)
成果展示:
be8b49feac3d59e73ee8661773c5210e
任务4:日历&时钟
最后一个任务有一定难度,但是使用的知识都是前面任务学到的。
由于本人实在小白,参考了几位大佬的设计,下面是代码部分
这是本次任务需要用到的库
import board, os, wifi
import time
import ssl
import socketpool
import adafruit_requests
import displayio
from adafruit_display_text import label, wrap_text_to_lines
from adafruit_bitmap_font import bitmap_font
引用文字库,创建图像和连接wifi可以使用之前的代码,这里就不打出了。
从网络上获取时间和天气数据,天气数据这里需要找高德的网站申请api接口。知乎上有详细教程,很方便就能搞定
def get_weather():
#城市代码
city = ""
#输入你申请的key
key = ""
getweather_url = "https://restapi.amap.com/v3/weather/weatherInfo?city=" + city + "&key=" + key
response = requests.get(getweather_url)
json_resp = response.json()
response.close()
for da in json_resp["lives"]:
return da["temperature"], da["weather"]
JSON_TIME_URL = "http://quan.suning.com/getSysTime.do"
def get_data():
response = requests.get(JSON_TIME_URL)
date.text = response.json()['sysTime2'][:-3]
str_t, str_tz = get_weather()
temp.text = "%s°" % (str_t)
tempzh.text = str_tz
status = "updated"
将要显示的各个模块定义并初始化,调整其大小,位置,颜色
date = label.Label(font, text="1月1日", color=color ,scale=2)
date.x = 10
date.y = 30
group.append(date)
week = label.Label(font, text="周一", color=color,scale=2)
week.x = 20
week.y = 80
group.append(week)
temp = label.Label(font, text="0°", color=color,scale=2)
temp.x = 140
temp.y = 90
group.append(temp)
tempzh = label.Label(font, text="晴", color=color,scale=2)
tempzh.x = 110
tempzh.y = 90
group.append(tempzh)
主循环
display.show(group)
while True:
info = get_data()
screen(info)
time.sleep(60)
由于未知原因,我使用ntp校时方法来获取时间的时候,单片机总是报连接超时的错误。所以我选用了这一种较为简单的方法,也只能丢失了秒钟的获取。循环60s刷新一次。
总结
首先感谢得捷电子和eeworld联合举办了本次活动,让我学习并体验了这款单片机,使用它完成了不少有趣的任务。也感谢各位已经做完任务的前辈的指导,让我看到同一个任务也能有不同的思路,不同的解法。作为一个大二的学生,我希望以后可以继续探索这块单片机的能力,不断提升自己。再次感谢电子工程世界搭建了这样一个有着优质资源,和优秀创客的平台。希望eeworld越做越好,汇聚更多优质资源,成为滋养程序员的沃土
第三部分:
源码下载:https://download.eeworld.com.cn/detail/wwwcy/629873
|