Lectura del sensor TCS3200, para la identificación de colores.

Dependencies:   mbed

main.cpp

Committer:
CCastrop1012
Date:
2021-09-03
Revision:
0:19d20daef799

File content as of revision 0:19d20daef799:

#include "mbed.h"
#include "scolor_TCS3200.h"


//******************************************************************************
//                          Definiciones

/// Puerto Serial
Serial SerialPort(SERIAL_TX, SERIAL_RX, 9600);

/// PWM OUTPUTS
PwmOut Buzzer(LED1);

//  Temporizadores 
Ticker LengthTonoBuzzer;

// SENSOR DE COLOR
scolor_TCS3200 SENSOR_COLOR (PA_8, PB_10, PB_4, PB_5, PB_3); 


// constantes
//const int long_vector = 10; // longitud del vector

/// Global Variables



long red;
long blue;
long green;
long clear;

float F_red;
float F_blue;
float F_green;
float F_clear;

uint8_t coolterm_comand, i = 0;                      // Variable usada como Indice de los vectores,
                                    // indica la posicion del vector en donde se reciben 
                                    // ó se almacenan los datos

float periodo_Buzzer = 1;           
uint8_t duracion_Tono = 1;

#define DO 3.78 /// VALOR DEL PERIODO EN MS
#define RE 3.36 /// VALOR DEL PERIODO EN MS
#define MI 3.03 /// VALOR DEL PERIODO EN MS
#define SI 2.02 /// VALOR DEL PERIODO EN MS

  

//******************************************************************************
// COMANDOS

#define iniciar_telemetria 0xFE
#define CMD_rojo   0x01
#define CMD_azul   0x02
#define CMD_verde  0x03
#define CMD_clear  0x04
#define ColorNoIdentificado 0x05

uint8_t color_identificado = ColorNoIdentificado;

//****************************************************************************
// prototipo de funciones

void ReadPort(void);                // Lee el puerto Serial
void MainConfig(void);              // Configuracion Inicial de los Perifericos del uC
void leer_color(void);              // funcion que retorna los componentes
                                    // RGB y Clear del color leido
//****************************************************************************
//

void ReadPort()
{
    
    coolterm_comand = SerialPort.getc();
    
}
 

int main()
 {
    Buzzer.write(0);
    SerialPort.attach(&ReadPort, Serial::RxIrq);
    SerialPort.printf("Hello World, System Run !!\n");
    
    while(1)
    {
        
        while (coolterm_comand != iniciar_telemetria);
        SerialPort.printf("COMANDO RECIBIDO!!\n");
        
        leer_color();
        coolterm_comand = 0;
        
              
        /*
        switch(coolterm_comand)
        {
            case CMD_rojo:  leer_color();  
                    break;    
            
            case CMD_azul:  leer_color();
                    break;    
            
            case CMD_verde:  leer_color();
                    break;    
            
            case CMD_clear:  leer_color();
                    break;    
            default :       
                    break;    
            
          
            
        }*/  
    
    
    
    }
    
    
}


void leer_color()
    {
    
        red    = SENSOR_COLOR.ReadRed(); // OBTENEMOS EL TIEMPO DEL CICLO UTIL DE LA FRECUENCIA DE SALIDA 
        green  = SENSOR_COLOR.ReadGreen();
        blue   = SENSOR_COLOR.ReadBlue();
        clear  = SENSOR_COLOR.ReadClear();
        
        //printf("RED: %5d     GREEN: %5d     BLUE: %5d     CLEAR: %5d    \n ", red, green, blue, clear);
         
        red     *= 2;   // Calculamos EL PERIODO de la frecuencia generada por la lectura del fotodiodo rojo         
        blue    *= 2;   // Calculamos EL PERIODO de la frecuencia generada por la lectura del fotodiodo rojo
        green   *= 2;   // Calculamos EL PERIODO  de la frecuencia generada por la lectura del fotodiodo rojo
        clear   *= 2;   // Calculamos EL PERIODO  de la frecuencia generada por la lectura del fotodiodo rojo
        
        //printf("RED: %5d     GREEN: %5d     BLUE: %5d     CLEAR: %5d    \n ", red, green, blue, clear);
         
        F_red     = (1 / ((float)red)) * (1000); /// calculando la FRECUENCIA de salida generada por el fotodiodo rojo
        F_blue    = (1 / ((float)blue)) * (1000);   /// calculando la FRECUENCIA de salida generada por el fotodiodo blue
        F_green   = (1 / ((float)green)) * (1000);  /// calculando la FRECUENCIA de salida generada por el fotodiodo green
        F_clear   = (1 / ((float)clear)) * (1000);  /// calculando la FRECUENCIA de salida generada por el fotodiodo clear
        
        
     
        //printf("RED: %5f     GREEN: %5f     BLUE: %5f     CLEAR: %5f    \n ", F_red, F_green, F_blue, F_clear);
        
        
        
       //////////////////////////////////////////////////////////////     
       ////         identificar azul
       
       
       if(red <=42 && red >=24)
        {
            if(green >= 20 && green <= 28 )
            {
                if(blue >= 10 && blue <= 16)
                {
                        color_identificado = CMD_azul;
                        printf ( "0x0%1x\n ", CMD_azul); 
                        Buzzer.period_ms(DO);
                        Buzzer.write(0.5);
                        wait(4);
                        Buzzer.write(0);
                       
                }
            }
         }   
                 
        
        
        
        /////////////////////////////////////////////////////////////
        ///         identificar rojo
        if(red <= 12 )
        {
            if(green >= 10 && green <= 28 ) 
                {
                    if(blue >= 18 && blue <= 24)
                    {
                            color_identificado = CMD_rojo;
                            printf ( "0x0%1x\n ", CMD_rojo ); 
                            Buzzer.period_ms(RE);
                            Buzzer.write(0.5);  //PERIODO UTIL
                            wait(4);            //TIEMPO ACTIVO DEL BUZZER
                            Buzzer.write(0.0);
                    }
                }
                
            if(green < 10 && green >= 6 )
                {
                    if(blue <= 12  )
                    {
                            color_identificado = CMD_clear;
                            printf ( "0x0%1x \n ", CMD_clear );
                            Buzzer.period_ms(MI);
                            Buzzer.write(0.5);
                            wait(4);
                            Buzzer.write(0);
                    }
                    
                }
            
         }   
         
         
       //////////////////////////////////////////////////////////////     
       ////         identificar cafe
       

           // if(red >=14 && red <= 18 )
            //    printf ( "0x0 %1x \n ", CMD_verde );

         
       //////////////////////////////////////////////////////////////     
       ////         identificar verde
       
             if(green >= 36 && green <= 44 )
            {
                if(red >= 40 && red <= 50 )
            
                {
                        color_identificado = CMD_verde;
                        printf ( "0x0%1x \n ", CMD_verde );
                            Buzzer.period_ms(SI);
                            Buzzer.write(0.5);
                            wait(4);
                            Buzzer.write(0); 
                        
                    
                }
            } 
            
            if  (color_identificado == ColorNoIdentificado)
            {
                
                 
                        printf ( "0x0%1x \n ", ColorNoIdentificado);
                            Buzzer.period_ms(10);
                            Buzzer.write(0.5);
                            wait(4);
                            Buzzer.write(0); 
                        
                
            }
                
            color_identificado = ColorNoIdentificado;
        }