LED RGB: se desvanece entre colores aleatorios

Estoy tratando de generar un valor RGB de color aleatorio -> encender el LED RGB -> esperar 5 minutos -> generar el siguiente color aleatorio -> desvanecerse del color antiguo al color 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 inicial y luego genero un valor aleatorio de acuerdo con la fórmula return (unsigned char)(rand()/(RAND_MAX/255 + 1));para los 3 canales.

Ahora que 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 = 5ms
  • redStep = (finalred - initalred)/500 (lo mismo para verde y azul)
  • for loop (1 a 500): muestra el color inicial rojo + (contador * paso rojo)

Mi pregunta es, ¿es esta la mejor manera de hacer la transición entre 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?

Respuestas (3)

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

¿Por qué sería eso? ¿Puedes explicar un poco más?
juegue con esta rueda de colores: colorschemedesigner.com probablemente lo que usted piensa como transición entre colores es moverse alrededor de la rueda de colores (que está cambiando HUE). Este es bueno para que veas la saturación: colorpicker.com , que será importante si quieres lidiar con el blanco.
Realmente no estoy de acuerdo. Según mi propia experimentación, si va a elegir colores aleatorios y luego interpolar entre ellos, entonces usar el espacio de color RGB está perfectamente bien. Sin embargo, lo único que debe hacer es calcular la distancia euclidiana entre las dos coordenadas de color y usarla para calcular la duración de la transición de color. De esta manera, se está moviendo a través del espacio de color RGB a una velocidad constante. Esto hace que la transición de color sea bastante suave en mis pruebas. En todo caso, HSL y HSV parecían menos.

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

Si A es su valor inicial y B es su valor final, entonces

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

Es una función que tiene el valor inicial, t = 0, de A y el valor final, 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 "velocidad" de desvanecimiento.

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

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

Tenga en cuenta que cuando el contador = 0, entonces Current_red = Starting_Red y cuando el contador = valor final, CurrentRed = Final_Red.

Obviamente, cuando t = 1, entonces 1 = contador*Paso, por lo que se puede calcular el valor final del contador, 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 desvaneces de todos modos, es posible que no se vea tan natural.

Probablemente necesite actualizar al menos 30 veces por segundo más o menos. No sé si el ojo percibirá pequeños cambios como estos a lo largo de 5 mins. Probablemente podría cambiar el color una vez por segundo y nadie notará la diferencia, a menos que los colores estén muy separados.

En cualquier caso, tienes la posibilidad de ajustar los parámetros con bastante facilidad. Prueba una vez por segundo y si no te gusta, aumenta la velocidad. No es un gran trato.

así que estaba pensando en la línea correcta. Punto interesante sobre el ojo que no percibe todos los canales por igual.

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

Una transición estimulante puede acelerarse y pasar por una saturación total rápida o cambios suaves en la rueda de colores como una rueda de juegos de carnaval y detenerse en el nuevo color aleatorio en unos pocos segundos.

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

Un efecto interesante podría alternar entre el color siguiente y el actual con un ciclo de trabajo que cambia lentamente mientras se hace 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, hay que evitar a toda costa el parpadeo que es más irritante que estimulante (salvo que seas adolescente) y utilizar un PWM > 500 Hz.

Comentarios secundarios: agregado

La pantalla más estimulante que recuerdo no fue usar LED sino usar un televisor grande modificado para mostrar música cuadrafónica en los 4 colores RGBY y modifiqué la pantalla en un vector de alcance con amplitud de cada color proporcional al registro de cada amplitud y cada vector de color XY comenzando en el centro de la pantalla y yendo radialmente en compensaciones de 90 grados. 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 LED de luz XMAS con 20 efectos de transición controlados por un micro de un solo chip y un interruptor momentáneo para incrementar su elección de efectos, que son de gran alcance.

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