你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32读取TCS34725源代码,RGB转HSL代码,已通过实际测试

[复制链接]
STMCU小助手 发布时间:2022-6-20 22:15
STM32F103C8T6读取颜色识别模块,并把读取到的原始数据转换为HSL格式。

/**********************************************************************************/

20201023更新

TCS34725只接GND、VCC、SCL、SDA四个引脚,

STM32F103C8T6的引脚接PB10-SCL,PB11-SDA。PA3是LED指示灯,

1、修改SCL和SDA引脚在文件 tcs34725.c 中,

2、修改读取颜色频率,直接在main函数的主循环中修改时间,

/**********************************************************************************/

KFF(@%Y$GP95AMTJR4Y%T.png


%9PI}$WL7KPOW7_]_I5F@`O.png

20200313105122364.png
NA[ZBZ@ZMCPR%$R7Y)ZWW~2.png


20200313111331575.png


读取TCS34725的源代码很多,也很简单,但只是读取原始数据,也不知道怎么转换,官方手册也没说清楚,一般RGB的数据它偏偏是RGBC,到现在我也没搞清楚这个“C”代表啥意思。网上能搜到的RGB转HSL都是以RGB888的格式为准,转换之前除以255归一化,得到0-1之间的小数,然后转换,年前这个程序我调试了很久,今天突然搞明白了,把TCS的原始数据RGB除以C得到0-1之间的小数,这个C就相当于上面的255。上代码:


  1. /******************************************************************************/
  2. #define TCS34725_ADDRESS          (0x29)

  3. #define TCS34725_COMMAND_BIT      (0x80)

  4. #define TCS34725_ENABLE           (0x00)
  5. #define TCS34725_ENABLE_AIEN      (0x10)    /* RGBC Interrupt Enable */
  6. #define TCS34725_ENABLE_WEN       (0x08)    /* Wait enable - Writing 1 activates the wait timer */
  7. #define TCS34725_ENABLE_AEN       (0x02)    /* RGBC Enable - Writing 1 actives the ADC, 0 disables it */
  8. #define TCS34725_ENABLE_PON       (0x01)    /* Power on - Writing 1 activates the internal oscillator, 0 disables it */
  9. #define TCS34725_ATIME            (0x01)    /* Integration time */
  10. #define TCS34725_WTIME            (0x03)    /* Wait time (if TCS34725_ENABLE_WEN is asserted) */
  11. #define TCS34725_WTIME_2_4MS      (0xFF)    /* WLONG0 = 2.4ms   WLONG1 = 0.029s */
  12. #define TCS34725_WTIME_204MS      (0xAB)    /* WLONG0 = 204ms   WLONG1 = 2.45s  */
  13. #define TCS34725_WTIME_614MS      (0x00)    /* WLONG0 = 614ms   WLONG1 = 7.4s   */
  14. #define TCS34725_AILTL            (0x04)    /* Clear channel lower interrupt threshold */
  15. #define TCS34725_AILTH            (0x05)
  16. #define TCS34725_AIHTL            (0x06)    /* Clear channel upper interrupt threshold */
  17. #define TCS34725_AIHTH            (0x07)
  18. #define TCS34725_PERS             (0x0C)    /* Persistence register - basic SW filtering mechanism for interrupts */
  19. #define TCS34725_PERS_NONE        (0b0000)  /* Every RGBC cycle generates an interrupt                                */
  20. #define TCS34725_PERS_1_CYCLE     (0b0001)  /* 1 clean channel value outside threshold range generates an interrupt   */
  21. #define TCS34725_PERS_2_CYCLE     (0b0010)  /* 2 clean channel values outside threshold range generates an interrupt  */
  22. #define TCS34725_PERS_3_CYCLE     (0b0011)  /* 3 clean channel values outside threshold range generates an interrupt  */
  23. #define TCS34725_PERS_5_CYCLE     (0b0100)  /* 5 clean channel values outside threshold range generates an interrupt  */
  24. #define TCS34725_PERS_10_CYCLE    (0b0101)  /* 10 clean channel values outside threshold range generates an interrupt */
  25. #define TCS34725_PERS_15_CYCLE    (0b0110)  /* 15 clean channel values outside threshold range generates an interrupt */
  26. #define TCS34725_PERS_20_CYCLE    (0b0111)  /* 20 clean channel values outside threshold range generates an interrupt */
  27. #define TCS34725_PERS_25_CYCLE    (0b1000)  /* 25 clean channel values outside threshold range generates an interrupt */
  28. #define TCS34725_PERS_30_CYCLE    (0b1001)  /* 30 clean channel values outside threshold range generates an interrupt */
  29. #define TCS34725_PERS_35_CYCLE    (0b1010)  /* 35 clean channel values outside threshold range generates an interrupt */
  30. #define TCS34725_PERS_40_CYCLE    (0b1011)  /* 40 clean channel values outside threshold range generates an interrupt */
  31. #define TCS34725_PERS_45_CYCLE    (0b1100)  /* 45 clean channel values outside threshold range generates an interrupt */
  32. #define TCS34725_PERS_50_CYCLE    (0b1101)  /* 50 clean channel values outside threshold range generates an interrupt */
  33. #define TCS34725_PERS_55_CYCLE    (0b1110)  /* 55 clean channel values outside threshold range generates an interrupt */
  34. #define TCS34725_PERS_60_CYCLE    (0b1111)  /* 60 clean channel values outside threshold range generates an interrupt */
  35. #define TCS34725_CONFIG           (0x0D)
  36. #define TCS34725_CONFIG_WLONG     (0x02)    /* Choose between short and long (12x) wait times via TCS34725_WTIME */
  37. #define TCS34725_CONTROL          (0x0F)    /* Set the gain level for the sensor */
  38. #define TCS34725_ID               (0x12)    /* 0x44 = TCS34721/TCS34725, 0x4D = TCS34723/TCS34727 */
  39. #define TCS34725_STATUS           (0x13)
  40. #define TCS34725_STATUS_AINT      (0x10)    /* RGBC Clean channel interrupt */
  41. #define TCS34725_STATUS_AVALID    (0x01)    /* Indicates that the RGBC channels have completed an integration cycle */
  42. #define TCS34725_CDATAL           (0x14)    /* Clear channel data */
  43. #define TCS34725_CDATAH           (0x15)
  44. #define TCS34725_RDATAL           (0x16)    /* Red channel data */
  45. #define TCS34725_RDATAH           (0x17)
  46. #define TCS34725_GDATAL           (0x18)    /* Green channel data */
  47. #define TCS34725_GDATAH           (0x19)
  48. #define TCS34725_BDATAL           (0x1A)    /* Blue channel data */
  49. #define TCS34725_BDATAH           (0x1B)

  50. #define TCS34725_INTEGRATIONTIME_2_4MS   0xFF   /**<  2.4ms - 1 cycle    - Max Count: 1024  */
  51. #define TCS34725_INTEGRATIONTIME_24MS    0xF6   /**<  24ms  - 10 cycles  - Max Count: 10240 */
  52. #define TCS34725_INTEGRATIONTIME_50MS    0xEB   /**<  50ms  - 20 cycles  - Max Count: 20480 */
  53. #define TCS34725_INTEGRATIONTIME_101MS   0xD5   /**<  101ms - 42 cycles  - Max Count: 43008 */
  54. #define TCS34725_INTEGRATIONTIME_154MS   0xC0   /**<  154ms - 64 cycles  - Max Count: 65535 */
  55. #define TCS34725_INTEGRATIONTIME_240MS   0x9C   /**<  240ms - 100 cycles - Max Count: 65535 */
  56. #define TCS34725_INTEGRATIONTIME_700MS   0x00   /**<  700ms - 256 cycles - Max Count: 65535 */

  57. #define TCS34725_GAIN_1X                 0x00   /**<  No gain  */
  58. #define TCS34725_GAIN_4X                 0x01   /**<  4x gain  */
  59. #define TCS34725_GAIN_16X                0x02   /**<  16x gain */
  60. #define TCS34725_GAIN_60X                0x03   /**<  60x gain */
  61. /******************************************************************************/
  62. #define TCS_SDA_IN()  {GPIOB->CRH&=0xFFFF0FFF;GPIOB->CRH|=8<<12;}
  63. #define TCS_SDA_OUT() {GPIOB->CRH&=0xFFFF0FFF;GPIOB->CRH|=3<<12;}
  64. #define TCS_SDA_READ   GPIOB->IDR&(1<<11)

  65. #define TCS_SCL_H     GPIO_SetBits(GPIOB,GPIO_Pin_10)
  66. #define TCS_SCL_L     GPIO_ResetBits(GPIOB,GPIO_Pin_10)
  67. #define TCS_SDA_H     GPIO_SetBits(GPIOB,GPIO_Pin_11)
  68. #define TCS_SDA_L     GPIO_ResetBits(GPIOB,GPIO_Pin_11)
  69. /******************************************************************************/
  70. #define max3v(v1, v2, v3)   ((v1)<(v2)? ((v2)<(v3)?(v3):(v2)):((v1)<(v3)?(v3):(v1)))
  71. #define min3v(v1, v2, v3)   ((v1)>(v2)? ((v2)>(v3)?(v3):(v2)):((v1)>(v3)?(v3):(v1)))

  72. typedef struct{
  73.         unsigned short  c;      //[0-65536]
  74.         unsigned short  r;
  75.         unsigned short  g;
  76.         unsigned short  b;
  77. }COLOR_RGBC;//RGBC

  78. typedef struct{
  79.         unsigned short h;       //[0,360]
  80.         unsigned char  s;       //[0,100]
  81.         unsigned char  l;       //[0,100]
  82. }COLOR_HSL;//HSL

  83. COLOR_RGBC rgb;
  84. COLOR_HSL  hsl;
  85. /******************************************************************************/
  86. void delay_s(u32 i)
  87. {
  88.         while(i--);
  89. }
  90. /******************************************************************************/
  91. void TCS34725_I2C_Init()
  92. {
  93.         GPIO_InitTypeDef GPIO_InitStructure;
  94.         
  95.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11;//PB10/PB10=外接I2C
  96.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//通用推挽输出        
  97.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度
  98.         GPIO_Init(GPIOB, &GPIO_InitStructure);//对选中管脚初始化
  99.         GPIO_SetBits(GPIOB,GPIO_Pin_10|GPIO_Pin_11);   //高电平
  100. }
  101. /*********************************************/
  102. void TCS34725_I2C_Start()
  103. {
  104.         TCS_SDA_OUT();
  105.         TCS_SDA_H;
  106.         TCS_SCL_H;
  107.         delay_s(40);//delay_us(4);
  108.         TCS_SDA_L;
  109.         delay_s(40);//delay_us(4);
  110.         TCS_SCL_L;
  111. }
  112. /*********************************************/
  113. void TCS34725_I2C_Stop()
  114. {
  115.         TCS_SDA_OUT();
  116.         TCS_SCL_L;
  117.         TCS_SDA_L;
  118.         delay_s(40);//delay_us(4);
  119.         TCS_SCL_H;
  120.         TCS_SDA_H;
  121.         delay_s(40);//delay_us(4);                                                                  
  122. }
  123. /*********************************************/
  124. //返回值:1,接收应答失败
  125. //        0,接收应答成功
  126. u8 TCS34725_I2C_Wait_ACK()
  127. {
  128.         u32 t=0;
  129.         
  130.         TCS_SDA_IN();//SDA设置为输入  
  131.         TCS_SDA_H;
  132.         delay_s(10);//delay_us(1);
  133.         TCS_SCL_H;
  134.         delay_s(10);//delay_us(1);
  135.         while(TCS_SDA_READ)
  136.         {
  137.                 t++;
  138.                 if(t > 250)
  139.                 {
  140.                         TCS34725_I2C_Stop();
  141.                         return 1;
  142.                 }
  143.         }
  144.         TCS_SCL_L;
  145.         return 0;        
  146. }
  147. /*********************************************/
  148. //产生ACK应答
  149. void TCS34725_I2C_ACK()
  150. {
  151.         TCS_SCL_L;
  152.         TCS_SDA_OUT();//sda线输出
  153.         TCS_SDA_L;
  154.         delay_s(20);//delay_us(2);
  155.         TCS_SCL_H;
  156.         delay_s(20);//delay_us(2);
  157.         TCS_SCL_L;
  158. }
  159. /*********************************************/
  160. //不产生ACK应答                    
  161. void TCS34725_I2C_NACK()
  162. {
  163.         TCS_SCL_L;
  164.         TCS_SDA_OUT();//sda线输出
  165.         TCS_SDA_H;
  166.         delay_s(20);//delay_us(2);
  167.         TCS_SCL_H;
  168.         delay_s(20);//delay_us(2);
  169.         TCS_SCL_L;
  170. }
  171. /*********************************************/
  172. //I2C发送一个字节                  
  173. void TCS34725_I2C_Send_Byte(u8 byte)
  174. {
  175.         u8 i;
  176.         
  177.         TCS_SDA_OUT();//sda线输出
  178.         TCS_SCL_L;//拉低时钟开始数据传输
  179.         for(i = 0; i < 8; i++)
  180.         {
  181.                 if(((byte&0x80)>>7)==1)TCS_SDA_H;
  182.                 else
  183.                         TCS_SDA_L;
  184.                 byte <<= 1;
  185.                
  186.                 delay_s(20);//delay_us(2);
  187.                 TCS_SCL_H;
  188.                 delay_s(20);//delay_us(2);
  189.                 TCS_SCL_L;
  190.                 delay_s(20);//delay_us(2);
  191.         }
  192. }
  193. /*********************************************/
  194. //读1个字节,ack=1时,发送ACK,ack=0,发送nACK   
  195. u8 TCS34725_I2C_Read_Byte(u8 ack)
  196. {
  197.         u8 i,receive = 0;
  198.         
  199.         TCS_SDA_IN();
  200.         for(i = 0; i < 8; i++)
  201.         {
  202.                 TCS_SCL_L;
  203.                 delay_s(20);//delay_us(2);
  204.                 TCS_SCL_H;
  205.                 receive <<= 1;
  206.                 if(TCS_SDA_READ) receive++;
  207.                 delay_s(10);//delay_us(1);
  208.         }
  209.         if (!ack) TCS34725_I2C_NACK();//发送nACK
  210.         else TCS34725_I2C_ACK(); //发送ACK
  211.         
  212.         return receive;
  213. }
  214. /*********************************************/
  215. /*******************************************************************************
  216. * @brief Writes data to a slave device.
  217. *
  218. * @param slaveAddress - Adress of the slave device.
  219. * @param dataBuffer - Pointer to a buffer storing the transmission data.
  220. * @param bytesNumber - Number of bytes to write.
  221. * @param stopBit - Stop condition control.
  222. *                  Example: 0 - A stop condition will not be sent;
  223. *                           1 - A stop condition will be sent.
  224. *******************************************************************************/
  225. void TCS34725_I2C_Write(u8 slaveAddress, u8* dataBuffer,u8 bytesNumber, u8 stopBit)
  226. {
  227.         u8 i = 0;
  228.         
  229.         TCS34725_I2C_Start();
  230.         TCS34725_I2C_Send_Byte((slaveAddress << 1) | 0x00);           //发送从机地址写命令
  231.         TCS34725_I2C_Wait_ACK();
  232.         for(i = 0; i < bytesNumber; i++)
  233.         {
  234.                 TCS34725_I2C_Send_Byte(*(dataBuffer + i));
  235.                 TCS34725_I2C_Wait_ACK();
  236.         }
  237.         if(stopBit == 1) TCS34725_I2C_Stop();
  238. }
  239. /*******************************************************************************
  240. * @brief Reads data from a slave device.
  241. *
  242. * @param slaveAddress - Adress of the slave device.
  243. * @param dataBuffer - Pointer to a buffer that will store the received data.
  244. * @param bytesNumber - Number of bytes to read.
  245. * @param stopBit - Stop condition control.
  246. *                  Example: 0 - A stop condition will not be sent;
  247. *                           1 - A stop condition will be sent.
  248. *******************************************************************************/
  249. void TCS34725_I2C_Read(u8 slaveAddress, u8* dataBuffer, u8 bytesNumber, u8 stopBit)
  250. {
  251.         u8 i = 0;
  252.         
  253.         TCS34725_I2C_Start();
  254.         TCS34725_I2C_Send_Byte((slaveAddress << 1) | 0x01);           //发送从机地址读命令
  255.         TCS34725_I2C_Wait_ACK();
  256.         for(i = 0; i < bytesNumber; i++)
  257.         {
  258.                 if(i == bytesNumber - 1)
  259.                 {
  260.                         *(dataBuffer + i) = TCS34725_I2C_Read_Byte(0);//读取的最后一个字节发送NACK
  261.                 }
  262.                 else
  263.                 {
  264.                         *(dataBuffer + i) = TCS34725_I2C_Read_Byte(1);
  265.                 }
  266.         }
  267.         if(stopBit == 1) TCS34725_I2C_Stop();
  268. }
  269. /*******************************************************************************
  270. * @brief Writes data into TCS34725 registers, starting from the selected
  271. *        register address pointer.
  272. *
  273. * @param subAddr - The selected register address pointer.
  274. * @param dataBuffer - Pointer to a buffer storing the transmission data.
  275. * @param bytesNumber - Number of bytes that will be sent.
  276. *
  277. * @return None.
  278. *******************************************************************************/
  279. void TCS34725_Write(u8 subAddr, u8* dataBuffer, u8 bytesNumber)
  280. {
  281.     u8 sendBuffer[10] = {0, };
  282.     u8 byte = 0;

  283.     sendBuffer[0] = subAddr | TCS34725_COMMAND_BIT;
  284.     for(byte = 1; byte <= bytesNumber; byte++)
  285.     {
  286.         sendBuffer[byte] = dataBuffer[byte - 1];
  287.     }
  288.         TCS34725_I2C_Write(TCS34725_ADDRESS, sendBuffer, bytesNumber + 1, 1);
  289. }
  290. /*******************************************************************************
  291. * @brief Reads data from TCS34725 registers, starting from the selected
  292. *        register address pointer.
  293. *
  294. * @param subAddr - The selected register address pointer.
  295. * @param dataBuffer - Pointer to a buffer that will store the received data.
  296. * @param bytesNumber - Number of bytes that will be read.
  297. *
  298. * @return None.
  299. *******************************************************************************/
  300. void TCS34725_Read(u8 subAddr, u8* dataBuffer, u8 bytesNumber)
  301. {
  302.         subAddr |= TCS34725_COMMAND_BIT;
  303.         
  304.         TCS34725_I2C_Write(TCS34725_ADDRESS, (u8*)&subAddr, 1, 0);
  305.         TCS34725_I2C_Read(TCS34725_ADDRESS, dataBuffer, bytesNumber, 1);
  306. }
  307. /*******************************************************************************
  308. * @brief TCS34725设置积分时间
  309. *
  310. * @return None
  311. *******************************************************************************/
  312. void TCS34725_SetIntegrationTime(u8 time)
  313. {
  314.         TCS34725_Write(TCS34725_ATIME, &time, 1);
  315. }
  316. /*******************************************************************************
  317. * @brief TCS34725设置增益
  318. *
  319. * @return None
  320. *******************************************************************************/
  321. void TCS34725_SetGain(u8 gain)
  322. {
  323.         TCS34725_Write(TCS34725_CONTROL, &gain, 1);
  324. }
  325. /*******************************************************************************
  326. * @brief TCS34725使能
  327. *
  328. * @return None
  329. *******************************************************************************/
  330. void TCS34725_Enable(void)
  331. {
  332.         u8 cmd = TCS34725_ENABLE_PON;
  333.         
  334.         TCS34725_Write(TCS34725_ENABLE, &cmd, 1);
  335.         cmd = TCS34725_ENABLE_PON | TCS34725_ENABLE_AEN;
  336.         TCS34725_Write(TCS34725_ENABLE, &cmd, 1);
  337.         //delay_s(600000);//delay_ms(3);//延时应该放在设置AEN之后
  338. }
  339. /*******************************************************************************
  340. * @brief TCS34725失能
  341. *
  342. * @return None
  343. *******************************************************************************/
  344. void TCS34725_Disable(void)
  345. {
  346.         u8 cmd = 0;
  347.         
  348.         TCS34725_Read(TCS34725_ENABLE, &cmd, 1);
  349.         cmd = cmd & ~(TCS34725_ENABLE_PON | TCS34725_ENABLE_AEN);
  350.         TCS34725_Write(TCS34725_ENABLE, &cmd, 1);
  351. }
  352. /*******************************************************************************
  353. * @brief TCS34725初始化
  354. *
  355. * @return ID - ID寄存器中的值
  356. *******************************************************************************/
  357. u8 TCS34725_Init(void)
  358. {
  359.         u8 id=0;
  360.         
  361.         TCS34725_I2C_Init();
  362.         TCS34725_Read(TCS34725_ID, &id, 1);  //TCS34725 的 ID 是 0x44 可以根据这个来判断是否成功连接
  363.         if(id==0x44)
  364.                 {
  365.                         TCS34725_SetIntegrationTime(TCS34725_INTEGRATIONTIME_240MS);
  366.                         TCS34725_SetGain(TCS34725_GAIN_1X);
  367.                         TCS34725_Enable();
  368.                         return 1;
  369.                 }
  370.         return 0;
  371. }
  372. /*******************************************************************************
  373. * @brief TCS34725获取单个通道数据
  374. *
  375. * @return data - 该通道的转换值
  376. *******************************************************************************/
  377. u16 TCS34725_GetChannelData(u8 reg)
  378. {
  379.         u8 tmp[2] = {0,0};
  380.         u16 data;
  381.         
  382.         TCS34725_Read(reg, tmp, 2);
  383.         data = (tmp[1] << 8) | tmp[0];
  384.         
  385.         return data;
  386. }
  387. /*******************************************************************************
  388. * @brief TCS34725获取各个通道数据
  389. *
  390. * @return 1 - 转换完成,数据可用
  391. *              0 - 转换未完成,数据不可用
  392. *******************************************************************************/
  393. u8 TCS34725_GetRawData(COLOR_RGBC *rgbc)
  394. {
  395.         u8 status = TCS34725_STATUS_AVALID;
  396.         
  397.         TCS34725_Read(TCS34725_STATUS, &status, 1);
  398.         
  399.         if(status & TCS34725_STATUS_AVALID)
  400.         {
  401.                 rgbc->c = TCS34725_GetChannelData(TCS34725_CDATAL);        
  402.                 rgbc->r = TCS34725_GetChannelData(TCS34725_RDATAL);        
  403.                 rgbc->g = TCS34725_GetChannelData(TCS34725_GDATAL);        
  404.                 rgbc->b = TCS34725_GetChannelData(TCS34725_BDATAL);
  405.                 return 1;
  406.         }
  407.         return 0;
  408. }
  409. /******************************************************************************/
  410. //RGB转HSL
  411. void RGBtoHSL(COLOR_RGBC *Rgb, COLOR_HSL *Hsl)
  412. {
  413.         u8 maxVal,minVal,difVal;
  414.         u8 r = Rgb->r*100/Rgb->c;   //[0-100]
  415.         u8 g = Rgb->g*100/Rgb->c;
  416.         u8 b = Rgb->b*100/Rgb->c;
  417.         
  418.         maxVal = max3v(r,g,b);
  419.         minVal = min3v(r,g,b);
  420.         difVal = maxVal-minVal;
  421.         
  422.         //计算亮度
  423.         Hsl->l = (maxVal+minVal)/2;
  424.         
  425.         if(maxVal == minVal)//若r=g=b,灰度
  426.         {
  427.                 Hsl->h = 0;
  428.                 Hsl->s = 0;
  429.         }
  430.         else
  431.         {
  432.                 //计算色调
  433.                 if(maxVal==r)
  434.                 {
  435.                         if(g>=b)
  436.                                 Hsl->h = 60*(g-b)/difVal;
  437.                         else
  438.                                 Hsl->h = 60*(g-b)/difVal+360;
  439.                 }
  440.                 else
  441.                         {
  442.                                 if(maxVal==g)Hsl->h = 60*(b-r)/difVal+120;
  443.                                 else
  444.                                         if(maxVal==b)Hsl->h = 60*(r-g)/difVal+240;
  445.                         }
  446.                
  447.                 //计算饱和度
  448.                 if(Hsl->l<=50)Hsl->s=difVal*100/(maxVal+minVal);  //[0-100]
  449.                 else
  450.                         Hsl->s=difVal*100/(200-(maxVal+minVal));
  451.         }
  452. }
  453. /******************************************************************************/
复制代码

使用时只需调用三个子程序:

1、TCS34725_Init();

2、TCS34725_GetRawData(&rgb);

3、RGBtoHSL(&rgb,&hsl);

把数据打印出来

printf("R=%d G=%d B=%d C=%d\r\n",rgb.r,rgb.g,rgb.b,rgb.c);

printf("H=%d S=%d L=%d\r\n",hsl.h,hsl.s,hsl.l);

初始化中读取颜色的间隔是50ms,所以读取速度不要太频繁



收藏 评论0 发布时间:2022-6-20 22:15

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版