基于STM32的TCS34725颜色传感器驱动程序设计

张开发
2026/5/3 23:32:26 15 分钟阅读
基于STM32的TCS34725颜色传感器驱动程序设计
若该文为原创文章转载请注明原文出处。1. 引言TCS34725是一款低成本、高灵敏度的数字颜色传感器能够检测红、绿、蓝RGB以及环境光强度Clear。它内置红外阻挡滤波器可精确测量可见光光谱广泛应用于颜色识别、环境光自适应调节、工业检测等领域。TCS34725采用I2C接口通信支持可编程增益和积分时间适用于嵌入式系统。本文基于STM32F103C8T6平台使用标准外设库提供一套完整的TCS34725驱动程序包含I2C底层模拟、寄存器配置、颜色数据读取及RGB到HSL颜色空间转换功能。2. 硬件连接TCS34725模块通常有四个引脚VCC、GND、SCL、SDA。与STM32的连接如下TCS34725STM32F103C8T6VCC3.3VGNDGNDSCLPB10SDAPB11注意模块工作电压为3.3V请勿接入5V。若模块自带电平转换也可接5V但推荐3.3V。I2C总线上需接上拉电阻典型4.7kΩ大多数模块已集成。3. 驱动代码解析驱动代码分为三个层次I2C底层模拟使用GPIO模拟I2C时序实现起始、停止、发送字节、读取字节、应答等基本操作。TCS34725寄存器访问封装写寄存器和读寄存器函数利用I2C底层与传感器通信。高级控制函数提供初始化、使能、设置积分时间/增益、读取原始RGB数据等功能。颜色空间转换将RGB分量归一化后转换为HSL色相、饱和度、亮度模型。3.1 I2C底层模拟由于未使用硬件I2C采用GPIO模拟方式便于移植。关键宏定义如下#define IIC_SDA_PORT_TCS34725 GPIOB #define IIC_SDA_PIN_TCS34725 GPIO_Pin_11 #define IIC_SCL_PORT_TCS34725 GPIOB #define IIC_SCL_PIN_TCS34725 GPIO_Pin_10时序函数实现要点起始信号SCL高电平时SDA由高变低。停止信号SCL高电平时SDA由低变高。发送字节SCL低电平期间准备数据SCL高电平期间数据稳定高位在前。读取字节SCL低电平期间释放SDASCL高电平期间读取SDA状态。应答检测主机释放SDA后从机拉低SDA表示应答。驱动中提供了TCS34725_I2C_Start、TCS34725_I2C_Stop、TCS34725_I2C_Send_Byte、TCS34725_I2C_Read_Byte、TCS34725_I2C_Wait_ACK等函数。所有延时使用delay_s函数用户需实现微秒级延时实际代码中参数单位为10μs例如delay_s(40)表示4μs。用户需根据系统时钟调整延时参数。3.2 TCS34725寄存器访问TCS34725的命令字节格式最高位为命令位1第6位为自动递增位可选。驱动程序定义如下#define TCS34725_COMMAND_BIT 0x80 #define TCS34725_AUTO_INCREMENT 0x20TCS34725_Write向指定子地址写入数据。先构造命令字节子地址|命令位然后连续写入数据。TCS34725_Read从指定子地址读取数据。先发送命令字节不含自动递增然后重新发起读操作。常用寄存器地址代码中已定义寄存器名地址说明ENABLE0x00使能寄存器ATIME0x01积分时间控制CONTROL0x0F增益控制ID0x12设备ID应为0x44或0x4DCDATAL/CDATAH0x14环境光数据16位RDATAL/RDATAH0x16红色数据GDATAL/GDATAH0x18绿色数据BDATAL/BDATAH0x1A蓝色数据STATUS0x13状态寄存器3.3 初始化与配置TCS34725_Init函数执行以下操作调用TCS34725_I2C_Init初始化GPIO。读取设备ID验证是否为0x4D或0x44。设置积分时间为50msTCS34725_INTEGRATIONTIME_50MS增益为1倍TCS34725_GAIN_1X。使能传感器先写入PON位再写入PON|AEN位启动ADC。积分时间和增益可根据环境光调节代码中已预定义可选值// 积分时间2.4ms ~ 614.4ms #define TCS34725_INTEGRATIONTIME_2_4MS 0xFF #define TCS34725_INTEGRATIONTIME_50MS 0xEB #define TCS34725_INTEGRATIONTIME_100MS 0xD5 #define TCS34725_INTEGRATIONTIME_200MS 0xB6 #define TCS34725_INTEGRATIONTIME_400MS 0x00 // 增益1x, 4x, 16x, 60x #define TCS34725_GAIN_1X 0x00 #define TCS34725_GAIN_4X 0x01 #define TCS34725_GAIN_16X 0x02 #define TCS34725_GAIN_60X 0x033.4 读取颜色数据TCS34725_GetRawData函数首先读取状态寄存器检查AVALID位转换完成标志。若数据有效则分别调用TCS34725_GetChannelData读取CClear、R、G、B四个通道的16位数据存入COLOR_RGBC结构体。3.5 颜色空间转换传感器输出的原始RGB值受环境光强度影响直接比较颜色不准确。通常需要将RGB值归一化即除以Clear通道再转换为HSL空间以便进行颜色识别。驱动中的RGBtoHSL函数实现此转换输入COLOR_RGBC结构体包含r、g、b、c原始数据。输出COLOR_HSL结构体hue色相0~360saturation饱和度0~100lightness亮度0~100。转换步骤计算归一化RGBr_norm R * 100 / C同理g、b。找出最大值、最小值、差值。计算亮度L (max min) / 2。若maxmin则饱和度为0色调未定义。否则根据最大值所在通道计算色调并根据亮度计算饱和度。4. 使用示例以下示例演示了如何初始化传感器每隔500ms读取一次颜色数据并输出RGB原始值及转换后的HSL值。4.1 主函数代码#include stm32f10x.h #include tcs34725.h #include stdio.h // 用户需实现微秒延时函数基于SysTick或循环 void delay_s(u32 us) { // 粗略延时根据主频调整此处假设72MHz循环约10us/次 while (us--) { for (volatile int i 0; i 8; i); } } int main(void) { SystemInit(); if (TCS34725_Init()) { // 初始化成功 } else { // 检查硬件连接 while (1); } COLOR_RGBC rgb; COLOR_HSL hsl; while (1) { if (TCS34725_GetRawData(rgb)) { // 获取原始数据成功 RGBtoHSL(rgb, hsl); // 模拟打印实际可通过串口输出 // printf(R%d G%d B%d C%d\n, rgb.r, rgb.g, rgb.b, rgb.c); // printf(H%d S%d L%d\n, hsl.h, hsl.s, hsl.l); } delay_s(50000); // 500ms延时粗略 } }4.2 输出数据应用颜色识别通过色相H值判断颜色范围红色约0~30°绿色约90~150°蓝色约210~270°。亮度检测亮度L可判断环境明暗。饱和度反映颜色纯度用于区分鲜艳与灰暗。5. 注意事项与调试延时调整代码中delay_s参数单位为10微秒实际值需根据系统时钟校准。若使用SysTick精确延时请替换实现。I2C速率模拟I2C的时钟频率由延时决定当前代码约为100kHz标准模式。若需要更高速度可减小延时值。上拉电阻确保SDA和SCL线有外部上拉电阻4.7kΩ否则通信可能失败。积分时间与增益强光下使用较短积分时间和较低增益弱光下反之。读取数据前需等待至少一次积分时间如50ms否则AVALID可能为0。设备ID不同批次的TCS34725 ID可能为0x44或0x4D驱动已兼容两者。电源去耦在模块VCC和GND之间加0.1μF电容减少噪声。6. 总结本文详细介绍了基于STM32标准外设库的TCS34725颜色传感器驱动程序涵盖模拟I2C实现、寄存器配置、数据读取及HSL颜色空间转换。代码结构清晰易于移植到其他MCU平台。通过该驱动开发者可以快速实现颜色识别、环境光检测等功能为智能照明、色选设备等应用提供基础。7、附程序tcs34725.h#ifndef __TCS34725_H #define __TCS34725_H #ifdef __cplusplus extern C { #endif /* 包含必要的头文件 */ #include stdint.h /* 使用标准整数类型 */ #include sys.h /* 基本数据类型定义 */ typedef uint8_t u8; typedef uint16_t u16; typedef uint32_t u32; /* 外部延时函数声明需由用户实现 */ extern void delay_s(u32 i); /******************************************************************************/ /* TCS34725 寄存器地址及常量定义 */ #define TCS34725_ADDRESS (0x29) #define TCS34725_COMMAND_BIT (0x80) #define TCS34725_ENABLE (0x00) #define TCS34725_ENABLE_AIEN (0x10) /* RGBC Interrupt Enable */ #define TCS34725_ENABLE_WEN (0x08) /* Wait enable - Writing 1 activates the wait timer */ #define TCS34725_ENABLE_AEN (0x02) /* RGBC Enable - Writing 1 actives the ADC, 0 disables it */ #define TCS34725_ENABLE_PON (0x01) /* Power on - Writing 1 activates the internal oscillator, 0 disables it */ #define TCS34725_ATIME (0x01) /* Integration time */ #define TCS34725_WTIME (0x03) /* Wait time (if TCS34725_ENABLE_WEN is asserted) */ #define TCS34725_WTIME_2_4MS (0xFF) /* WLONG0 2.4ms WLONG1 0.029s */ #define TCS34725_WTIME_204MS (0xAB) /* WLONG0 204ms WLONG1 2.45s */ #define TCS34725_WTIME_614MS (0x00) /* WLONG0 614ms WLONG1 7.4s */ #define TCS34725_AILTL (0x04) /* Clear channel lower interrupt threshold */ #define TCS34725_AILTH (0x05) #define TCS34725_AIHTL (0x06) /* Clear channel upper interrupt threshold */ #define TCS34725_AIHTH (0x07) #define TCS34725_PERS (0x0C) /* Persistence register - basic SW filtering mechanism for interrupts */ #define TCS34725_PERS_NONE (0b0000) /* Every RGBC cycle generates an interrupt */ #define TCS34725_PERS_1_CYCLE (0b0001) /* 1 clean channel value outside threshold range generates an interrupt */ #define TCS34725_PERS_2_CYCLE (0b0010) /* 2 clean channel values outside threshold range generates an interrupt */ #define TCS34725_PERS_3_CYCLE (0b0011) /* 3 clean channel values outside threshold range generates an interrupt */ #define TCS34725_PERS_5_CYCLE (0b0100) /* 5 clean channel values outside threshold range generates an interrupt */ #define TCS34725_PERS_10_CYCLE (0b0101) /* 10 clean channel values outside threshold range generates an interrupt */ #define TCS34725_PERS_15_CYCLE (0b0110) /* 15 clean channel values outside threshold range generates an interrupt */ #define TCS34725_PERS_20_CYCLE (0b0111) /* 20 clean channel values outside threshold range generates an interrupt */ #define TCS34725_PERS_25_CYCLE (0b1000) /* 25 clean channel values outside threshold range generates an interrupt */ #define TCS34725_PERS_30_CYCLE (0b1001) /* 30 clean channel values outside threshold range generates an interrupt */ #define TCS34725_PERS_35_CYCLE (0b1010) /* 35 clean channel values outside threshold range generates an interrupt */ #define TCS34725_PERS_40_CYCLE (0b1011) /* 40 clean channel values outside threshold range generates an interrupt */ #define TCS34725_PERS_45_CYCLE (0b1100) /* 45 clean channel values outside threshold range generates an interrupt */ #define TCS34725_PERS_50_CYCLE (0b1101) /* 50 clean channel values outside threshold range generates an interrupt */ #define TCS34725_PERS_55_CYCLE (0b1110) /* 55 clean channel values outside threshold range generates an interrupt */ #define TCS34725_PERS_60_CYCLE (0b1111) /* 60 clean channel values outside threshold range generates an interrupt */ #define TCS34725_CONFIG (0x0D) #define TCS34725_CONFIG_WLONG (0x02) /* Choose between short and long (12x) wait times via TCS34725_WTIME */ #define TCS34725_CONTROL (0x0F) /* Set the gain level for the sensor */ #define TCS34725_ID (0x12) /* 0x44 TCS34721/TCS34725, 0x4D TCS34723/TCS34727 */ #define TCS34725_STATUS (0x13) #define TCS34725_STATUS_AINT (0x10) /* RGBC Clean channel interrupt */ #define TCS34725_STATUS_AVALID (0x01) /* Indicates that the RGBC channels have completed an integration cycle */ #define TCS34725_CDATAL (0x14) /* Clear channel data */ #define TCS34725_CDATAH (0x15) #define TCS34725_RDATAL (0x16) /* Red channel data */ #define TCS34725_RDATAH (0x17) #define TCS34725_GDATAL (0x18) /* Green channel data */ #define TCS34725_GDATAH (0x19) #define TCS34725_BDATAL (0x1A) /* Blue channel data */ #define TCS34725_BDATAH (0x1B) /* 预定义的积分时间值 */ #define TCS34725_INTEGRATIONTIME_2_4MS 0xFF /** 2.4ms - 1 cycle - Max Count: 1024 */ #define TCS34725_INTEGRATIONTIME_24MS 0xF6 /** 24ms - 10 cycles - Max Count: 10240 */ #define TCS34725_INTEGRATIONTIME_50MS 0xEB /** 50ms - 20 cycles - Max Count: 20480 */ #define TCS34725_INTEGRATIONTIME_101MS 0xD5 /** 101ms - 42 cycles - Max Count: 43008 */ #define TCS34725_INTEGRATIONTIME_154MS 0xC0 /** 154ms - 64 cycles - Max Count: 65535 */ #define TCS34725_INTEGRATIONTIME_240MS 0x9C /** 240ms - 100 cycles - Max Count: 65535 */ #define TCS34725_INTEGRATIONTIME_700MS 0x00 /** 700ms - 256 cycles - Max Count: 65535 */ /* 预定义的增益值 */ #define TCS34725_GAIN_1X 0x00 /** No gain */ #define TCS34725_GAIN_4X 0x01 /** 4x gain */ #define TCS34725_GAIN_16X 0x02 /** 16x gain */ #define TCS34725_GAIN_60X 0x03 /** 60x gain */ /******************************************************************************/ /* 辅助宏 */ #define max3v(v1, v2, v3) ((v1)(v2)? ((v2)(v3)?(v3):(v2)):((v1)(v3)?(v3):(v1))) #define min3v(v1, v2, v3) ((v1)(v2)? ((v2)(v3)?(v3):(v2)):((v1)(v3)?(v3):(v1))) /******************************************************************************/ /* 数据结构定义 */ typedef struct{ unsigned short c; //[0-65536] unsigned short r; unsigned short g; unsigned short b; } COLOR_RGBC; // RGBC typedef struct{ unsigned short h; //[0,360] unsigned char s; //[0,100] unsigned char l; //[0,100] } COLOR_HSL; // HSL /* 外部全局变量声明若需要外部访问 */ extern COLOR_RGBC rgb; extern COLOR_HSL hsl; /******************************************************************************/ /* I2C 底层函数声明 */ void TCS34725_I2C_Init(void); void TCS34725_I2C_Start(void); void TCS34725_I2C_Stop(void); u8 TCS34725_I2C_Wait_ACK(void); void TCS34725_I2C_ACK(void); void TCS34725_I2C_NACK(void); void TCS34725_I2C_Send_Byte(u8 byte); u8 TCS34725_I2C_Read_Byte(u8 ack); void TCS34725_I2C_Write(u8 slaveAddress, u8* dataBuffer, u8 bytesNumber, u8 stopBit); void TCS34725_I2C_Read(u8 slaveAddress, u8* dataBuffer, u8 bytesNumber, u8 stopBit); /******************************************************************************/ /* TCS34725 寄存器访问函数声明 */ void TCS34725_Write(u8 subAddr, u8* dataBuffer, u8 bytesNumber); void TCS34725_Read(u8 subAddr, u8* dataBuffer, u8 bytesNumber); /******************************************************************************/ /* TCS34725 高级控制函数声明 */ void TCS34725_SetIntegrationTime(u8 time); void TCS34725_SetGain(u8 gain); void TCS34725_Enable(void); void TCS34725_Disable(void); u8 TCS34725_Init(void); u16 TCS34725_GetChannelData(u8 reg); u8 TCS34725_GetRawData(COLOR_RGBC *rgbc); /******************************************************************************/ /* 颜色转换函数声明 */ void RGBtoHSL(COLOR_RGBC *Rgb, COLOR_HSL *Hsl); #ifdef __cplusplus } #endif #endif /* __TCS34725_H */tcs34725.c/** * file tcs34725.c * brief TCS34725 颜色传感器驱动程序 */ #include tcs34725.h /******************************************************************************/ /* 本地延时函数用户需实现 */ extern void delay_s(u32 i); #define IIC_SDA_PORT_TCS34725 GPIOB #define IIC_SDA_CLK_TCS34725 (RCC_APB2Periph_GPIOB) #define IIC_SDA_PIN_TCS34725 GPIO_Pin_11 #define IIC_SCL_PORT_TCS34725 GPIOB #define IIC_SCL_CLK_TCS34725 (RCC_APB2Periph_GPIOB) #define IIC_SCL_PIN_TCS34725 GPIO_Pin_10 /******************************************************************************/ /* GPIO 操作宏需根据实际硬件修改 */ #define TCS_SDA_READ ((IIC_SDA_PORT_TCS34725-IDR IIC_SDA_PIN_TCS34725)) #define TCS_SCL_H GPIO_SetBits(IIC_SCL_PORT_TCS34725,IIC_SCL_PIN_TCS34725) #define TCS_SCL_L GPIO_ResetBits(IIC_SCL_PORT_TCS34725,IIC_SCL_PIN_TCS34725) #define TCS_SDA_H GPIO_SetBits(IIC_SDA_PORT_TCS34725,IIC_SDA_PIN_TCS34725) #define TCS_SDA_L GPIO_ResetBits(IIC_SDA_PORT_TCS34725,IIC_SDA_PIN_TCS34725) /** * brief SDA输入方向配置 * param None * retval None */ void TCS_SDA_IN(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(IIC_SDA_CLK_TCS34725, ENABLE); GPIO_InitStructure.GPIO_PinIIC_SDA_PIN_TCS34725; GPIO_InitStructure.GPIO_ModeGPIO_Mode_IPU; GPIO_Init(IIC_SDA_PORT_TCS34725,GPIO_InitStructure); } /** * brief SDA输出方向配置 * param None * retval None */ void TCS_SDA_OUT(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(IIC_SDA_CLK_TCS34725, ENABLE); GPIO_InitStructure.GPIO_PinIIC_SDA_PIN_TCS34725; GPIO_InitStructure.GPIO_SpeedGPIO_Speed_50MHz; GPIO_InitStructure.GPIO_ModeGPIO_Mode_Out_OD; GPIO_Init(IIC_SDA_PORT_TCS34725,GPIO_InitStructure); } /******************************************************************************/ /* I2C 底层函数实现 */ void TCS34725_I2C_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(IIC_SDA_CLK_TCS34725, ENABLE); RCC_APB2PeriphClockCmd(IIC_SCL_CLK_TCS34725, ENABLE); GPIO_InitStructure.GPIO_Pin IIC_SDA_PIN_TCS34725; // PB10/PB11 I2C GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP; // 通用推挽输出 GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; GPIO_Init(IIC_SDA_PORT_TCS34725, GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin IIC_SCL_PIN_TCS34725; // PB10/PB11 I2C GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP; // 通用推挽输出 GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; GPIO_Init(IIC_SCL_PORT_TCS34725, GPIO_InitStructure); GPIO_SetBits(IIC_SDA_PORT_TCS34725, IIC_SDA_PIN_TCS34725); // 初始高电平 GPIO_SetBits(IIC_SCL_PORT_TCS34725, IIC_SCL_PIN_TCS34725); // 初始高电平 } void TCS34725_I2C_Start(void) { TCS_SDA_OUT(); TCS_SDA_H; TCS_SCL_H; delay_s(40); // 4us TCS_SDA_L; delay_s(40); TCS_SCL_L; } void TCS34725_I2C_Stop(void) { TCS_SDA_OUT(); TCS_SCL_L; TCS_SDA_L; delay_s(40); TCS_SCL_H; TCS_SDA_H; delay_s(40); } u8 TCS34725_I2C_Wait_ACK(void) { u32 t 0; TCS_SDA_IN(); // SDA 设为输入 TCS_SDA_H; delay_s(10); // 1us TCS_SCL_H; delay_s(10); while (TCS_SDA_READ) { t; if (t 250) { TCS34725_I2C_Stop(); return 1; } } TCS_SCL_L; return 0; } void TCS34725_I2C_ACK(void) { TCS_SCL_L; TCS_SDA_OUT(); TCS_SDA_L; delay_s(20); // 2us TCS_SCL_H; delay_s(20); TCS_SCL_L; } void TCS34725_I2C_NACK(void) { TCS_SCL_L; TCS_SDA_OUT(); TCS_SDA_H; delay_s(20); TCS_SCL_H; delay_s(20); TCS_SCL_L; } void TCS34725_I2C_Send_Byte(u8 byte) { u8 i; TCS_SDA_OUT(); TCS_SCL_L; for (i 0; i 8; i) { if ((byte 0x80) 7) TCS_SDA_H; else TCS_SDA_L; byte 1; delay_s(20); TCS_SCL_H; delay_s(20); TCS_SCL_L; delay_s(20); } } u8 TCS34725_I2C_Read_Byte(u8 ack) { u8 i, receive 0; TCS_SDA_IN(); for (i 0; i 8; i) { TCS_SCL_L; delay_s(20); TCS_SCL_H; receive 1; if (TCS_SDA_READ) receive; delay_s(10); } if (!ack) TCS34725_I2C_NACK(); else TCS34725_I2C_ACK(); return receive; } void TCS34725_I2C_Write(u8 slaveAddress, u8 *dataBuffer, u8 bytesNumber, u8 stopBit) { u8 i 0; TCS34725_I2C_Start(); TCS34725_I2C_Send_Byte((slaveAddress 1) | 0x00); // 写命令 TCS34725_I2C_Wait_ACK(); for (i 0; i bytesNumber; i) { TCS34725_I2C_Send_Byte(*(dataBuffer i)); TCS34725_I2C_Wait_ACK(); } if (stopBit) TCS34725_I2C_Stop(); } void TCS34725_I2C_Read(u8 slaveAddress, u8 *dataBuffer, u8 bytesNumber, u8 stopBit) { u8 i 0; TCS34725_I2C_Start(); TCS34725_I2C_Send_Byte((slaveAddress 1) | 0x01); // 读命令 TCS34725_I2C_Wait_ACK(); for (i 0; i bytesNumber; i) { if (i bytesNumber - 1) *(dataBuffer i) TCS34725_I2C_Read_Byte(0); // 最后一字节发送 NACK else *(dataBuffer i) TCS34725_I2C_Read_Byte(1); } if (stopBit) TCS34725_I2C_Stop(); } /******************************************************************************/ /* TCS34725 寄存器访问函数 */ void TCS34725_Write(u8 subAddr, u8 *dataBuffer, u8 bytesNumber) { u8 sendBuffer[10] {0}; u8 byte 0; sendBuffer[0] subAddr | TCS34725_COMMAND_BIT; for (byte 1; byte bytesNumber; byte) sendBuffer[byte] dataBuffer[byte - 1]; TCS34725_I2C_Write(TCS34725_ADDRESS, sendBuffer, bytesNumber 1, 1); } void TCS34725_Read(u8 subAddr, u8 *dataBuffer, u8 bytesNumber) { subAddr | TCS34725_COMMAND_BIT; TCS34725_I2C_Write(TCS34725_ADDRESS, (u8 *)subAddr, 1, 0); TCS34725_I2C_Read(TCS34725_ADDRESS, dataBuffer, bytesNumber, 1); } /******************************************************************************/ /* TCS34725 高级控制函数 */ void TCS34725_SetIntegrationTime(u8 time) { TCS34725_Write(TCS34725_ATIME, time, 1); } void TCS34725_SetGain(u8 gain) { TCS34725_Write(TCS34725_CONTROL, gain, 1); } void TCS34725_Enable(void) { u8 cmd TCS34725_ENABLE_PON; TCS34725_Write(TCS34725_ENABLE, cmd, 1); cmd TCS34725_ENABLE_PON | TCS34725_ENABLE_AEN; TCS34725_Write(TCS34725_ENABLE, cmd, 1); // 可选延时delay_s(600000); // 3ms } void TCS34725_Disable(void) { u8 cmd 0; TCS34725_Read(TCS34725_ENABLE, cmd, 1); cmd ~(TCS34725_ENABLE_PON | TCS34725_ENABLE_AEN); TCS34725_Write(TCS34725_ENABLE, cmd, 1); } u8 TCS34725_Init(void) { u8 id 0; TCS34725_I2C_Init(); TCS34725_Read(TCS34725_ID, id, 1); // 读取 ID if (id 0x4D || id 0x44) { TCS34725_SetIntegrationTime(TCS34725_INTEGRATIONTIME_50MS); TCS34725_SetGain(TCS34725_GAIN_1X); TCS34725_Enable(); return 1; } return 0; } u16 TCS34725_GetChannelData(u8 reg) { u8 tmp[2] {0}; u16 data; TCS34725_Read(reg, tmp, 2); data (tmp[1] 8) | tmp[0]; return data; } u8 TCS34725_GetRawData(COLOR_RGBC *rgbc) { u8 status TCS34725_STATUS_AVALID; TCS34725_Read(TCS34725_STATUS, status, 1); if (status TCS34725_STATUS_AVALID) { rgbc-c TCS34725_GetChannelData(TCS34725_CDATAL); rgbc-r TCS34725_GetChannelData(TCS34725_RDATAL); rgbc-g TCS34725_GetChannelData(TCS34725_GDATAL); rgbc-b TCS34725_GetChannelData(TCS34725_BDATAL); return 1; } return 0; } /******************************************************************************/ /* 颜色空间转换函数 */ void RGBtoHSL(COLOR_RGBC *Rgb, COLOR_HSL *Hsl) { u8 maxVal, minVal, difVal; u8 r Rgb-r * 100 / Rgb-c; u8 g Rgb-g * 100 / Rgb-c; u8 b Rgb-b * 100 / Rgb-c; maxVal max3v(r, g, b); minVal min3v(r, g, b); difVal maxVal - minVal; // 亮度 Hsl-l (maxVal minVal) / 2; if (maxVal minVal) { Hsl-h 0; Hsl-s 0; } else { // 色调 if (maxVal r) { if (g b) Hsl-h 60 * (g - b) / difVal; else Hsl-h 60 * (g - b) / difVal 360; } else if (maxVal g) { Hsl-h 60 * (b - r) / difVal 120; } else { // maxVal b Hsl-h 60 * (r - g) / difVal 240; } // 饱和度 if (Hsl-l 50) Hsl-s difVal * 100 / (maxVal minVal); else Hsl-s difVal * 100 / (200 - (maxVal minVal)); } } /******************************************************************************/ /* 全局变量定义 */ COLOR_RGBC rgb; COLOR_HSL hsl;如有侵权或需要完整代码请及时联系博主。

更多文章