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 |
引脚名称 | 功能作用 |
---|---|
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 引脚直接控制颜色芯片
本次选用IIC通信模式,使用Arduino UNOR3开发板进行测试
主程序:
#include
/
/*
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
/
/*
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
/
/*
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
/
/*
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
/
/*
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;
}
}