Problema con sensor TCS3200

Muy buenas estoy tratando de utilizar este sensor de colores, estoy utilizando específicamente el que vende DFRobot, he utilizado el código que ellos mismos proporcionan pero esto no funciona, obtengo unos valores de RGB pero al buscar en internet ese color, no es el que yo estoy colocando por lo tanto estoy obteniendo errores en las medidas. Intenté otro código que encontré de este link, este funciona un poco mejor pero sólo detecta el color blanco y rojo, el resto de colores siempre me dice que es el color magenta por lo que sigo con el mismo problema.

Alguno podría ayudarme?

Difícil adivinar si no pones código ni esquema.

  • A que distancia intentas leer el color del objeto ?
  • Que tanta luz le incide al objetos ? es luz natural ?
  • Intentaste graficar los valores RGB y sacar promedio ?

Muy bien, el código que probé inicialmente es el de la página oficial de DFRobot, es el siguiente:

int s0=3,s1=4,s2=5,s3=6;
int out=2;
int flag=0;
byte counter=0;
byte countR=0,countG=0,countB=0;
void setup()
 {
 Serial.begin(115200);
 pinMode(s0,OUTPUT);
 pinMode(s1,OUTPUT);
 pinMode(s2,OUTPUT);
 pinMode(s3,OUTPUT);

 }
void TCS()
 {
 flag=0;
 digitalWrite(s1,HIGH);
 digitalWrite(s0,HIGH);
 digitalWrite(s2,LOW);
 digitalWrite(s3,LOW);
 attachInterrupt(0, ISR_INTO, CHANGE);
 timer0_init();

 }
void ISR_INTO()
 {
 counter++;
 }
 void timer0_init(void)
 {
  TCCR2A=0x00;
  TCCR2B=0x07;   //the clock frequency source 1024 points
  TCNT2= 100;    //10 ms overflow again
  TIMSK2 = 0x01; //allow interrupt
 }
 int i=0;
 ISR(TIMER2_OVF_vect)//the timer 2, 10ms interrupt overflow again. Internal overflow interrupt executive function
{
    TCNT2=100;
    flag++;
 if(flag==1)
  {
    countR=counter;
    Serial.print("red=");
    Serial.println(countR,DEC);
    digitalWrite(s2,HIGH);
    digitalWrite(s3,HIGH);
  }
  else if(flag==2)
   {
    countG=counter;
    Serial.print("green=");
    Serial.println(countG,DEC);
    digitalWrite(s2,LOW);
    digitalWrite(s3,HIGH);
   }
   else if(flag==3)
    {
    countB=counter;
    Serial.print("blue=");
    Serial.println(countB,DEC);
    Serial.println("\n");
    digitalWrite(s2,LOW);
    digitalWrite(s3,LOW);

    }
    else if(flag==4)
     {
     flag=0;
     }
       counter=0;
}
void loop()
 {
  TCS();
while(1);
 }

Este código en realidad no me funciona para nada, como dije anteriormente detecta colores que no son.

El esquema que tengo es el siguiente:

El otro código que he probado lo dejo como un archivo adjunto ya que supera la cantidad de caracteres máximos que permite el foro. Este código si me funciona aunque no siempre detecta bien el color pero al menos es algo. La diferencia de conexiones es que el pin OE va al pin D7 y el pin LED va al pin D8.

Respondiendo a tus preguntas:

  1. podría decir que funciona mejor entre 5mm a 15mm (el segundo código)
  2. El primer código podría decir que se hace con luz natural, el segundo la luz la proporcionan los LEDs del propio sensor con una especie de disparo, es decir, enciende y se apagan al instante de hacer la lectura, lo que no hace el código que proporciona el de DFRobot.
  3. No he intentado graficar los valores ni tampoco sacar un promedio, no pensé necesitar algo así ya que las medidas que da el primer código son estables aunque no correctas.

Color.ino (8.01 KB)