
Descrición
É un sensor de cor dixital capaz de medir os valores RGB da cor dun obxecto ou luz incidente, polo que será moito máis preciso có sensor TC3200.
Proporciona valores RGB e Clear (medición sen filtrar)
Funcionamento
O TCS34725 incorpora unha matriz de fotodíodos filtrados para vermello (R), verde (G) , azul (B) e sen filtro (clear), proporcionando unha medición de cor relativamente precisa, aínda que non perfecta.

Se a cor RGB vai representada en código decimal, cada unha das tres cores vermella, verde e azul toma un valor entre 0 e 255 (256 valores en total), co que se consegue un total de 256 x 256 x 256 = 16.777.216 cores distintas.
Cando o valor RGB represéntase en código hexadecimal o rango das cores RGB vai de 00 a FF para cada unha delas. O código da cor resultante da mestura exprésase así: #RRGGBB.
|
![]() |
Montaxe
A comunicación co sensor realízase por I2C, polo que chega con conectar os pins SDA (A4) e SCL (A5) e os pins de alimentación Vin (5V) e GND.
O pin LED controla o acendido do LED de luz neutra integrado no módulo. Pódese:
- Deixalo sen conectar para mantelo sempre acendido.
- Conectalo a GND para telo sempre apagado.
- Conectar a un pin dixital e controlar o seu acendido e apagado con digitalWrite(pinLED, HIGH); e digitalWrite(pinLED, LOW);
Nós ímolo deixar desconectado.
Programa
Necesitamos a librería Adafruit_TCS34725 e a librería Wire para a comunicación I2C. Para a segunda práctica necesitamos a librería ColorConverterLib.
Podes descargalas directamente aquí: Adafruit_TCS34725.zip | Arduino-ColorConverter-master.zip
1. Ver RGB
Imos ver os valores dun sensor e mostralos na consola serie. Conectamos un pulsador para que a lectura se realice cando prememos nel.
#include <Wire.h>
#include "Adafruit_TCS34725.h"
const int pulsador = 2;
Adafruit_TCS34725 tcs = Adafruit_TCS34725(TCS34725_INTEGRATIONTIME_50MS, TCS34725_GAIN_4X);
void setup() {
Serial.begin(9600);
if (tcs.begin()) {
Serial.println("Sensor atopado");
}
else {
Serial.println("Sensor TCS34725 non atopado");
while (1); // halt!
}
}
void loop() {
float red, green, blue;
delay(60); // takes 50ms to read
tcs.getRGB(&red, &green, &blue);
int estado=digitalRead(pulsador);
if (estado == 1){
while(digitalRead(pulsador)==1);
delay(20);
Serial.print("R:"); Serial.print(int(red));
Serial.print(" G:"); Serial.print(int(green));
Serial.print(" B:"); Serial.print(int(blue));
Serial.print("\t");
Serial.print(" HEX: "); Serial.print((int)red, HEX); Serial.print((int)green, HEX); Serial.print((int)blue, HEX);
Serial.print("\n");
}
}
2. Detectar Cor
No seguinte programa imos ver na consola que cor está a detectar o sensor.
#include <Wire.h>
#include "Adafruit_TCS34725.h"
#include <ColorConverterLib.h>
uint16_t redT, greenT, blueT, clearT;
float scaleRedT, scaleGreenT, scaleBlueT;
double nuanceT, saturationT, valueT;
String nameColorT;
Adafruit_TCS34725 tcs = Adafruit_TCS34725(TCS34725_INTEGRATIONTIME_50MS, TCS34725_GAIN_4X);
void setup() {
Serial.begin(9600);
if (tcs.begin()) {
Serial.println("Sensor atopado");
}
else {
Serial.println("Sensor TCS34725 non atopado");
while (1); // halt!
}
}
String printColorNameT() {
if (nuanceT <= 15){
return nameColorT = "Vermello";
}
else if (nuanceT <= 45){
return nameColorT = "Laranxa";
}
else if (nuanceT <= 90){
return nameColorT = "Amarelo";
}
else if (nuanceT <= 150){
return nameColorT = "Verde";
}
else if (nuanceT <= 210){
return nameColorT = "Ciano";
}
else if (nuanceT <= 270){
return nameColorT = "Azul";
}
else if (nuanceT <= 330){
return nameColorT = "Maxenta";
}
else{
return nameColorT = "Vermello";
}
}
void loop() {
tcs.setInterrupt(false);
delay(60);
tcs.getRawData(&redT, &greenT, &blueT, &clearT);
tcs.setInterrupt(true);
scaleRedT = redT;
scaleRedT = (scaleRedT / clearT ) * 255;
scaleGreenT = greenT;
scaleGreenT = (scaleGreenT / clearT ) * 255;
scaleBlueT = blueT;
scaleBlueT = (scaleBlueT / clearT ) * 255;
ColorConverter::RgbToHsv(static_cast<uint16_t>(scaleRedT), static_cast<uint16_t>(scaleGreenT),
static_cast<uint16_t>(scaleBlueT), nuanceT, saturationT, valueT);
nuanceT *= 360;
Serial.println("Cor: " + printColorNameT() + "[" + String(nuanceT) + "]");
delay(900);
if (printColorNameT()=="Vermello"){
Serial.println("atopado vermello");
}
}
Propostas
- Mostra agora na consola se a peza é vermella, amarela ou verde. Segundo sexa a cor fai que se acenda un LED da cor correspondente.
- Proba o sensor con pezas de varias cores (vermello, azul, verde, …) e mostra na consola o valor RGB. Fai que un LED RGB imite a cor desas pezas.
