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);
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;
}
}
}
}