Paso 3: Consideraciones de Software
No proporciono todo el bosquejo aquí porque, en primer lugar, fue desarrollado para el hardware de encargo particular y por lo tanto no funcionará con el dispositivo, y en segundo lugar, porque no hay ninguna ciencia de cohetes allí – el reloj RGB básico es bastante simple (no dude en hacernos cualquier pregunta si tiene problemas, aunque). Sin embargo, hay algunas consideraciones vale la pena mencionar.
1. hacer bien RGB
El reloj RGB muestra tiempo mezclando sólo colores básicos – rojos, verdes y azules. Teniendo en cuenta que cada color básico está impulsada por su propio canal de datos de la forma de programar esto parece bastante sencilla – sólo encienda rojos durante horas, luego verde y azul para el Acta correspondiente. Mezcla de colores se hará por LED ellos mismos. ¿Simple, correcto?
Mal!
Si bien esta solución parece excelente desde el punto de vista de programación no es que se consideran bueno si visual estética y consumo de energía. Un LED RGB es esencialmente tres LEDs en un solo paquete. Esto significa que si aparece rojo, se está trabajando sólo un LED. Si cambia a amarillo, se encienden dos LEDs, y con blanco los tres están brillando. Así, el amarillo es dos veces más brillante que cualquier color básico y blanco es tres veces más brillante. Esto realmente no se ve bien (y es una de las razones VHS modelo no debe usarse nunca con LEDs, pero eso es otra historia para un próximo artículo) y usa demasiada energía – de hecho, cuando los 15 LED blanco (5:30) el aparato consumirá 900mA e incluso no trabaja fuera de un puerto USB (500 mA).
La otra razón que vas a tener que 'elegir' los colores del hecho de que los LEDs no son calibrado de color y diferentes racimos puede variar ampliamente de la manera que ellos mismos colores de la salida. Es una buena idea hacer algunos calibración de color manualmente para obtener las tonalidades del color exacto que desea, incluso cuando se trata de 7 colores aparentemente simples.
De todos modos, es mejor encender cada LED individual con valores cuidadosamente preparados. En mi bosquejo que primero calcular qué colores deben ser sobre y escribir en una pequeña matriz de bytes (con tres bits más a la derecha utilizadas), y luego enviar los valores dispuestos para el LED en consecuencia. Estos son fragmentos de código:
Preparación de bytes:
para (k = 0;
k < 15; k ++) disp15 [k] = 0; claro todos bytes
para (k = 1; k < 6; k ++)
{
Si ((hour%6) >(k-1)) {disp15 [k-1] = B100; disp15 [k + 4] = B100; disp15 [k + 9] = B100;};
}
Si (minutos < 16) para (k = 0; k
otra cosa
Si (minutos < 31)
{para (k = 0; k < 16; k ++) disp15 [k] | = B010;
para (k = 0; k <(minute-15); k ++) disp15 [k] | = B001;}
otra cosa
Si (minutos < 46)
{para (k = 0; k < 16; k ++) disp15 [k] | = B001;
para (k=(minute-30); k < 15; k ++) disp15 [k] | = B010;}
otra (k=(minute-45); k < 15; k ++) disp15 [k] | = B001;
LED de encendido:
for ( k=0; k<15; k++){ switch (disp15[k]) { case B000: setRGBpoint(k, 0, 0, 0); break; case B100: setRGBpoint(k, 3600, 0, 0); break; case B010: setRGBpoint(k, 0, 3000, 0); break; case B001: setRGBpoint(k, 0, 0, 3600); break; case B110: setRGBpoint(k, 1800, 1200, 0); break; case B011: setRGBpoint(k, 0, 2000, 1500); break; case B101: setRGBpoint(k, 1900, 0, 1700); break; case B111: setRGBpoint(k, 1200, 1000, 1000); break; } }
2. el reloj
No utilice la librería Time.h. Mientras que puede obtener el tiempo del chip RTC externo, es mullido con cosas innecesarias: está convirtiendo tu Arduino en un reloj, comiendo recursos y memoria (aproximadamente 5 Kb de él de hecho!). Sólo obtener las funciones necesarias de ella y usar wire.h biblioteca solamente.
Estas son las funciones rescatadas que deberá:
byte bcdToDec(byte val){ return ( (val/16*10) + (val%16) ); }
byte decToBcd(byte val) { return ((val/10*16) + (val%10)); }
void getTime () { Wire.beginTransmission(0x68); Wire.write(byte(0)); Wire.endTransmission(); Wire.requestFrom(0x68, 3); second = bcdToDec (Wire.read()); minute = bcdToDec (Wire.read()); hour = bcdToDec(Wire.read())%12; //12 hour time }
void setTime() { Wire.beginTransmission(0x68); Wire.write(byte(0)); Wire.write(decToBcd(second)); Wire.write(decToBcd(minute)); Wire.write(decToBcd(hour)); Wire.write(byte(0)); Wire.endTransmission(); }
No olvide #include y Wire.begin(); en setup() y en segundo lugar, declarar variables minutos y horas.
3. un botón
Se recomienda agregar un botón al reloj RGB: puede ser útil para cambios de modo de configuración o visualización de reloj si tiene más de uno. En mi proyecto el botón se utiliza para el cambio de modos (pulsación corta), configuración (pulsación larga 1 segundo) y configuración de brillo (más prensa, 2 segundos). También hay una configuración de orientación (selección de qué lado del reloj es en la parte inferior): se enciende por dos pulsaciones cortas seguidos por uno largo. Para hacer materias más simple que puede considerar usar más de un botón.
Esto conduce a una cuestión de combinar la visualización de tiempo con esperando presiona un botón. Una vez más, la respuesta correcta programación (asignación de una interrupción para el botón) no es necesariamente correcta en nuestro caso. ¿Qué pasa si usted quiere leer algún sensor – por ejemplo, un fotoresistor – para cambiar el comportamiento del dispositivo? ¿Qué pasa si desea controlar el dispositivo con un control remoto IR?
Como esto no está estrictamente relacionado con el particular proyecto de reloj RGB simple de este instructable voy a ser breve. Las rutinas de visualización en mis proyectos no se coloca en a sí mismos: ellos sólo configura una pantalla y luego devolver el control al ciclo principal loop() que hace cosas como comprobación de botones o sensores o cualquier otra cosa, entonces lazos y llama otra vez la visualización. Yo uso un modeCounter variable global para realizar un seguimiento de la posición actual de la visualización para los modos de animación (básicamente es el mismo que for(,,,) pero sin el lazo contenido). Los detalles son realmente la materia para otro artículo, esperanza ayudará a este pequeño fragmento de código (y otra vez, no dude en preguntar).