【目的】
实现颜色传感器驱动,按键获取当前颜色数据并可以通过串口或屏幕进行打印;
【平台】
CircuitPython
【传感器介绍】
TCS3200颜色传感器

TCS3200颜色传感器是一款全彩的颜色检测器,包括了一块TAOS TCS3200RGB感应芯片和4个白色LED灯,TCS3200能在一定的范围内检测和测量几乎所有的可见光。TCS3200有大量的光检测器,每个都有红绿蓝和清除4种滤光器。每6种颜色滤光器均匀地按数组分布来清除颜色中偏移位置的颜色分量。内置的振荡器能输出方波,其频率与所选择的光的强度成比例关系。
TCS3200 引脚说明:
VCC:3.3V
GND:接地
S0, S1:频率缩放选择(控制输出频率范围)
S2, S3:颜色通道选择(红/绿/蓝/清除)
OUT:频率输出(连接到 ESP32 的输入引脚)
TCS3200 输出一个方波,其频率与所选颜色通道的光强度成正比。通过测量频率(或周期),可以估算 RGB 值。
S0/S1 控制输出频率比例(我们设为 2%:S0=LOW, S1=HIGH)
S2/S3 选择通道:
Red: S2=L, S3=L
Blue: S2=L, S3=H
Green: S2=H, S3=L
Clear: S2=H, S3=H
由于 CircuitPython 没有直接的频率计数器 API,我们使用 time.monotonic() 测量多个脉冲的时间来估算频率。
程序代码:
import time
import board
import digitalio
class TCS3200:
def __init__(self, s0, s1, s2, s3, out_pin):
# 控制引脚
self.s0 = digitalio.DigitalInOut(s0)
self.s1 = digitalio.DigitalInOut(s1)
self.s2 = digitalio.DigitalInOut(s2)
self.s3 = digitalio.DigitalInOut(s3)
# 输出引脚(只读)
self.out = digitalio.DigitalInOut(out_pin)
self.out.direction = digitalio.Direction.INPUT
# 设置频率缩放为 2% (S0=LOW, S1=HIGH)
self.s0.switch_to_output(value=False)
self.s1.switch_to_output(value=True)
self.s2.switch_to_output()
self.s3.switch_to_output()
def _set_channel(self, red, green, blue, clear):
if red:
self.s2.value = False
self.s3.value = False
elif blue:
self.s2.value = False
self.s3.value = True
elif green:
self.s2.value = True
self.s3.value = False
elif clear:
self.s2.value = True
self.s3.value = True
def _read_frequency(self, num_cycles=10):
start = time.monotonic()
count = 0
last_state = self.out.value
while count < num_cycles:
current = self.out.value
if not last_state and current: # rising edge
count += 1
last_state = current
if time.monotonic() - start > 1.0:
return 0
duration = time.monotonic() - start
if duration == 0:
return 0
return num_cycles / duration # Hz
def read(self, num_cycles=10):
self._set_channel(red=True, green=False, blue=False, clear=False)
time.sleep(0.01)
r = self._read_frequency(num_cycles)
self._set_channel(red=False, green=True, blue=False, clear=False)
time.sleep(0.01)
g = self._read_frequency(num_cycles)
self._set_channel(red=False, green=False, blue=True, clear=False)
time.sleep(0.01)
b = self._read_frequency(num_cycles)
self._set_channel(red=False, green=False, blue=False, clear=True)
time.sleep(0.01)
c = self._read_frequency(num_cycles)
return {"r": r, "g": g, "b": b, "clear": c}
# === 使用示例 ===
if __name__ == "__main__":
sensor = TCS3200(
s0=board.D13, # D13
s1=board.D12, # D12
s2=board.D11, # D11
s3=board.D10, # D10
out_pin=board.D9 # D9
)
while True:
color = sensor.read(num_cycles=20)
print(f"R: {color['r']:.1f} Hz, G: {color['g']:.1f} Hz, B: {color['b']:.1f} Hz")
time.sleep(1)下载后实现的效果:

我要赚赏金
