任务1:实现颜色传感器驱动,按键获取当前颜色数据并可以通过串口或屏幕进行打印;任务1.1:按键按下后,串口或屏幕打印按键值
import time
import board
import digitalio
led = digitalio.DigitalInOut(board.LED)
led.direction = digitalio.Direction.OUTPUT
button0 = digitalio.DigitalInOut(board.BUTTON)
button0.switch_to_input(pull=digitalio.Pull.UP)
button1 = digitalio.DigitalInOut(board.D1)
button1.switch_to_input(pull=digitalio.Pull.DOWN)
button2 = digitalio.DigitalInOut(board.D2)
button2.switch_to_input(pull=digitalio.Pull.DOWN)
print("Hello World! Hey Hey Hey...")
print("Button led")
while True:
# Check Button D0
if not button0.value: # button0 is active (Pull.UP, active LOW)
print("Button D0 pressed")
led.value = True
# Check Button D1
elif button1.value: # button1 is active (Pull.DOWN, active HIGH)
print("Button D1 pressed")
led.value = True
# Check Button D2
elif button2.value: # button2 is active (Pull.DOWN, active HIGH)
print("Button D2 pressed")
led.value = True
else:
led.value = False # No buttons are pressed, turn off the LED
# Small delay to debounce buttons and reduce serial output spam
time.sleep(0.1)
保存之后可以在显示屏上看到下面的内容。每次按下按键,显示屏上显示按下的按键名,同时led点亮。
任务1.2:实现颜色传感器驱动
接着上面的任务,按照教程PPT中的任务一部分添加TCS2000类。
class TCS3200:
def __init__(self, s0, s1, s2, s3, out_pin):
# 初始化TCS3200的控制引脚
self.s0 = s0
self.s1 = s1
self.s2 = s2
self.s3 = s3
self.out = out_pin
# 设置引脚方向
self.s0.direction = digitalio.Direction.OUTPUT
self.s1.direction = digitalio.Direction.OUTPUT
self.s2.direction = digitalio.Direction.OUTPUT
self.s3.direction = digitalio.Direction.OUTPUT
self.out.direction = digitalio.Direction.INPUT
def set_frequency(self, freq_mode):
"""
设置传感器的频率控制(s0和s1)
Parameters
----------
freq_mode : TYPE
DESCRIPTION.
0:2%频率
1:20%频率
2:100%频率
Returns
-------
None.
"""
if freq_mode == 0:
self.s0.value = False
self.s1.value = False
elif freq_mode == 1:
self.s0.value = False
self.s1.value = True
elif freq_mode == 2:
self.s0.value = True
self.s1.value = False
else:
self.s0.value = True
self.s1.value = True
def set_color_channel(self, color):
"""
设置S2和S3引脚来选择颜色通道
Parameters
----------
color : TYPE
DESCRIPTION.
'R': Red
'G': Green
'B': Blue
Returns
-------
None.
"""
if color == 'R':
self.s2.value = False
self.s3.value = False
elif color == 'G':
self.s2.value = True
self.s3.value = True
elif color == 'B':
self.s2.value = False
self.s3.value = True
# 配置采样次数
NUM_CYCLES = 10 # 测多少个周期
def measure_frequency(self):
timestamps = []
last_state = self.out.value
while len(timestamps) < self.NUM_CYCLES:
current_state = self.out.value
if current_state != last_state:
# 发生边缘变化
timestamps.append(time.monotonic_ns())
last_state = current_state
# 计算周期
periods = []
for i in range(2, len(timestamps), 2):
period_ns = timestamps[i] - timestamps[i - 2] # 一个完整周期(两个边缘)
periods.append(period_ns)
avg_period_ns = sum(periods) / len(periods)
frequency = 1_000_000_000 / avg_period_ns # 转换成Hz
return frequency
现在的程序还不能驱动拾色器。接下来我们还需要把类给实例化:
try:
pickColor_tcs = TCS3200(
s0=digitalio.DigitalInOut(board.D12),
s1=digitalio.DigitalInOut(board.D11),
s2=digitalio.DigitalInOut(board.D10),
s3=digitalio.DigitalInOut(board.D9),
out_pin=digitalio.DigitalInOut(board.D6)
)
print("TCS3200 finished")
except Exception as e:
print(f"init TCS3200 failed:{e}")
pickColor_tcs = None
任务1.3:实现颜色传感器驱动,按键获取当前颜色数据并可以通过串口或屏幕进行打印;
在按键D0里添加命令:
pickColor_tcs.set_color_channel('R')
red_freq = pickColor_tcs.measure_frequency()
print("red_freq: {:.2f}".format(red_freq))这时候会保存、运行后,按下D0键,会看到存在错误提示。经排查后发现是例程中几个地方存在些小问题:
def measure_frequency(self):
...
last_state = self.out.value
...
while len(timestamps) < self.NUM_CYCLES:
current_state = self.out.value
...
这几个地方都是没有self的引用,添加后可以工作。
继续添加D1、D2的命令:
pickColor_tcs.set_color_channel('G')
green_freq = pickColor_tcs.measure_frequency()
print("green_freq: {:.2f}".format(green_freq)) pickColor_tcs.set_color_channel('B')
blue_freq = pickColor_tcs.measure_frequency()
print("blue_freq: {:.2f}".format(blue_freq))怎么改变字体的颜色啊?好想实现……啊啊啊……啊……
