一、环境搭建。
这次活动开发板 Adafruit开发板 1528-5691-ND 主控为ESP32-S3。可以支持esp-idf、Arduino、microPython、CircuitPython。这次完成任务,我使用的是CircuitPython。
从https://learn.adafruit.com/esp32-s3-reverse-tft-feather/update-tinyuf2-bootloader-for-circuitpython-10-4mb-boards-only下载固件“tinyuf2-adafruit_feather_esp32s3_reverse_tft-0.33.0-combined.bin”,和CircuitPython的固件文件。使用flash tool先将固件烧入开发板。然后通过电脑将CircuitPython拖入U盘即可完成CircuitPython环境的搭建。开发工具我选择用thonny。


tinyuf2-adafruit_feather_esp32s3_reverse_tft-0.33.0-combined.zip
adafruit-circuitpython-adafruit_feather_esp32s3_reverse_tft-en_US-10.0.3.zip
二、驱动板载的全彩LED灯。
Adafruit-ESP32-S3-TFT-Feather板子上集成了一颗WS2812全彩LED灯。在CircuitPython下使用neopixel库来驱动。
import time import board import neopixel pixel = neopixel.NeoPixel(board.NEOPIXEL, 1) pixel.brightness = 0.3 while True: pixel.fill((255, 0, 0)) time.sleep(0.5) pixel.fill((0, 255, 0)) time.sleep(0.5) pixel.fill((0, 0, 255)) time.sleep(0.5)

三、接近传感器的测试。
购买的器件中有一个接近传感器Littelfuse 接近传感器 18-59001-1-T-02-A-ND。测试了一下,是一个霍尔传感器。当有磁铁靠近探头时,就会短路,用来无接触地感知物体的接近。
import board
import digitalio
import time
# 初始化按键(假设按键连接在 GPIO0 引脚)
button = digitalio.DigitalInOut(board.D5)
button.direction = digitalio.Direction.INPUT
button.pull = digitalio.Pull.UP # 上拉电阻
while True:
if not button.value: # 按键按下时读取值为 False
print("磁铁靠近!")
time.sleep(0.2) # 简单防抖延时
time.sleep(0.01)
四、基础任务1、实现颜色传感器驱动,按键获取当前颜色数据并可以通过串口或屏幕进行打印。2、实现板载RGB的全彩控制,实时显示当前获取的颜色
给Adafruit-ESP32-S3-TFT-Feather板子焊上了排针,使用面包板来连接DFRobot 颜色传感器。这里遇到一个问题。开发板的背面有电池接口,焊上排针后,排针没有比电池接口高多少。导致插入面包板时插不紧,时不时有接触不良情况出现。
TCS3200颜色传感器是一款全彩的颜色检测器,包括了一块TAOS TCS3200RGB感应芯片和4个白色LED灯,TCS3200能在一定的范围内检测和测量几乎所有的可见光。TCS3200有大量的光检测器,每个都有红绿蓝和清除4种滤光器。每6种颜色滤光器均匀地按数组分布来清除颜色中偏移位置的颜色分量。内置的振荡器能输出方波,其频率与所选择的光的强度成比例关系。


这里在使用TCS3200颜色传感器时,我使用一块TFT屏幕作为颜色的来源,所以就没有打开TCS3200颜色传感器上的LED灯。颜色只是识别红、绿、蓝三种颜色。在TCS3200颜色传感器初始化时进行一次使用白光的校准。然后每次按下按键就开始测量当前颜色,并在串口和屏幕打印识别信息。最后驱动LED灯显示对应的颜色。

#1、实现颜色传感器驱动,按键获取当前颜色数据并可以通过串口或屏幕进行打印;
import board
import digitalio
import time
import neopixel
import displayio
import terminalio
from adafruit_display_text import label
from tcs3200 import TCS3200
import neopixel
pixel = neopixel.NeoPixel(board.NEOPIXEL, 1)
def detect_color(r, g, b):
"""
智能颜色识别算法
返回: 颜色名称字符串
"""
total = r + g + b
if total < 30: return "黑色"
if total > 600: return "白色"
# 计算各通道占比
r_ratio, g_ratio, b_ratio = r/total, g/total, b/total
# 基于比例和绝对值的综合判断
if r_ratio > 0.45 and r > 80: return "RED"
if g_ratio > 0.42 and g > 80: return "GREEN"
if b_ratio > 0.42 and b > 80: return "BLUE"
return "UNKNOWN"
# 初始化板载按键D0/BOOT0,按下接地
button0 = digitalio.DigitalInOut(board.BUTTON)
button0.switch_to_input(pull=digitalio.Pull.UP)
# 创建TCS3200对象
color_sensor = TCS3200(s0_pin=board.A0,s1_pin=board.A1,s2_pin=board.A2,
s3_pin=board.A3,out_pin=board.A5 )
#首先做白平衡校准
color_sensor.calibrate_white_balance()
# 主循环
while True:
time.sleep(0.05)
# 读取按键0
if not button0.value:
print("button0按下")
if color_sensor is not None:
try:
# 调用read_rgb方法读取颜色值
R_Val, G_Val, B_Val = color_sensor.read_rgb()
print("RGB: {:.3f},{:.3f},{:.3f}".format(R_Val, G_Val, B_Val),detect_color(R_Val, G_Val, B_Val))
if detect_color(R_Val, G_Val, B_Val)=="RED":
pixel.fill((255, 0, 0))
elif detect_color(R_Val, G_Val, B_Val)=="GREEN":
pixel.fill((0, 255, 0))
elif detect_color(R_Val, G_Val, B_Val)=="BLUE":
pixel.fill((0, 0, 255))
else:
pixel.fill((0, 0, 0))
except Exception as e:
print(f"读取颜色传感器错误: {e}")校正
识别到红色。板载的全彩LED灯,在板子的背面,只能通过边上漏出的光看见显示的颜色。



基础任务3、实现蜂鸣器驱动,并播放八阶音符
手头有一个蜂鸣器模块。使用的是手机上的蜂鸣器。效果要比圆柱形蜂鸣器好一些。ESP32S3使用pwm方波,通过变换频率来变换音阶。

import board
import pwmio
import time
pwm = pwmio.PWMOut(board.D13, duty_cycle=0, frequency=440, variable_frequency=True)
# 8 音阶频率(C4, D4, E4, F4, G4, A4, B4, C5)
note_names = ['C4', 'D4', 'E4', 'F4', 'G4', 'A4', 'B4', 'C5']
frequencies = [261, 293, 329, 349, 392, 440, 493, 523]
# 音符播放控制函数
def play_note(note):
if note in range(len(note_names)):
names = note_names[note]
freq = frequencies[note]
print(f"Playing {names} at {freq} Hz")
pwm.frequency = int(freq)
pwm.duty_cycle = 2 ** 10
else:
print(f"Note {names} is not valid in the scale")
# 停止播放音符
def stop_playing():
pwm.duty_cycle = 0
note_index = 0 # 当前音符的索引
while True:
stop_playing() # 停止当前音符(如果正在播放)
play_note(note_index) # 播放下一个音符
note_index = (note_index + 1) % len(note_names) # 切换到下一个音符,若达到最后一个音符则从头开始
time.sleep(1) # 延时1秒
我要赚赏金
