Paso 3: El código
Al escribir esto, estoy suponiendo que el constructor sabe cómo añadir una biblioteca a su entorno de desarrollo Arduino. Usted necesitará agregar dos bibliotecas. Aquí un Instructable que le ayudará a comenzar a utilizar un receptor de infrarrojos.
El código hace uso de dos bibliotecas necesarias y una tercera biblioteca opcional que siempre utilizo al depurar. La biblioteca de Streaming permite declaraciones de una línea rápidas que pueden enviarse a la consola de terminal.
La excelente biblioteca de IRLib es una mejora sobre varias otras bibliotecas IR en que encapsula la funcionalidad de una manera que sólo requiere un par líneas para conseguir funcionalidad IR. También cuenta con soporte para la transmisión de la IR, que no utilizo en este proyecto. Está muy bien documentada y un ejemplo del código bueno, apretado. Este es, sin duda uno para guardar en su bolsa de trucos.
Hay una empresa que hace luz tiras usando el mismo chip utilizado por la banda de Radio Shack (RIP). Su biblioteca, PololuLedStrip, proporciona una interfaz fácil de usar en cualquier tira que utiliza el chip TM1804. La biblioteca de chip también soporta otros chips utilizados por las tiras de LED más actuales.
El código está comentado, pero hay algunas cosas a destacar:
- La presetColor de la matriz es una lista de colores que se cargará al pulsar un botón del mando a distancia. Esta había programado para el botón de "Play" en la mía, pero se puede asignar a lo que te gusta. Estas se designan como valores RGB, {255, 255, 255} ser blanco más brillante y {0, 64, 0} es un verde, por ejemplo. Puede crear ajustes preestablecidos como muchos como usted quisiera. Observe que cada otro preset {0,0,0}, que esencialmente se apaga las luces. Esto es bueno para girar rápidamente la cosas por tiempo soñoliento.
- En la función loop(), verás el decodificador IR siendo llamado. Hay varios tipos de controles remotos infrarrojos por ahí, y la biblioteca de IRLib puede encontrar muchos de ellos. Usted tendrá que jugar con este código para ver exactamente lo que su control remoto está enviando para que pueda aislar los códigos y asignarlos a la funcionalidad en su programa. Hay excelente documentación en formato PDF en la biblioteca para ayudarle.
- Este mando a distancia concreto ofrece un valor único para cada botón empujado, pero cuando se mantiene pulsado el botón, envía un valor de 0xFFFFFFFF. Todo lo que necesitamos hacer es recordar el anterior código enviado y, al ver todos F, proceso sólo el último valor.
- Hay una pequeña función, playTone, que envía pulsos al altavoz. El entorno de desarrollo Arduino tiene una función de tono, pero utiliza interrupciones. Desafortunadamente, esas mismas interrupciones son utilizadas por la biblioteca de IRLib, por lo que no podemos usar el tono y IRLib en el mismo bosquejo sin modificaciones significativas a las bibliotecas. Esta función simple hace todo lo que necesitamos para esta simple aplicación sin utilizar interrupciones. Saber que cuanto mayor sea el número, menor será el tono.
- Tengo dos mandos que parecen idénticos, pero que proporcionan códigos diferentes para cada botón. No es problema cuando se usa la magia de la estructura switch/case de C. Se dará cuenta de dos casos para cada bloque. Esto indica que los códigos enviados por cada control remoto. Posiblemente podría tener una docena de mandos, cada uno dando un código diferente y atraparlos a todos con este método.
- El arriba y abajo teclas ajustar el brillo y los botones derecho e izquierdos a pie a través de la rueda de color.
- El botón de "Menú" inicia el modo de rueda de color. La idea es que utilices las teclas arriba/abajo/derecha/izquierda para conseguir el color inicial y presione el botón Menu. Los colores comenzarán a cambiar, correr todo el camino alrededor de la rueda de color hasta que se pulse otra tecla. Esto proporciona una relajante iluminación de estado de ánimo si estás en ese tipo de cosas.
- El botón de "Play" proporciona acceso rápido a los colores predefinidos que se mencionaron anteriormente.
- El programa termina con funciones de conversión para convertir entre RGB y HSV.
Los pernos que usé fueron principalmente para comodidad o hábito. Puede cambiar las clavijas a los que las distintas partes están conectadas siempre y cuando realice los cambios apropiados en el código.
HeadboardLight.h
HeadboardLight.ino
HeadboardLight.ino / / IRLib.h de IRLib-una biblioteca de Arduino para infrarrojo de codificación y descodificación < br > / / versión 1.5 junio de 2014 / / 2014 Copyright por Chris Young < a href = "http://cyborg5.com" rel = "nofollow" > http://cyborg5.com</a> #include < IRLib.h > / / Streaming.h - biblioteca de Arduino para apoyar la << operador de streaming / / Copyright (c) 2010-2012 Mikal Hart. Todos los derechos reservados. #include < Streaming.h > / / práctico biblioteca para facilitar declaraciones de depuración / Chip LED tira biblioteca. En < a href = "https://github.com/pololu/pololu-led-strip-arduino" rel = "nofollow" > http://cyborg5.com</a> #include < PololuLedStrip.h > / Biblioteca luz tira #include "HeadboardLight.h" / incluye archivo para este proyecto //#define DEBUG / global declaración de depuración. Comentario para incluir el código de depuración / / crear un objeto de receptor para escuchar en el pin 11 IRrecv My_Receiver(9); IRdecode My_Decoder; valor largo sin firmar; last_value largo sin firmar; int j; Crear un objeto ledStrip en pin 12. PololuLedStrip < 12 > ledStrip; int onboard_led = 13; sólo para que retroalimentación para asegurarse de que estamos recibiendo algo / / crear un búfer para la celebración de 10 colores. Toma 30 bytes. #define LED_COUNT 10 rgb_color colores [LED_COUNT]; color de rgb_color; Existen dos estándares de color utilizados aquí. RGB impulsa la tira de la luz, / / pero es más conveniente para hacer progresiones de rueda de color HSV. Hay / son funciones para convertir entre los dos. int hsv_h = 0; doble hsv_s = 1; doble hsv_v = 0.1; bool colorWheel = false; hsv_current de hsv_color; presets rápidas. Cada otro es apagado de una manera fácil de convertir todo apagado rgb_color presetColor [] = {{0, 0, 0}, {255, 255, 255}, {0, 0, 0}, {16, 16, 16}, {0, 0, 0}, {64, 0, 0}, {0, 0, 0}, {0, 64, 0}, {0, 0, 0}, {0, 0, 64}, {0, 0, 0}, {64, 64, 0}, {0, 0, 0}, {64, 0, 64}, {0, 0, 0} {0, 64, 64}}; char presetColorSize = sizeof (presetColor) / 3; char presetTracker = 0; int buzzPin = 7; void setup() {#ifdef DEBUG Serial.begin(9600); #endif My_Receiver.enableIRIn(); / / iniciar el color del receptor IR = hsvToRgb (hsv_h, hsv_s, hsv_v); writeLeds(color); / Asegúrese de pernos están apuntando la dirección correcta pinMode (onboard_led, salida); pinMode (buzzPin, salida);} void loop() {//Continuously Busque resultados. Cuando tienes pasarlos al decodificador Si (My_Receiver.GetResults (& My_Decoder)) {My_Decoder.decode(); //Decode los datos #ifdef DEBUG Serial << "0 x" << _HEX(value) << endl; #endif si (NEC My_Decoder.decode_type==) {valor = My_Decoder.value; #ifdef DEBUG Serial << "\t\tcase 0 x" << _HEX(value) << endl; #endif si (valor == 0xFFFFFFFF) / / presionado para repetir {valor = last_value;} #ifdef DEBUG Serial << _HEX(value) << endl; #endif switch () valor) {0x77E1D074 del caso: caso 0x77E15054: #ifdef DEBUG Serial << "hasta" << endl; #endif hsv_v += 0.05; si (hsv_v > 0,95) {hsv_v = 0.95; playTone(244);} else {playTone(122);} color = hsvToRgb (hsv_h, hsv_s, hsv_v); break; caso 0x77E1E074: caso 0x77E16054: #ifdef DEBUG Serial << «derecho» << endl; #endif hsv_h += 10; si (hsv_h > 359) {hsv_h = 0; playTone(244);} else {playTone(200);} color = hsvToRgb (hsv_h hsv_s, hsv_v); rotura; 0x77E1B074 del caso: caso 0x77E13054: #ifdef DEBUG Serial << "abajo" << endl; #endif hsv_v-= 0.05; Si (hsv_v < 0.05) {hsv_v = 0.0; playTone(244);} else {playTone(122);} color = hsvToRgb (hsv_h, hsv_s, hsv_v); rotura; 0x77E11074 del caso: caso 0x77E19054: #ifdef DEBUG Serial << "izquierda" << endl; #endif hsv_h-= 10; Si (hsv_h < 1) {hsv_h = 359; playTone(244);} else {playTone(200);} color = hsvToRgb (hsv_h, hsv_s, hsv_v); rotura; 0x77E12074 del caso: caso 0x77E1A054: #ifdef DEBUG Serial << "jugar" << endl; #endif color = presetColor [presetTracker]; ++ presetTracker; Si (presetTracker > presetColorSize) presetTracker = 0; para (j = 0; j < 2; j ++) {playTone(122); delay(20); playTone(244); delay(20);} / / valores hsv actuales para la preselección hsv_current = rgbToHsv (color.red, color.green, color.blue); hsv_h = hsv_current.h; hsv_s = hsv_current.s; hsv_v = hsv_current.v; #ifdef DEBUG Serial << "hsv(a):" << hsv_h << "," << hsv_s << "," << hsv_v << endl << "---" << endl; #endif rotura; 0x77E14074 del caso: caso 0x77E1C054: #ifdef DEBUG Serial << "menú" << endl; #endif si (colorWheel) {colorWheel = false; para (j = 1; j < = 5; j ++) {playTone(j * 20);}} else {colorWheel = true; para (j = 5; j > 0; j--) {playTone(j * 20);}} break; } last_value = valor; } writeLeds(color); My_Receiver.resume(); Reiniciar el receptor} delay(30); entrar en modo de rueda de color con corriente s y v si (colorWheel) {si (++ hsv_h > 359) hsv_h = 0; color = hsvToRgb (hsv_h, hsv_s, hsv_v); writeLeds(color); delay(20);}} anular playTone (int valor) {digitalWrite (onboard_led, HIGH); / / enciende el LED (alto es el nivel de voltaje) para (tiempo he = 0; me < 64 * 3; i ++) {/ / 1 2048 Hz = 488uS, o 244uS alta y baja 244uS para crear 50% duty ciclo digitalWrite (buzzPin, HIGH); digitalWrite (buzzPin, bajo), delayMicroseconds(value); delayMicroseconds(value);} digitalWrite (onboard_led, LOW); / / apagar el LED por lo que la tensión baja} void writeLeds (rgb_color c) {para (int me = 0; me < LED_COUNT; i ++) {.red de colores [i] = gris; .green colores [i] = c.green; .blue colores [i] = c.blue; } ledStrip.write (colores, LED_COUNT); } / / Convertir VHS a hsvToRgb de rgb_color RGB correspondiente (int h, s doble, v doble) {rgb_color rgb; / / asegurarse de que nuestros argumentos permanezcan dentro de la gama h = max (0, min (360, h)); s = max (0, min (1,0, s)); v = max (0, min (1,0, v)); if(s == 0) {/ / acromáticas (gris) rgb.red = rgb.green = rgb.blue = round(v * 255); return rgb;} doble capítulo = h / 60.0; / / sector int 0 a 5 me = floor(hs); f doble = hs - i; / / factorial parte de h p doble = v * (1 - s); doble q = v * (1 - s * f); doble t = v * (1 - s * (1 - f)); doble r, g, b; Switch(i) {caso 0: r = v; g = t; b = p; break; caso 1: r = q; g = v; b = p; break; caso 2: r = p; g = v; b = t; break; case 3: r = p; g = q; b = v; break; caso 4: r = t, g = p; b = v; break; default: / / caso 5: r = v; g = p; b = q;} rgb.red = round(r * 255.0); RGB.Green = round(g * 255.0); RGB.Blue = round(b * 255.0); volver a rgb; } / / convertir RGB a la correspondiente HSV hsv_color rgbToHsv (unsigned char r, g unsigned char, unsigned char b) {doble rd = r/255 (doble); doble gd = g/255 (doble); doble bd = b/255 (doble); doble d_h doble máximo = max (rd, max (gd, bd)), min = min (rd, min (gd, bd)); hsv_color hsv; hsv.v = max; doble d = max - min; hsv.s = max == 0? 0 : d / max; Si (== max min) {d_h = 0;} otro {si (max == rd) {d_h = (gd - bd) / d + (gd < bd? 6: 0);} else if (max == gd) {d_h = (bd - rd) / d + 2;} else if (max == bd) {d_h = (rd - gd) / d + 4;} d_h = 6;} hsv.h = d_h * 360; volver hsv; }