Header image  
Electricidad, Electrónica, automatización industrial, láser, vacío  
line decor
    INICIO  || Traductor de idiomas ||
line decor
 
 
 
 

 
 

Colorímetro con TCS230 y arduino

Introducción:

Que cálculos debe realizar el microcontrolador:

Diseño del algoritmo:

Paso 0:
  muestra inicio en pantalla y espera a botón "enter"

Paso 1:
   Empieza con el sensor blanco (anulado)
   Va al paso 2

Paso 2:
   Captura color azul
   Si ha completado las X lecturas, entonces ve al paso 3

Paso 3:
   Captura color verde
   Si ha completado las X lecturas, entonces ve al paso 4

Paso 4:
   Captura color rojo
   Si ha completado las X lecturas, entonces ve al paso 5

Paso 5:
   Si se ha completado las XX muestras para hacer la media, entonces ve al paso 6
sino ve al paso 1

Paso 6:
   Realiza los cálculos y los guarda en variable patrón
Ve al paso 7

Paso 7:
   Muestra en pantalla la siguiente opción, "segundo color a comparar"
   Si apreta enter, entonces ve al paso 8, sino no hace nada

Paso 8:
   Empieza con el sensor blanco (anulado)
   Va al paso 9

Paso 9:
   Captura color azul
   Si ha completado las X lecturas, entonces ve al paso 10

Paso 10:
   Captura color verde
   Si ha completado las X lecturas, entonces ve al paso 11

Paso 11:
   Captura color rojo
   Si ha completado las X lecturas, entonces ve al paso 12

Paso 12:
   Si se ha completado las XX muestras para hacer la media, entonces ve al paso 13
sino ve al paso 8

Paso 13:
   Realiza los cálculos y los guarda en la segunda variable
   Muestra en pantalla los resultados
   Va al paso 14

Paso 14:
   Si botón enter entonces limpia pantalla y variables y va al paso 8,
Si botón abajo entonces limpia todas las variables y va al paso 0, empieza de nuevo.
   sino no hace nada

Código en C:


// ------------------------ Para azul ---------------------------
if(paso == 2){

attachInterrupt(0, cuenta, RISING); // Activa la interrupción cuando hay un cambio de estado de subida
if(i>=nmuestra){ // Cuando ha contado "nmuestra" entonces procede a lo siguiente:
i=0; // Reinicia el contador para el próximo color
detachInterrupt(0); // Desactiva la interrupción, mientras hace los cálculos y envia a pantalla
periodo = micros() - tiempoactual; // Periodo en microsegundos que ha tardado en contar los "nmuestra" veces (contando el 0)
azul[media] = (nmuestra+1)*1000000 / (periodo); // Pasa el periodo a frecuencia.
Serial.print(azul[media]); Serial.print(" "); // Imprime por serial para comprobaciones
lcd.print(azul[media]); lcd.print(" "); // Imprime por LCD aunque va muy rápido, se puede omitir
paso++; // incrementa el paso para el siguiente y el actual no se repetirá más.
lcd.setCursor(0, 1); // Se posiciona al inicio del LCD

}
}
// ------------------------ Para verde ---------------------------
if(paso == 3){

attachInterrupt(0, cuenta, RISING); // Activa la interrupción cuando hay un cambio de estado de subida
if(i>=nmuestra){
i=0;
detachInterrupt(0); // Desactiva la interrupción, mientras hace los cálculos y envia a pantalla
periodo = micros() - tiempoactual; // Periodo en microsegundos
verde[media] = (nmuestra+1)*1000000 / (periodo);
Serial.print(verde[media]); Serial.print(" ");
lcd.print(verde[media]); lcd.print(" ");
paso++;

}
}
// ------------------------ Para rojo ---------------------------
if(paso == 4){

attachInterrupt(0, cuenta, RISING); // Activa la interrupción cuando hay un cambio de estado de subida
if(i>=nmuestra){
i=0;
detachInterrupt(0); // Desactiva la interrupción, mientras hace los cálculos y envia a pantalla
periodo = micros() - tiempoactual; // Periodo en microsegundos
rojo[media] = (nmuestra+1)*1000000 / (periodo);
Serial.print(rojo[media]); Serial.println(" ");
lcd.print(rojo[media]); lcd.print(" ");
paso++;

}
}
if(paso == 5){
// Media de 10 tomas de muestras
lcd.clear();
lcd.setCursor(0,1);
lcd.print("muestra ");
lcd.print(media);
if(media >=muestra ){
paso = 6;
}else{
paso = 1;
media++;
}
}
if(paso == 6){
Serial.println("Valores de lectura para hacer media:");
for(s=0;s<media+1;s++){
Serial.println(s);
// valorblanco = valorblanco + blanco[s];
valorazul = valorazul + azul[s];
valorverde = valorverde + verde[s];
valorrojo = valorrojo + rojo[s];
}
// Serial.print("Total valorblanco = ");Serial.println(valorblanco);
// valorblanco = valorblanco / (media+1);
Serial.println("-------- Calculo para comprobación: -----------");
Serial.print("valorblanco = valorblanco / (media+1)");
Serial.print(valorblanco); Serial.print(" = "); Serial.print(valorblanco); Serial.print(" / "); Serial.println(media+1);
Serial.println("-------------------------------------------------");
Serial.print("Total valorazul = ");Serial.println(valorazul);
valorazul = valorazul / (media+1);
Serial.print("Total valorverde = ");Serial.println(valorverde);
valorverde = valorverde / (media+1);
Serial.print("Total valorrojo = ");Serial.println(valorrojo);
valorrojo = valorrojo / (media+1);
Serial.println("Valores de calibración: ");
Serial.print(valorblanco);
Serial.print(" ");
Serial.print(valorazul);
Serial.print(" ");
Serial.print(valorverde);
Serial.print(" ");
Serial.println(valorrojo);
Serial.println("-----------------------------------------------------------");
paso++;
}
if(paso == 7){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Segunda muestra ->");
lcd.setCursor(0,1);
lcd.print("Presione enter...");
if(analogRead(akey)==key_val[4]){
paso++;
media=0;
Serial.print("Valor media puesta a cero =");Serial.println(media);
}
delay(200);
}

// ------------------------------------ Segunda muestra ---------------------------------------------------------
if(paso == 8){
/*
attachInterrupt(0, cuenta, RISING); // Activa la interrupción cuando hay un cambio de estado de subida
if(i>=nmuestra){
i=0;
detachInterrupt(0); // Desactiva la interrupción, mientras hace los cálculos y envia a pantalla
periodo = micros() - tiempoactual; // Periodo en milisegundos
blanco2[media] = (nmuestra+1)*1000000 / (periodo);
Serial.println(media);
Serial.print(blanco2[media]); Serial.print(" ");
lcd.setCursor(0, 0);
lcd.print(blanco2[media]); lcd.print(" ");
paso++;

}
*/
paso++; // Este paso se quedó dentro del IF anulado
}


// ------------------------ Para azul ---------------------------
if(paso == 9){

attachInterrupt(0, cuenta, RISING); // Activa la interrupción cuando hay un cambio de estado de subida
if(i>=nmuestra){
i=0;
detachInterrupt(0); // Desactiva la interrupción, mientras hace los cálculos y envia a pantalla
periodo = micros() - tiempoactual; // Periodo en milisegundos
azul[media] = (nmuestra+1)*1000000 / (periodo);
Serial.print(azul[media]); Serial.print(" ");
lcd.print(azul[media]); lcd.print(" ");
paso++;
lcd.setCursor(0, 1);

}
}
// ------------------------ Para verde ---------------------------
if(paso == 10){

attachInterrupt(0, cuenta, RISING); // Activa la interrupción cuando hay un cambio de estado de subida
if(i>=nmuestra){
i=0;
detachInterrupt(0); // Desactiva la interrupción, mientras hace los cálculos y envia a pantalla
periodo = micros() - tiempoactual; // Periodo en milisegundos
verde[media] = (nmuestra+1)*1000000 / (periodo);
Serial.print(verde[media]); Serial.print(" ");
lcd.print(verde[media]); lcd.print(" ");
paso++;

}
}
// ------------------------ Para rojo ---------------------------
if(paso == 11){

attachInterrupt(0, cuenta, RISING); // Activa la interrupción cuando hay un cambio de estado de subida
if(i>=nmuestra){
i=0;
detachInterrupt(0); // Desactiva la interrupción, mientras hace los cálculos y envia a pantalla
periodo = micros() - tiempoactual; // Periodo en milisegundos
rojo[media] = (nmuestra+1)*1000000 / (periodo);
Serial.print(rojo[media]); Serial.println(" ");
lcd.print(rojo[media]); lcd.print(" ");
paso++;

}
}
if(paso == 12){
// Media de 10 tomas de muestras
lcd.clear();
lcd.setCursor(0,1);
lcd.print("muestra ");
lcd.print(media);
if(media >=muestra ){
paso = 13;
}else{
paso = 8;
media++;
}
}

if(paso == 13){
for(s=0;s<media+1;s++){
Serial.println(s);
// valorblanco2 = valorblanco2 + blanco2[s];
valorazul2 = valorazul2 + azul[s];
valorverde2 = valorverde2 + verde[s];
valorrojo2 = valorrojo2 + rojo[s];
}
Serial.print("Valor media final , comprobar para operación correcta: "); Serial.println(media);
valorblanco2 = valorblanco2 / (media+1);
Serial.println("-------- Calculo para comprobación: -----------");
Serial.print("valorblanco2 = valorblanco2 / (media+1)");
Serial.print(valorblanco); Serial.print(" = "); Serial.print(valorblanco); Serial.print(" / "); Serial.println(media+1);
Serial.println("-------------------------------------------------");
valorazul2 = valorazul2 / (media+1);
valorverde2 = valorverde2 / (media+1);
valorrojo2 = valorrojo2 / (media+1);
Serial.println("Valores de resultado: ");
Serial.print(valorblanco2);
Serial.print(" ");
Serial.print(valorazul2);
Serial.print(" ");
Serial.print(valorverde2);
Serial.print(" ");
Serial.println(valorrojo2);
Serial.println("---------------------------");
Serial.println("Diferencia en % respecto calibracion:");
Serial.print("Blanco: ");
Serial.println((valorblanco2 / valorblanco)*100);
Serial.print("Azul: ");
Serial.println((valorazul2 / valorazul)*100);
Serial.print("Verde: ");
Serial.println((valorverde2 / valorverde)*100);
Serial.print("Rojo: ");
Serial.println((valorrojo2 / valorrojo)*100);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("B,G,R:");
lcd.print((valorazul2 / valorazul)*100);
lcd.setCursor(0,1);
lcd.print((valorverde2 / valorverde)*100);
lcd.print(" ");
lcd.print((valorrojo2 / valorrojo)*100);
paso++;
}
if(paso == 14){
switch(analogRead(akey)>1000){
//No hace nada hasta que apreta el botón
delay(100);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Press Enter 2a mu");
lcd.setCursor(0,1);
lcd.print("abajo para reiniciar");
}
if(analogRead(akey)==key_val[4]){ // Si presiona enter, vuelve a ver el segundo color para comparar igual con el primero. Pone a 0 los valores del segundo color
paso=8;
valorblanco2=0;
valorazul2=0;
valorverde2=0;
valorrojo2=0;
media= 0;
}else if(analogRead(akey)==key_val[2]){ // Si presiona abajo, reinicia contadores a 0 y empieza de 0
paso = 0;
valorblanco=0;
valorazul=0;
valorverde=0;
valorrojo=0;
valorblanco2=0;
valorazul2=0;
valorverde2=0;
valorrojo2=0;
media = 0;

}
}
}

Pruebas de funcionamiento:

Conclusiones y mejoras:

 

Volver al index