TCS34725颜色感应识别模块

时间:2022-09-29 09:53:58

前言

TCS34725传感器模块,使用IIC或者UART通信,可直接输出RGB值。
能当做单纯的简单TCS34725模块使用,还能用内部MCU读取TCS34725数据,MCU计算后直接输出RGB,内部白平衡程序。


一、模块介绍

TCS34725是一款低成本颜色识别传感器模块。有功耗小,体积小,安装方便的优势。
其工作原理是,通过照明LED发光,照射到被测物体后,返回光经过滤镜检测RGB的比例值,根据RGB的比例值识别出颜色。
模块具有两种方式读取数据,即串口UART(TTL电平)或者IIC(2线),串口的波特率有9600bps与115200bps可配置,有连续、询问输出两种方式还能掉电保存设置。
还可以进行简单的7种颜色识别,不需要计算RGB值。能适应不同的工作环境,与单片机及电脑连接。
模块另外可以设置单独传感器芯片工作模式,作为简单传感器模块,MCU不参与数据处理工作。

二、产品参数

名称 参数
测量范围 RGB 0-255
响应频率 10HZ
工作电压 3~5V(DC)
工作电流 15mA
工作温度 -20~85℃
传感器芯片 TCS34725

三、实物图


TCS34725颜色感应识别模块

点击图片购买

四、模块引脚介绍

引脚名称 功能作用
VCC 电源输入+(3-5V)
CT 串口UART_TX / IIC_SCL
DR 串口UART_RX / IIC_SDA
GND 电源输出(地)
NC 保留,无需连接,建议悬空
INT TCS34725颜色芯片中断 S1=0 (接GND时启用)
SDA TCS34725颜色芯片数据线 S1=0 (接GND时启用)
SCL TCS34725颜色芯片时钟线 S1=0 (接GND时启用)
S0 串口 / MCU_IIC模式选择
S1 仅使用传感器芯片(IIC)模式选择

相信很多人没看懂s0和s1这个两个引脚的作用。别急,我们留到使用说明时再详细讲解。

五、使用说明

工作模式的选择

TCS34725模块为串口和IIC输出模块,其默认为串口模式。
模块左边的S0引脚处于断开状态则为串口模式
模块左边的S0引脚接GND,模块进入IIC模式
将模块右边的S1引脚接GND,模块进入仅用传感器芯片(IIC)模式。

串口模式下,使用该模块配套的上位机可方便的对模块进行相应的设置,上位机command框对应模块串口的command 寄存器,在相应位置 1,然后点右下角的“发送”按钮,即对模块进行了设置,模块将向外发送相应数据,数据将显示在左侧对应的方框中。
MCU_IIC 通信模式下,通信时钟需在 40Khz~200Khz 之间,通过读取相应寄存器即可,全部数据读取间隔应小于 10hz;
IIC 对模块的配置支持“LED 亮度调节”、“白平衡校准”。
仅用传感器芯片模式下,模块的 MCU 不对颜色芯片进行设置和读取,用户还可通过串口或 IIC 控制模块的 LED 亮度等级。可用INT、SCL、SDA 引脚直接控制颜色芯片

上位机界面说明

TCS34725颜色感应识别模块

六、实例应用

本次选用IIC通信模式,使用Arduino UNOR3开发板进行测试

实物接线

TCS34725颜色感应识别模块

所用代码

主程序:

#include <i2cmaster.h>

/
/*
GY-33-----pro mini 5v 16m
VCC----VCC
CT----A5
DR----A4
GND--GND
S0---GND
*/
/

/*
uart 
send 'b'-----Calibration GY-33
send 'a'-----GY33 send data
*/
//
#define uint16_t unsigned int
typedef struct
{
    uint16_t Red;
    uint16_t Green;
    uint16_t Blue;
    uint16_t Clear;
} RGB;
unsigned char Re_buf;
unsigned char sign=0;
RGB rgb;
uint16_t CT=0,Lux=0;
byte color=0,rgb_data[3]={0};

void setup() {
       Serial.begin(115200);
       i2c_init();
        delay(1); 
}
void loop() {
  unsigned char data[9]={0};
 if(!sign)
 {
   iic_read(0x00,data,8);
   rgb.Red=(data[0]<<8)|data[1];
   rgb.Green=(data[2]<<8)|data[3];
   rgb.Blue=(data[4]<<8)|data[5];
   rgb.Clear=(data[6]<<8)|data[7];
    Serial.print("Red: ");
   Serial.print(rgb.Red);
   Serial.print(",Green: ");
   Serial.print( rgb.Green);
    Serial.print(",Blue");
    Serial.print( rgb.Blue);
     Serial.print(",Clear");
    Serial.println(rgb.Clear);
    iic_read(0x08,data,4);
     Lux=(data[0]<<8)|data[1];
     CT=(data[2]<<8)|data[3];
   
    Serial.print("CT:");
    Serial.print(CT);
    Serial.print(",Lux:");
    Serial.println( Lux);
     iic_read(0x0c,data,3);
    rgb_data[0]=data[0];
    rgb_data[1]=data[1];
    rgb_data[2]=data[2];
    Serial.print("r:");
    Serial.print( rgb_data[0]);
    Serial.print(",g:"); 
    Serial.print( rgb_data[1]);
    Serial.print(",b:"); 
    Serial.println( rgb_data[2]);
     iic_read(0x0f,data,1); 
     color=data[0];
     Serial.print(",color:"); 
    Serial.println( color,HEX);
 }
 if(sign==1)
 {
   iic_read(0x10,&data[8],1);
   i2c_start_wait(0xb4);
    i2c_write(0x10);
    i2c_write(0x31);
   // i2c_write((data[8]|0x01));
    i2c_stop();
    sign=3;
 }
   delay(200); 
}
void iic_read(unsigned char add,unsigned char *data,unsigned char len)
{
  i2c_start_wait(0xb4);
   i2c_write(add);
   i2c_start_wait(0xb5);
   while(len-1)
   {
    *data++=i2c_readAck();
    len--;
    }
    *data=i2c_readNak();
    i2c_stop();
}
void serialEvent() {
  while (Serial.available()) {   
    Re_buf=(unsigned char)Serial.read();
   if (Re_buf=='a')
       sign=0;
    if (Re_buf=='b')    
       sign=1; 
      Re_buf=0; 
  }
}
#include <i2cmaster.h>
/
/*
GY-33-----pro mini 5v 16m
VCC----VCC
CT----A5
DR----A4
GND--GND
S0---GND
*/
/

/*
uart 
send 'b'-----Calibration GY-33
send 'a'-----GY33 send data
*/
//
#define uint16_t unsigned int
typedef struct
{
    uint16_t Red;
    uint16_t Green;
    uint16_t Blue;
    uint16_t Clear;
} RGB;
unsigned char Re_buf;
unsigned char sign=0;
RGB rgb;
uint16_t CT=0,Lux=0;
byte color=0,rgb_data[3]={0};

void setup() {
       Serial.begin(115200);
       i2c_init();
        delay(1); 
}
void loop() {
  unsigned char data[9]={0};
 if(!sign)
 {
   iic_read(0x00,data,8);
   rgb.Red=(data[0]<<8)|data[1];
   rgb.Green=(data[2]<<8)|data[3];
   rgb.Blue=(data[4]<<8)|data[5];
   rgb.Clear=(data[6]<<8)|data[7];
    Serial.print("Red: ");
   Serial.print(rgb.Red);
   Serial.print(",Green: ");
   Serial.print( rgb.Green);
    Serial.print(",Blue");
    Serial.print( rgb.Blue);
     Serial.print(",Clear");
    Serial.println(rgb.Clear);
    iic_read(0x08,data,4);
     Lux=(data[0]<<8)|data[1];
     CT=(data[2]<<8)|data[3];
   
    Serial.print("CT:");
    Serial.print(CT);
    Serial.print(",Lux:");
    Serial.println( Lux);
     iic_read(0x0c,data,3);
    rgb_data[0]=data[0];
    rgb_data[1]=data[1];
    rgb_data[2]=data[2];
    Serial.print("r:");
    Serial.print( rgb_data[0]);
    Serial.print(",g:"); 
    Serial.print( rgb_data[1]);
    Serial.print(",b:"); 
    Serial.println( rgb_data[2]);
     iic_read(0x0f,data,1); 
     color=data[0];
     Serial.print(",color:"); 
    Serial.println( color,HEX);
 }
 if(sign==1)
 {
   iic_read(0x10,&data[8],1);
   i2c_start_wait(0xb4);
    i2c_write(0x10);
    i2c_write(0x31);
   // i2c_write((data[8]|0x01));
    i2c_stop();
    sign=3;
 }
   delay(200); 
}
void iic_read(unsigned char add,unsigned char *data,unsigned char len)
{
  i2c_start_wait(0xb4);
   i2c_write(add);
   i2c_start_wait(0xb5);
   while(len-1)
   {
    *data++=i2c_readAck();
    len--;
    }
    *data=i2c_readNak();
    i2c_stop();
}
void serialEvent() {
  while (Serial.available()) {   
    Re_buf=(unsigned char)Serial.read();
   if (Re_buf=='a')
       sign=0;
    if (Re_buf=='b')    
       sign=1; 
      Re_buf=0; 
  }
}

i2cmaster.h

#include <i2cmaster.h>
/
/*
GY-33-----pro mini 5v 16m
VCC----VCC
CT----A5
DR----A4
GND--GND
S0---GND
*/
/

/*
uart 
send 'b'-----Calibration GY-33
send 'a'-----GY33 send data
*/
//
#define uint16_t unsigned int
typedef struct
{
    uint16_t Red;
    uint16_t Green;
    uint16_t Blue;
    uint16_t Clear;
} RGB;
unsigned char Re_buf;
unsigned char sign=0;
RGB rgb;
uint16_t CT=0,Lux=0;
byte color=0,rgb_data[3]={0};

void setup() {
       Serial.begin(115200);
       i2c_init();
        delay(1); 
}
void loop() {
  unsigned char data[9]={0};
 if(!sign)
 {
   iic_read(0x00,data,8);
   rgb.Red=(data[0]<<8)|data[1];
   rgb.Green=(data[2]<<8)|data[3];
   rgb.Blue=(data[4]<<8)|data[5];
   rgb.Clear=(data[6]<<8)|data[7];
    Serial.print("Red: ");
   Serial.print(rgb.Red);
   Serial.print(",Green: ");
   Serial.print( rgb.Green);
    Serial.print(",Blue");
    Serial.print( rgb.Blue);
     Serial.print(",Clear");
    Serial.println(rgb.Clear);
    iic_read(0x08,data,4);
     Lux=(data[0]<<8)|data[1];
     CT=(data[2]<<8)|data[3];
   
    Serial.print("CT:");
    Serial.print(CT);
    Serial.print(",Lux:");
    Serial.println( Lux);
     iic_read(0x0c,data,3);
    rgb_data[0]=data[0];
    rgb_data[1]=data[1];
    rgb_data[2]=data[2];
    Serial.print("r:");
    Serial.print( rgb_data[0]);
    Serial.print(",g:"); 
    Serial.print( rgb_data[1]);
    Serial.print(",b:"); 
    Serial.println( rgb_data[2]);
     iic_read(0x0f,data,1); 
     color=data[0];
     Serial.print(",color:"); 
    Serial.println( color,HEX);
 }
 if(sign==1)
 {
   iic_read(0x10,&data[8],1);
   i2c_start_wait(0xb4);
    i2c_write(0x10);
    i2c_write(0x31);
   // i2c_write((data[8]|0x01));
    i2c_stop();
    sign=3;
 }
   delay(200); 
}
void iic_read(unsigned char add,unsigned char *data,unsigned char len)
{
  i2c_start_wait(0xb4);
   i2c_write(add);
   i2c_start_wait(0xb5);
   while(len-1)
   {
    *data++=i2c_readAck();
    len--;
    }
    *data=i2c_readNak();
    i2c_stop();
}
void serialEvent() {
  while (Serial.available()) {   
    Re_buf=(unsigned char)Serial.read();
   if (Re_buf=='a')
       sign=0;
    if (Re_buf=='b')    
       sign=1; 
      Re_buf=0; 
  }
}
#include <i2cmaster.h>
/
/*
GY-33-----pro mini 5v 16m
VCC----VCC
CT----A5
DR----A4
GND--GND
S0---GND
*/
/

/*
uart 
send 'b'-----Calibration GY-33
send 'a'-----GY33 send data
*/
//
#define uint16_t unsigned int
typedef struct
{
    uint16_t Red;
    uint16_t Green;
    uint16_t Blue;
    uint16_t Clear;
} RGB;
unsigned char Re_buf;
unsigned char sign=0;
RGB rgb;
uint16_t CT=0,Lux=0;
byte color=0,rgb_data[3]={0};

void setup() {
       Serial.begin(115200);
       i2c_init();
        delay(1); 
}
void loop() {
  unsigned char data[9]={0};
 if(!sign)
 {
   iic_read(0x00,data,8);
   rgb.Red=(data[0]<<8)|data[1];
   rgb.Green=(data[2]<<8)|data[3];
   rgb.Blue=(data[4]<<8)|data[5];
   rgb.Clear=(data[6]<<8)|data[7];
    Serial.print("Red: ");
   Serial.print(rgb.Red);
   Serial.print(",Green: ");
   Serial.print( rgb.Green);
    Serial.print(",Blue");
    Serial.print( rgb.Blue);
     Serial.print(",Clear");
    Serial.println(rgb.Clear);
    iic_read(0x08,data,4);
     Lux=(data[0]<<8)|data[1];
     CT=(data[2]<<8)|data[3];
   
    Serial.print("CT:");
    Serial.print(CT);
    Serial.print(",Lux:");
    Serial.println( Lux);
     iic_read(0x0c,data,3);
    rgb_data[0]=data[0];
    rgb_data[1]=data[1];
    rgb_data[2]=data[2];
    Serial.print("r:");
    Serial.print( rgb_data[0]);
    Serial.print(",g:"); 
    Serial.print( rgb_data[1]);
    Serial.print(",b:"); 
    Serial.println( rgb_data[2]);
     iic_read(0x0f,data,1); 
     color=data[0];
     Serial.print(",color:"); 
    Serial.println( color,HEX);
 }
 if(sign==1)
 {
   iic_read(0x10,&data[8],1);
   i2c_start_wait(0xb4);
    i2c_write(0x10);
    i2c_write(0x31);
   // i2c_write((data[8]|0x01));
    i2c_stop();
    sign=3;
 }
   delay(200); 
}
void iic_read(unsigned char add,unsigned char *data,unsigned char len)
{
  i2c_start_wait(0xb4);
   i2c_write(add);
   i2c_start_wait(0xb5);
   while(len-1)
   {
    *data++=i2c_readAck();
    len--;
    }
    *data=i2c_readNak();
    i2c_stop();
}
void serialEvent() {
  while (Serial.available()) {   
    Re_buf=(unsigned char)Serial.read();
   if (Re_buf=='a')
       sign=0;
    if (Re_buf=='b')    
       sign=1; 
      Re_buf=0; 
  }
}
#include <i2cmaster.h>
/
/*
GY-33-----pro mini 5v 16m
VCC----VCC
CT----A5
DR----A4
GND--GND
S0---GND
*/
/

/*
uart 
send 'b'-----Calibration GY-33
send 'a'-----GY33 send data
*/
//
#define uint16_t unsigned int
typedef struct
{
    uint16_t Red;
    uint16_t Green;
    uint16_t Blue;
    uint16_t Clear;
} RGB;
unsigned char Re_buf;
unsigned char sign=0;
RGB rgb;
uint16_t CT=0,Lux=0;
byte color=0,rgb_data[3]={0};

void setup() {
       Serial.begin(115200);
       i2c_init();
        delay(1); 
}
void loop() {
  unsigned char data[9]={0};
 if(!sign)
 {
   iic_read(0x00,data,8);
   rgb.Red=(data[0]<<8)|data[1];
   rgb.Green=(data[2]<<8)|data[3];
   rgb.Blue=(data[4]<<8)|data[5];
   rgb.Clear=(data[6]<<8)|data[7];
    Serial.print("Red: ");
   Serial.print(rgb.Red);
   Serial.print(",Green: ");
   Serial.print( rgb.Green);
    Serial.print(",Blue");
    Serial.print( rgb.Blue);
     Serial.print(",Clear");
    Serial.println(rgb.Clear);
    iic_read(0x08,data,4);
     Lux=(data[0]<<8)|data[1];
     CT=(data[2]<<8)|data[3];
   
    Serial.print("CT:");
    Serial.print(CT);
    Serial.print(",Lux:");
    Serial.println( Lux);
     iic_read(0x0c,data,3);
    rgb_data[0]=data[0];
    rgb_data[1]=data[1];
    rgb_data[2]=data[2];
    Serial.print("r:");
    Serial.print( rgb_data[0]);
    Serial.print(",g:"); 
    Serial.print( rgb_data[1]);
    Serial.print(",b:"); 
    Serial.println( rgb_data[2]);
     iic_read(0x0f,data,1); 
     color=data[0];
     Serial.print(",color:"); 
    Serial.println( color,HEX);
 }
 if(sign==1)
 {
   iic_read(0x10,&data[8],1);
   i2c_start_wait(0xb4);
    i2c_write(0x10);
    i2c_write(0x31);
   // i2c_write((data[8]|0x01));
    i2c_stop();
    sign=3;
 }
   delay(200); 
}
void iic_read(unsigned char add,unsigned char *data,unsigned char len)
{
  i2c_start_wait(0xb4);
   i2c_write(add);
   i2c_start_wait(0xb5);
   while(len-1)
   {
    *data++=i2c_readAck();
    len--;
    }
    *data=i2c_readNak();
    i2c_stop();
}
void serialEvent() {
  while (Serial.available()) {   
    Re_buf=(unsigned char)Serial.read();
   if (Re_buf=='a')
       sign=0;
    if (Re_buf=='b')    
       sign=1; 
      Re_buf=0; 
  }
}