Paso 4: Código de IDE de Arduino
La codificación no es demasiado difícil de armar. La primera sección del código incluye las librerías necesarias, define cuál será pins utilizado, inicializa algunos valores y crea los objetos para cada pieza a controlar.
#include <Adafruit_Neopixel.h> #include <avr/power.h> #include <StepperAK.h> #include <IRremote.h>
#define LEDPin 5 //LED strip pin 5 #define gearratio 64 //1:64 gear ratio for stepper motor #define NUMPIXELS 60 // How many NeoPixels are attached to the Arduino #define Pin1 8 //These set the pins for the Stepper Motor #define Pin2 9 #define Pin3 10 #define Pin4 11 Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUMPIXELS, LEDPin, NEO_GRB + NEO_KHZ800);//This creates the Neopixel object strip int delayt = 500; // delay for half a second const int stepsPerRevolution = 2048;//2048 steps turn the motor one revolution Stepper myStepper(stepsPerRevolution, Pin1, Pin2, Pin3, Pin4);//Creates the Stepper Motor object int RECV_PIN = 3; //IR Receiver connected to Pin 3 IRrecv irrecv(RECV_PIN); //Create a IR receiver object decode_results results; //Create a decode_results object
La parte de configuración del código simplemente permite que el sensor de infrarrojos, engranajes del motor paso a paso e inicializa todos los LEDs a un estado apagado.
void setup() { irrecv.enableIRIn(); //Enables the IR device myStepper.setSpeed(0.15*gearratio); //the motor appears to be geared down 1/64, strip.begin(); strip.show(); // Initialize all pixels to 'off' }
En la sección de bucle, usé anidadas Si cuentas cada vez que una señal fue recibida por el sensor de infrarrojos, descifra lo que señal era y hace la operación correspondiente a esa señal. Para cada resultado de la señal si declaración, tengo un par lógico u operadores, el primero es para el Arduino kit remoto, las segunda y terceros son para el mando de Xbox 360. La razón que tengo dos señales diferentes para el 360 remoto es porque una señal diferente se pone hacia fuera si mantenemos pulsado el botón en lugar de simplemente presionando. Yo he codificado esto en el programa para acomodar esta discrepancia de señal. Las funciones en la parte inferior son proporcionadas por Adafruit, y puede ser fácilmente modificados dependiendo de lo que quieres para hacer con la tira de LED.
void loop() { if (irrecv.decode(&results)) {//has a transmission been received? if (results.value == 2148529177 || results.value == 2148496409 || results.value == 16738455){ //If the "0" button or the "stop" button is pressed, the LEDs all turn off. colorWipe(strip.Color(0,0,0), 20); } irrecv.resume(); // Receive the next value from the IR Sensor } if (irrecv.decode(&results)) {//has a transmission been received? if (results.value == 2148529164 || results.value == 2148496396 || results.value == 16753245){ //If the power button is pressed the LEDs all initialize to red colorWipe(strip.Color(255,0,0), 20); } irrecv.resume(); // Receive the next value from the IR Sensor } if (irrecv.decode(&results)) {//has a transmission been received? if (results.value == 2148529171 || results.value == 2148496403 || results.value == 16724175){ //If the "1" Button or the "x" button is pressed do the following: colorWipe(strip.Color(0,0,255), 20); } irrecv.resume(); // Receive the next value from the IR Sensor } if (irrecv.decode(&results)) { if (results.value == 2148496422 || results.value == 2148529190 || results.value == 16718055){ //If the "2" or "y" Button is pressed do the following: colorWipe(strip.Color(255,255,255), 20); } irrecv.resume(); } if (irrecv.decode(&results)) { if (results.value == 2148529185 || results.value == 2148496417 || results.value == 16743045) { //If the "3" button or "right arrow" is pressed do the following: theaterChaseRainbow(50); } irrecv.resume(); } if (irrecv.decode(&results)) { if (results.value == 2148529184 || results.value == 2148496416 || results.value == 16716015) { //If the "4" button or "left arrow" button is pressed do the following: rainbow(50); } irrecv.resume(); }
if (irrecv.decode(&results)) { if (results.value == 2148496418 || results.value == 2148529186 || results.value == 16726215) { //If the "5" button or "Ok" is pressed do the following: myStepper.step(stepsPerRevolution); //Rotates the stepper motor 1 revolution myStepper.step(stepsPerRevolution); } irrecv.resume(); } } // Fill the dots one after the other with a color<br>void colorWipe(uint32_t c, uint8_t wait) {
for(unit16_t I=0; I<strip.numPixels(); I++) {
strip.setPixelColor(i, c);
strip.show();
delay(wait);
}
}
Arrastrándose en estilo teatro luces con arco iris efecto void theaterChaseRainbow (uint8_t esperar) {para (int j = 0; j < 256; j ++) {/ ciclo todos los 256 colores en la rueda de (int q = 0 q < 3; q ++) {para (int i = 0; me < strip.numPixels(); i = i + 3) {strip.setPixelColor (i + q, rueda ((i + j) % 255)); //turn cada píxel tercera en} //Theatre-style crawling lights with rainbow effect void theaterChaseRainbow(uint8_t wait) { for (int j=0; j < 256; j++) { // cycle all 256 colors in the wheel for (int q=0; q < 3; q++) { for (int i=0; i < strip.numPixels(); i=i+3) { strip.setPixelColor(i+q, Wheel( (i+j) % 255));//turn every third pixel on } strip.show(); delay(wait); for (int i=0; i < strip.numPixels(); i=i+3) { strip.setPixelColor(i+q, 0); //turn every third pixel off } } } } // Input a value 0 to 255 to get a color value. // The colours are a transition r - g - b - back to r. uint32_t Wheel(byte WheelPos) { WheelPos = 255 - WheelPos; if(WheelPos < 85) { return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3); } else if(WheelPos < 170) { WheelPos -= 85; return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3); } else { WheelPos -= 170; return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0); } } void rainbow(uint8_t wait) { uint16_t i, j; for(j=0; j<256; j++) { for(i=0; i<strip.numPixels(); i++) { Delay(Wait); para (int i = 0; i < strip.numPixels(); i = i + 3) {strip.setPixelColor (i + q, 0); //turn cada tercer pixel apagado strip.setPixelColor(i, Wheel((i+j) & 255); } } } / / Un valor de 0 a 255, para obtener un valor de color. Los colores son una transición r - g - b - a r. rueda de uint32_t (bytes WheelPos) {WheelPos = 255 - WheelPos; if(WheelPos < 85) {return tira. Color (255 - WheelPos * 3, 0, WheelPos * 3); strip.show(); otra cosa if(WheelPos < 170) {WheelPos-= 85; tira de vuelta. Color (0, WheelPos * 3, 255 - WheelPos * 3); delay(wait); Else {WheelPos-= 170; tira de vuelta. Color (WheelPos * 3, 255 - WheelPos * 3, 0); }
}