物联网开发121 - Micropython ESP32 C3连接TCS34725颜色识别传感器模块(I2C通信)_esp32kongzhi颜色传感器

119 阅读3分钟

img img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

''' G R B 5 6 5 2字节= 16位 = 65536

G = 5 2^5 = 32 R = 6 2^6 = 64 b = 5 2^5 = 32

'''

创建RGB颜色计算函数

def Colour(): try: red,green,blue,colour = tcs.read(True) # 读取颜色值

    if colour != 0:  # 如果colour不等于0
        Red   = int((red / colour) * 32)  # 计算红色的值
        Green = int((green / colour) * 64)  # 计算绿色的值
        Blue  = int((blue / colour) * 32)  # 计算蓝色的值
        return Red,Green,Blue  # 返回RGB值
    else:         
        return 0,0,0
except :
    print("数据异常!")
    RuntimeError

创建显示颜色识别

def dispaly(colour): red,green,blue = colour

npp.fill((red,green,blue))  # 填充颜色
npp.write()  # 写入颜色

print("red: %.2d  green:%.2d  blue:%.2d" % (red,green,blue))
time.sleep(0.1)

初始化LED灯

def Init(): for i in range(0,24,1): npp[i]=(i*10,255,100) # 获取颜色值 npp.write() # 写入颜色 time.sleep(0.2) # 等待0.2秒

def main(): print("%#x"%(i2c.scan()[0])) # 输出29 Init() # 初始化 while True: dispaly(Colour()) # 显示颜色

if name == "main": main()


 演示效果:


![](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/5febf23a410545dd886076cb1e6de74c~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzM5MTQ5MjgwNjA=:q75.awebp?rk3s=f64ab15b&x-expires=1771933382&x-signature=Ikkf1QE1y7jq%2BOIad4%2BzwMwCZUo%3D)



**四、tcs34725颜色识别模块驱动**


tcs34725.py



from machine import I2C import time import ustruct

const = lambda x:x

_COMMAND_BIT = const(0x80) _REGISTER_ENABLE = const(0x00) _REGISTER_ATIME = const(0x01) _REGISTER_AILT = const(0x04) _REGISTER_AIHT = const(0x06) _REGISTER_ID = const(0x12) _REGISTER_APERS = const(0x0c) _REGISTER_CONTROL = const(0x0f) _REGISTER_SENSORID = const(0x12) _REGISTER_STATUS = const(0x13) _REGISTER_CDATA = const(0x14) _REGISTER_RDATA = const(0x16) _REGISTER_GDATA = const(0x18) _REGISTER_BDATA = const(0x1a) _ENABLE_AIEN = const(0x10) _ENABLE_WEN = const(0x08) _ENABLE_AEN = const(0x02) _ENABLE_PON = const(0x01)

_GAINS = (1, 4, 16, 60) _CYCLES = (0, 1, 2, 3, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60)

class TCS34725: def init(self, i2c, address=None): self.i2c = i2c self.address = address self._active = False self.integration_time(2.4) sensor_id = self.i2c.scan()[0] if sensor_id not in (0x29,0x10): raise RuntimeError("wrong sensor id 0x{:x}".format(sensor_id))

def _register8(self, register, value=None):
    register |= _COMMAND_BIT
    if value is None:
        return self.i2c.readfrom_mem(self.address, register, 1)[0]
    data = ustruct.pack('<B', value)
    self.i2c.writeto_mem(self.address, register, data)

def _register16(self, register, value=None):
    register |= _COMMAND_BIT
    if value is None:
        data = self.i2c.readfrom_mem(self.address, register, 2)
        return ustruct.unpack('<H', data)[0]
    data = ustruct.pack('<H', value)
    self.i2c.writeto_mem(self.address, register, data)

def active(self, value=None):
    if value is None:
        return self._active
    value = bool(value)
    if self._active == value:
        return
    self._active = value
    enable = self._register8(_REGISTER_ENABLE)
    if value:
        self._register8(_REGISTER_ENABLE, enable | _ENABLE_PON)
        time.sleep_ms(3)
        self._register8(_REGISTER_ENABLE,
            enable | _ENABLE_PON | _ENABLE_AEN)
    else:
        self._register8(_REGISTER_ENABLE,
            enable & ~(_ENABLE_PON | _ENABLE_AEN))

def sensor_id(self):
    return self.i2c.scan()[0]

def integration_time(self, value=None):
    if value is None:
        return self._integration_time
    value = min(614.4, max(2.4, value))
    cycles = int(value / 2.4)
    self._integration_time = cycles * 2.4
    return self._register8(_REGISTER_ATIME, 256 - cycles)

def gain(self, value):
    if value is None:
        return _GAINS[self._register8(_REGISTER_CONTROL)]
    if value not in _GAINS:
        raise ValueError("gain must be 1, 4, 16 or 60")
    return self._register8(_REGISTER_CONTROL, _GAINS.index(value))

def _valid(self):
    return bool(self._register8(_REGISTER_STATUS) & 0x01)

def read(self, raw=False):
    was_active = self.active()
    self.active(True)
    while not self._valid():
        time.sleep_ms(int(self._integration_time + 0.9))
    data = tuple(self._register16(register) for register in (
        _REGISTER_RDATA,
        _REGISTER_GDATA,
        _REGISTER_BDATA,
        _REGISTER_CDATA,
    ))
    self.active(was_active)
    if raw:
        return data
    return self._temperature_and_lux(data)

def _temperature_and_lux(self, data):
    r, g, b, c = data
    x = -0.14282 * r + 1.54924 * g + -0.95641 * b
    y = -0.32466 * r + 1.57837 * g + -0.73191 * b
    z = -0.68202 * r + 0.77073 * g +  0.56332 * b
    d = x + y + z
    n = (x / d - 0.3320) / (0.1858 - y / d)
    cct = 449.0 * n**3 + 3525.0 * n**2 + 6823.3 * n + 5520.33
    return cct, y

def threshold(self, cycles=None, min_value=None, max_value=None):
    if cycles is None and min_value is None and max_value is None:
        min_value = self._register16(_REGISTER_AILT)
        max_value = self._register16(_REGISTER_AILT)
        if self._register8(_REGISTER_ENABLE) & _ENABLE_AIEN:
            cycles = _CYCLES[self._register8(_REGISTER_APERS) & 0x0f]
        else:
            cycles = -1
        return cycles, min_value, max_value
    if min_value is not None:
        self._register16(_REGISTER_AILT, min_value)
    if max_value is not None:
        self._register16(_REGISTER_AIHT, max_value)
    if cycles is not None:
        enable = self._register8(_REGISTER_ENABLE)
        if cycles == -1:
            self._register8(_REGISTER_ENABLE, enable & ~(_ENABLE_AIEN))
        else:
            self._register8(_REGISTER_ENABLE, enable | _ENABLE_AIEN)
            if cycles not in _CYCLES:
                raise ValueError("invalid persistence cycles")
            self._register8(_REGISTER_APERS, _CYCLES.index(cycles))

def interrupt(self, value=None):
    if value is None:
        return bool(self._register8(_REGISTER_STATUS) & _ENABLE_AIEN)
    if value:
        raise ValueError("interrupt can only be cleared")
    self.i2c.writeto(self.address, b'\xe6')

img img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取