Esta tarde he estado practicando un poco. Es lo que tiene estar encerrado en casa... Bueno, no voy a desvelar lo que tengo en la cabeza... Todavía, pero aquí va un preliminar. Un control con un potenciómetro de los colores de un LED RGB (cátodo común). Más información en https://www.prometec.net/rgb-led/
El chasco es que la mezcla de colores no es "color mezcla"; o al menos a mí no me lo parece. La mezcla, por ejemplo, de azul y verde no da amarillo, en el sentido de que, al menos, no es esa la apariencia sino dos luces verdes y azules juntas. Pero en fin. Otros tonos parecen más acertados.
La idea es tener un color progresivo con el potenciómetro desde el rojo al verde. No sé si lo he logrado mucho, pero por lo menos funciona.
Código arduino
long valor = 0; // valor de entrada del potenciómetro analógico
int pinElegido[]={3,5,6}; // valores de los pins
float colorIntermedio[]={10.0,100.0,100.0}; // colores que se alcanzan en el valor intermedio (1) RGB
int numPin = 2;
void setup() {
pinMode(3,OUTPUT); // salidas analógicas
pinMode(5,OUTPUT); // salidas analógicas
pinMode(6,OUTPUT); // salidas analógicas
Serial.begin(9600);
}
void loop() {
valor = analogRead(A0);
encender(valor); // devuelve un número entre 0 y 2 con la situación del valor
delay(250);
}
// *********
// Funciones
// *********
void encender(long dato) {
int valores = map(dato,0,920,0,900); // depuración del rango... El sensor no da más de 920 (ver cuando cambie de sensor)
int cual = map(dato,0,920,0,10); // Elijo cual es el que me corresponde... Pero a lo mejor no hace falta
float x = valores / 450.0; // paso a las x los valores, entre 0 y 2 (máximo se toma 900).
// Funcion parabólica para el rojo
float red = (127.5-colorIntermedio[0])*x*x+(2*colorIntermedio[0]-382.5)*x+255.0; // esta función calcula los valores de rojo, pasando por los colores 255 en 0,colorIntermedio[0] en 1 y 0 en 2
red=red*(red>=0.0); // corta los valores negativos y los pone a cero
// **********************************
// Función exponencial para el verde
// **********************************
float Agreen= (colorIntermedio[1]*colorIntermedio[1])/(2.0*colorIntermedio[1]-255.0);
float Cgreen = log(1.0-colorIntermedio[1]/Agreen);
// Serial.print(Agreen,6); Serial.print(" -- " ); Serial.print(Cgreen,6);
float green = Agreen*(1-exp(Cgreen*x));
// float green = (127.5-colorIntermedio[1])*x*x+(2*colorIntermedio[1]-127.5)*x+0.0; // esta función calcula los valores de verde, pasando por los colores 0 en 0,colorIntermedio[1] en 1 y 0 en 2
// green=green*(green>=0.0); // corta los valores negativos y los pone a cero
float blue = -colorIntermedio[2]*x*x+2*colorIntermedio[2]*x; // esta función calcula los valores de azul, pasando por los colores 0 en 0,50 en 1 y 0 en 2
blue=blue*(blue>=0.0); // corta los valores negativos y los pone a cero
analogWrite(pinElegido[0],(int) red); // Escribo en el pin primero el valor de los rojos. Valor absoluto corta los valores negativos
analogWrite(pinElegido[1],(int) green); // Escribo en el pin primero el valor de los rojos
analogWrite(pinElegido[2],(int) blue); // Escribo en el pin primero el valor de los rojos
/*
for (int i=0;i<=2;i++) {
analogWrite(pinElegido[i],colores[cual][i]); //en cada pin Red 3, Green 5, Blue 6 se escribe los valores de "cual" he escogido
} */
// Serial.println((String) cual +" : "+ (String) colores[cual][0] +":" +(String) colores[cual][1] +":"+ (String) colores[cual][2] ) ;
Serial.println((String) dato +" --> "+ (String) x +" : "+ (String) red +":" +(String) green +":"+ (String) blue + " cualitativo: " + (String) cual ) ;
}
Saludos, una duda, mediante este sketch se puede conseguir generar las 16,7 millones de combinaciones posibles con el RGB??? Espero una respuesta, gracias de antemano.
ResponderEliminar