607|0

1

帖子

1

TA的资源

一粒金砂(中级)

楼主
 

【得捷电子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提供这样的机会参加此次活动。

点赞 关注
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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