这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » Let'sDo2025第3期任务-拾色播放器-任务一

共1条 1/1 1 跳转至

Let'sDo2025第3期任务-拾色播放器-任务一

高工
2025-12-15 18:52:33     打赏

【目的】

实现颜色传感器驱动,按键获取当前颜色数据并可以通过串口或屏幕进行打印;

【平台】

CircuitPython

【传感器介绍】

TCS3200颜色传感器

image.png

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)

下载后实现的效果:

image.png






关键词: 拾色     LetsDo2025    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]