LED RGB - Desvanecimiento entre colores aleatorios

1

Estoy intentando generar un valor RGB de color aleatorio - > iluminar RGB led - > espere 5 minutos - > generar el siguiente color aleatorio - > se desvanecen del color antiguo al nuevo.

  • Para mostrar el color en el LED, estoy usando una salida PWM de 3 canales en ATMEGA8.
  • Para generar el color aleatorio, estoy usando TIMER0 como valor semilla y luego generando un valor aleatorio según la fórmula return (unsigned char)(rand()/(RAND_MAX/255 + 1)); para los 3 canales.

Ahora, como también quiero mostrar los colores intermedios (usando PWM), esto es lo que estoy pensando hacer:

  • pasos de transición totales = 500
  • tiempo para mostrar cada color intermedio = 5 ms
  • redStep = (finalred - initalred) / 500 (igual para verde y azul)
  • para bucle (1 a 500): muestre color intialred + (counter * redStep)

Mi pregunta es: ¿es esta la mejor manera de hacer la transición entre los colores para producir los colores más agradables estéticamente (sin parpadeos, etc.)? ¿Alguna idea sobre el número de pasos de transición y el tiempo de espera?

    
pregunta Ankit

3 respuestas

4

Probablemente será más agradable desde el punto de vista estético la transición entre colores utilizando el espacio de color HSV.

    
respondido por el Mariano Alvira
4

Usted usa lo que se llama interpolación lineal (o alguna otra forma).

Si A es su valor de inicio y B es su valor de parada, entonces

f(t) = (1 - t)*A + tB

Es una función que tiene el valor inicial, t = 0, de A y el valor de parada, t = 1, de B.

También puede usar otras funciones, si se desvanece diferente, en general,

f(t) = (1 - g(t))*A + g(t)*B

funcionará para cualquier g (t) siempre que g (0) = 0 y g (1) = 1.

entonces, g (t) = t ^ n funcionará y n controlará la "velocidad" o la "velocidad" del desvanecimiento.

Entonces, en su caso, para interpolación lineal,

t = counter*Step
Current_Red = (1 - t)*Starting_Red + t*Final_Red

Tenga en cuenta cuando contador = 0 luego Current_red = Starting_Red y cuando counter = valor final luego CurrentRed = Final_Red.

Obviamente, cuando t = 1, entonces 1 = contador * Paso, de modo que se pueda calcular el valor del contador final, que dependerá del tamaño del paso.

Es posible que desee utilizar diferentes valores de interpolación, ya que percibimos los componentes de los colores de manera diferente. Si los desvanece de todos modos, puede que no parezca tan natural.

Es probable que necesites actualizar al menos 30 veces por segundo aproximadamente. No sé si el ojo percibirá pequeños cambios como estos durante 5 minutos. Probablemente podrías cambiar el color una vez por segundo y nadie sabrá ninguna diferencia, a menos que los colores estén muy separados.

En cualquier caso, tiene la capacidad de ajustar los parámetros con bastante facilidad. Intenta una vez por segundo y si no te gusta, aumenta la velocidad. No es un gran problema.

    
respondido por el JonSlaughter
0

Las transiciones de luz dependen del estado de ánimo de la pantalla y del rango de efectos que puede producir.

Una transición estimulante podría acelerarse e ir a través de una saturación completa rápida o cambios suaves de la rueda de color de transición como una rueda de juego de carnaval y detenerse en el nuevo color aleatorio en unos pocos segundos.

Con una distracción mínima, una transición lenta podría interpolar los puntos de inicio y finalización RGB e incrementar el cambio en 5 segundos para evitar incidentes de tráfico.

Un efecto interesante puede alternar entre el color actual y el siguiente con un ciclo de trabajo que cambia lentamente, mientras que realiza una transición más rápida en medio del barrido con un tiempo de transición total de 1 a 5 segundos.

En cualquier caso, debe evitarse el parpadeo a toda costa, lo que es más irritante que estimulante (a menos que sea un adolescente) y use un PWM > 500 Hz.

Comentarios laterales: added

La pantalla más estimulante que recuerdo no era el uso de LED sino el uso de un televisor grande modificado para mostrar la música cuadrafónica en los 4 colores RGBY y modificó la pantalla en un vector con amplitud de cada color proporcional al registro de cada amplitud y cada uno. El color XY vector comienza en el centro de la pantalla y se desplaza radialmente a 90 grados de compensación. El resultado fue ver lo que escuchaste con muchos bucles y colores. Pero eso fue en 1970 antes de que los LED fueran populares.

Tengo una cadena de LED de luz XMAS con 20 efectos de transición controlados por un chip de un solo chip y un interruptor momentáneo para incrementar su elección de efectos, que son muy variados.

También tengo un archivo gif, hecho para simular transiciones suaves de la iluminación de la rueda de color de la iluminación exterior de un templo, pero no se puede insertar aquí.

    
respondido por el Tony EE rocketscientist

Lea otras preguntas en las etiquetas