Sensor de Color RGB TCS3472, Pic C Compiler

En esta sección aprenderás a programar un sensor de color RGB. El objetivo es detectar el color de cualquier objeto rojo, verde o azul (RGB), programando el sensor TCS3472 mediante la comunicación I2C.

Sensor TCS3472

El dispositivo TCS3472 proporciona un retorno digital de valores de detección de luz roja, verde, azul (RGB) y clara. Un filtro de bloqueo de IR, integrado en el chip y localizado en los fotodiodos de detección de color, minimiza el componente espectral IR de la luz entrante y permite realizar mediciones de color con precisión. La alta sensibilidad, el amplio rango dinámico y el filtro de bloqueo de IR hacen que el TCS3472 sea una solución de sensor de color ideal para usar en condiciones de iluminación variables y a través de materiales atenuantes.

El sensor de color TCS3472 tiene una amplia gama de aplicaciones, incluido el control de retroiluminación LED RGB, iluminación de estado sólido, productos de salud/estado físico, controles de procesos industriales y equipos de diagnóstico médico. Además, el filtro de bloqueo de IR permite que el TCS3472 realice detección de luz ambiental (ALS). La detección de luz ambiental se usa ampliamente en productos basados en pantallas, como teléfonos celulares, computadoras portátiles y televisores, para detectar el entorno de iluminación y habilitar el brillo automático de la pantalla para una visualización óptima y ahorro de energía. El TCS3472, en sí mismo, puede entrar en un estado de espera de menor potencia entre las mediciones de detección de luz para reducir aún más el consumo de energía promedio.

Pines:

  • VIN: Voltaje de alimentación 5 VDD.
  • GND: Tierra.
  • 3V3: Se puede alimentar con 3V3 VDD.
  • SCL: Serial Clock.
  • SDA: Serial Data.
  • INT: interrupción para un nivel de luz este fuera del rango.
  • LED: Para la activación o desactivación del sensor.

Circuito de Conexión 

Procedimiento

El primer paso es colocar los parámetros para la comunicación I2C del sensor de color.

#use i2c(Master, Fast, sda=PIN_B0, scl=PIN_B1,force_sw, stream=TCS34725_stream)//parametros I2C

Se incluye la librería del sensor de color. La librería se colocar en la carpeta del proyecto a realizar.

#include "TCS34725.c"

Se crean las variables para registrar los valores del sensor y colocar el color detectado.

float rojo, verde, azul;

Se inicializan los parámetros del sensor para el correcto funcionamiento.

TCS34725_init();

La siguiente función obtiene el valor censado para cada color.

getRGB(&rojo, &verde, &azul);

Finalmente se muestran los valores de los colores censados en la pantalla OLED.

Utiliza la pantalla OLED SH1106 o SSD1306


      sprintf(texto,"R: %f",rojo);
      OLED_DrawText(1,1,texto,2);
      
      sprintf(texto,"G: %f",verde);
      OLED_DrawText(1,16,texto,2);
      
      sprintf(texto,"B: %f",Azul);
      OLED_DrawText(1,32,texto,2);
         
      OLED_Display();//Muestra la informacion en la pantalla

Código completo


#FUSES NOMCLR

#use i2c(Master,Fast, sda=PIN_B0, scl=PIN_B1,force_sw, stream=OLED_stream)//parametros I2C
#use i2c(Master, Fast, sda=PIN_B0, scl=PIN_B1,force_sw, stream=TCS34725_stream)//parametros I2C

#define SH1106_128_64 //DEFINE EL MODELO DE LA PANTALLA OLED
//#define SSD1306_128_64

#include "OLED_I2C.c" //libreria oled I2C
#include "TCS34725.c"


float rojo, verde, azul;
char texto[128];

void main()
{
   TCS34725_init();
   
   OLED_Begin();
   OLED_ClearDisplay();

   while(TRUE)
   {
      getRGB(&rojo, &verde, &azul);//datos del sensor
      
      sprintf(texto,"R: %f",rojo);
      OLED_DrawText(1,1,texto,2);
      
      sprintf(texto,"G: %f",verde);
      OLED_DrawText(1,16,texto,2);
      
      sprintf(texto,"B: %f",Azul);
      OLED_DrawText(1,32,texto,2);
         
      OLED_Display();//Muestra la informacion en la pantalla
   }
   

}

Circuito de Conexión 2

Código completo 2


#FUSES NOMCLR

#use i2c(Master,Fast, sda=PIN_B0, scl=PIN_B1,force_sw, stream=OLED_stream)//parametros I2C
#use i2c(Master, Fast, sda=PIN_B0, scl=PIN_B1,force_sw, stream=TCS34725_stream)//parametros I2C

#define SH1106_128_64 //DEFINE EL MODELO DE LA PANTALLA OLED
//#define SSD1306_128_64

#include "OLED_I2C.c" //libreria oled I2C
#include "TCS34725.c"

#define ajs input(PIN_D0)
#define mas input(PIN_D1)
#define menos input(PIN_D2)


float rojo, verde, azul;
char texto[128];
int8 x;
int8 color;


void masmenos();

void OLED()
{
   sprintf(texto,"R: %f",rojo);
   OLED_DrawText(1,1,texto,2);
   
   sprintf(texto,"G: %f",verde);
   OLED_DrawText(1,16,texto,2);
   
   sprintf(texto,"B: %f",azul);
   OLED_DrawText(1,32,texto,2);
   
   switch (color)
   {
      case 1:
         sprintf(texto,"ROJO ");
         OLED_DrawText(40,48,texto,2);
      break;
      
      case 2:
         sprintf(texto,"VERDE");
         OLED_DrawText(40,48,texto,2);
      break;
      
      case 3:
         sprintf(texto,"AZUL ");
         OLED_DrawText(40,48,texto,2);
      break;
      
      default:
         sprintf(texto,"     ");
         OLED_DrawText(40,48,texto,2);
      break;  
   }
   

   OLED_Display();//Muestra la informacion en la pantalla

}


void main()
{
   TCS34725_init();

   OLED_Begin();
   OLED_ClearDisplay();
   
   x = read_EEPROM (1);//(n° de registro)
   while(TRUE)
   {
      getRGB(&rojo, &verde, &azul);//datos del sensor 
      
        
      if (rojo>=x || verde>=x || azul>=x)
      {
         if (rojo>verde && rojo>azul)
         {
            color=1;//rojo
         }else if (verde>rojo && verde>azul)
         {
            color=2;//verde      
         }else
         {
            color=3;//azul      
         }
      }else
      {
         color=0;    
      }
      
      OLED();
      
      while(ajs)//boton de ajuste para cambiar x
      {
         delay_ms(10);
         if (!ajs)
         {
            masmenos();
         }
      } 
      //TODO: User Code
   }

}


void oled_ajuste()
{
   sprintf(texto,"Max=%03u",x);
   OLED_DrawText(1,1,texto,2);
   OLED_Display();//Muestra la informacion en la pantalla
}


void masmenos()
{  
   OLED_ClearDisplay(); 
   
   while (true){
   
      while(mas)//boton de más
      {
         delay_ms(10);
         if(!mas)
         {
            x++;
         }
      }
   
      while(menos)//boton de menos
      {
         delay_ms(10);
         if(!menos)
         {
            x--;
         }
      }
        
      oled_ajuste();  
        
      while(ajs)//boton de ajuste para regresar
      {
         delay_ms(10);
         if (!ajs)
         {  
            write_eeprom(1,x);//(n° de registro, dato)
            return;
         }
      } 
      
   }
}
Scroll al inicio