【得捷电子Follow me第2期】Adafruit ESP32-S3 TFT Feather_作业提交_汇总
[复制链接]
【得捷电子Follow me第2期】
首先要感谢eeworld和得捷电子的支持,以及社区内那些无私分享经验的前辈们,让我也能体验到对一个电子硬件的零基础上手。
视频链接:https://training.eeworld.com.cn/video/38351
源代码链接:https://download.eeworld.com.cn/detail/song54537/629855
本次活动采用的是Adafruit ESP32-S3 TFT Feather开发板,开发板使用乐鑫ESP32-S3芯片,支持WiFi和蓝牙,自带高清TFT彩色显示屏。(具体参数就不详细写了,有需要可以看https://www.eeworld.com.cn/huodong/digikey_follow_me/#dgbz中的ESP32-S3技术规格书)
本次任务共有四个必做任务,第四个任务为四选一必做,我选择的是时钟日历,以下为出厂设置、四个任务的代码及介绍。
出厂设置
出场模式
UF2模式
双击reset键会进入 UF2模式
下载circuitpython
将该文件拖入u盘模式的开发板
成功安装
在我的电脑显示u盘格式
测试
使led进行频闪 并且每个循环输出一遍hello_world
结果
任务1:控制屏幕显示中文(必做任务)
完成屏幕的控制,并且能显示中文
需要先导入对应的字体文件pcf,导入外置库
代码思路:
设置要显示的文本“你好,世界”,并提供函数以根据屏幕设置格式化文本。
配置显示屏的亮度和方向。
基于屏幕方向,确定每行的最大字符数。
加载字体文件,设置文本颜色为青色。
设定文本标签的位置、行间距和缩放。
在displayio.Group中添加文本标签并展示。
import board
import displayio
from adafruit_display_text import label
from adafruit_bitmap_font import bitmap_font
# 要在屏幕上显示的文本
display_text = "你好,世界"
def format_display_string(input_str, chars_per_line):
"""
根据屏幕方向和每行的字符限制,格式化字符串
:param input_str: 原始字符串
:param chars_per_line: 每行的最大字符数
:return: 格式化后的字符串,每行字符不超过限制
"""
formatted_str = ""
for i in range((len(input_str) - 1) // chars_per_line + 1):
# 按照每行字符数拆分字符串,并添加换行符
line_start = i * chars_per_line
line_end = (i + 1) * chars_per_line
formatted_str += input_str[line_start:line_end] + "\n"
return formatted_str
# 初始化显示屏对象
display = board.DISPLAY
# 设置屏幕亮度和方向
display.brightness = 0.35
display.rotation = 0
# 确定每行的字符数(基于当前屏幕方向)
chars_per_line = 23 if display.rotation % 180 == 0 else 13
# 加载字体并设置文本颜色
font = bitmap_font.load_font("ziti.pcf")
text_color = 0x00FFFF # 青色
# 创建显示文本的标签
text_label = label.Label(font, text=format_display_string(display_text, chars_per_line), color=text_color)
text_label.x = 0
text_label.y = 70
text_label.line_spacing = 0.8
text_label.scale = 3
# 创建文本组并将标签添加到组中
text_group = displayio.Group()
text_group.append(text_label)
# 在显示屏上显示文本组
display.show(text_group)
# 持续显示,直到被外部中断
while True:
pass
任务1
通过本任务可以了解在开发板上显示中文的必要过程。
任务2:网络功能使用(必做任务)
完成网络功能的使用,能够创建热点和连接到WiFi
需要导入外置库
代码思路:
使用os和wifi模块。
通过print_mac_address函数显示设备MAC地址。
用scan_and_display_wifi_networks扫描和展示周围WiFi。
connect_to_wifi函数实现WiFi连接,需SSID和密码。
setup_access_point用于创建无线接入点。
打印信息,执行上述函数,从环境变量读取WiFi和接入点配置。
# 导入必要模块
import os
import wifi
def print_mac_address():
""" 打印设备的MAC地址 """
mac_address = [hex(i) for i in wifi.radio.mac_address]
print(f"Device MAC address: {mac_address}")
def scan_and_display_wifi_networks():
""" 扫描并显示附近的WiFi网络 """
print("Scanning for available WiFi networks...")
for network in wifi.radio.start_scanning_networks():
print(f"SSID: {str(network.ssid, 'utf-8')}, RSSI: {network.rssi}, Channel: {network.channel}")
wifi.radio.stop_scanning_networks()
def connect_to_wifi(ssid, password):
""" 连接到指定的WiFi网络 """
try:
print(f"Attempting to connect to WiFi network: {ssid}")
wifi.radio.connect(ssid, password)
print(f"Successfully connected to {ssid}")
print(f"IP address: {wifi.radio.ipv4_address}")
except Exception as e:
print(f"Failed to connect to WiFi: {e}")
def setup_access_point(ssid, password):
""" 设置并启动无线接入点 """
print(f"Setting up Access Point with SSID: {ssid}")
wifi.radio.start_ap(ssid, password)
print(f"Access Point '{ssid}' started with password '{password}'")
# 主程序开始
print("ESP32-S3 WiFi and Access Point Configuration")
# 打印MAC地址
print_mac_address()
# 扫描和显示附近的WiFi网络
scan_and_display_wifi_networks()
# 连接到WiFi
wifi_ssid = os.getenv("WIFI_SSID", "YourDefaultSSID")
wifi_password = os.getenv("WIFI_PASSWORD", "YourDefaultPassword")
connect_to_wifi(wifi_ssid, wifi_password)
# 设置无线接入点
ap_ssid = os.getenv("AP_SSID", "ESP32-S3_AP")
ap_password = os.getenv("AP_PASSWORD", "defaultAPpassword")
setup_access_point(ap_ssid, ap_password)
# 保持程序运行
while True:
pass
已连接至手机热点
已连接至ESP32-s3的网络
任务2
通过本任务可以了解如何将开发板连接至网络和如何打开热点功能。
任务3:控制WS2812B(必做任务)
使用按键控制板载Neopixel LED的显示和颜色切换
需要导入字体文件.pcf 和外置库
代码思路:
设置按钮引脚并初始化为输入模式。
设置并调整NeoPixel LED的亮度。
创建七种颜色的列表。
循环检测按钮按下,切换LED颜色,并打印颜色信息。
import time
import board
import digitalio
import neopixel
# 设置按钮引脚( 'board.BUTTON')
button_pin = board.BUTTON
# 初始化按钮输入
button = digitalio.DigitalInOut(button_pin)
button.direction = digitalio.Direction.INPUT
button.pull = digitalio.Pull.UP
# 初始化NeoPixel LED
pixel = neopixel.NeoPixel(board.NEOPIXEL, 1, brightness=1)
# 定义彩虹循环的颜色列表
colors = [
(255, 0, 0), # 红色
(255, 165, 0), # 橙色
(255, 255, 0), # 黄色
(0, 255, 0), # 绿色
(0, 0, 255), # 蓝色
(75, 0, 130), # 靛蓝
(238, 130, 238) # 紫色
]
# 初始化颜色索引
color_index = 0
# 主循环
while True:
if not button.value: # 检查按钮是否被按下
# 更改NeoPixel颜色
pixel.fill(colors[color_index])
pixel.show()
# 打印当前颜色信息
print(f" {colors[color_index]}")
# 增加到下一个颜色,必要时循环
color_index = (color_index + 1) % len(colors)
# 短暂延迟以消除按钮按下的抖动
time.sleep(0.1)
任务3
通过本任务可以了解如何控制NeoPixel LED。
任务4:日历&时钟——完成一个可通过互联网更新的万年历时钟,并显示当地的天气信息(必做任务)
代码思路:
引入了wifi, socketpool, ssl, adafruit_requests等库,用于网络通信和数据处理。
定义显示颜色DISPLAY_COLOR和字体文件路径FONT_FILE_PATH。
初始化WiFi
通过adafruit_requests与HTTP服务器建立连接。
从API获取当前天气、城市信息及预报。
提取并处理天气、城市信息等。
生成包含各种天气信息的字符串。
调整显示屏的亮度和方向。
从指定路径加载字体文件。
设置文本标签的属性并加入到显示组。
在显示屏上呈现天气信息。
import wifi
import socketpool
import ssl
import adafruit_requests
import board
import displayio
from adafruit_display_text import label
from adafruit_bitmap_font import bitmap_font
# 显示设置常量
DISPLAY_COLOR = 0x9499CA
FONT_FILE_PATH = "ziti.pcf" # 更改为你的字体文件的路径
# 初始化WiFi连接
print("正在连接到WiFi...")
wifi.radio.connect("WWW", "lkjhgfdsa")
print(f"已连接至你的WiFi,IP地址为 {wifi.radio.ipv4_address}")
# 创建HTTP会话
http_session_pool = socketpool.SocketPool(wifi.radio)
http_session = adafruit_requests.Session(http_session_pool, ssl.create_default_context())
# 从API获取天气数据
BEIJING_WEATHER_API_URL = "http://t.weather.itboy.net/api/weather/city/101010100"
print(f"从 {BEIJING_WEATHER_API_URL} 获取天气数据")
weather_response = http_session.get(BEIJING_WEATHER_API_URL)
weather_json = weather_response.json()
# 解析天气数据
city_info = weather_json['cityInfo']
current_weather = weather_json['data']
weather_forecast = current_weather['forecast'][0]
timestamp = weather_json['time'][:11]
# 构造带有天气信息的显示字符串
weather_display_text = f"{timestamp} {city_info['parent']} {city_info['city']} {weather_forecast['week']}\n"
weather_display_text += f"备注: {weather_forecast['notice']}\n"
weather_display_text += f"空气质量: {current_weather['quality']} {weather_forecast['type']}\n"
weather_display_text += f"PM2.5: {current_weather['pm25']} PM10: {current_weather['pm10']}\n"
weather_display_text += f"湿度: {current_weather['shidu']}\n"
weather_display_text += f"最高温度: {weather_forecast['high']} 最低温度: {weather_forecast['low']}"
# 设置显示屏
main_display = board.DISPLAY
main_display.brightness = 0.9
main_display.rotation = 0
# 加载字体
font_to_use = bitmap_font.load_font(FONT_FILE_PATH)
# 创建文本显示组
text_display_group = displayio.Group()
text_area = label.Label(font_to_use, text=weather_display_text, color=DISPLAY_COLOR, x=0, y=10)
text_area.line_spacing = 0.8
text_area.scale = 1
# 将文本区域添加到显示组并显示
text_display_group.append(text_area)
main_display.show(text_display_group)
# 执行无限循环以保持显示
while True:
pass
任务4
通过本任务将前面的几个任务综合,使用中文字体、屏幕控制、连接网络等功能一起实现,综合的提升了对开发板的了解。
活动感悟
CircuitPython的生态系统相当完善,尤其是Adafruit为其板卡设计的众多专属库。我体验到了CircuitPython的图形用户界面的易用性,它特别适合开发界面交互密集的应用。这块开发板的集成度令人印象深刻,大多数外设都能即插即用。在开发时,我需要关注诸如显示屏刷新机制和内存管理等细节。通过巧妙的编程方法优化代码,可以显著提升程序性能。整体来看,这块开发板在硬件方面表现出色,软件上也极为用户友好。Adafruit提供的广泛开发资源大大加快了我的开发进程。我期待用这块板子继续探索更多有趣的项目,并感谢得捷电子和eeworld提供这样的机会参加此次活动。
|