Lightsaber Arduino, Neopixeles
Le Lightsaber fue un reto realizarlo y tiene cosas muy interesantes, al encender este proyecto, tenemos 3 sensores implementados junto con una función automática, que gracias a una serie de botones podemos alternar entre ellas. El primer botón es el de inicio, este uno lo puede apagar y encender; luego tenemos el modo manual donde podemos hacer que cambia de color y nuevamente podemos volverlo a apagar y encender.
Luego cambiamos de modo utilizando los sensores que se implementaron, estos serian:
Sensor de temperatura: este vuelve la tira led de color azul para indicar que esta encendido, luego se mantiene azul si esta a menos de 22°C y rojo si esta a más de 22°C.
Sensor ultrasónico: este detecta las distancias en un rango de 1metro hasta 3 centímetros, este tiene un color verde si se supera 60 centímetros, luego entre 60cm y 20cm cambia a color amarillo, y a menos de 10cm se vuelve rojo y si la distancia es menor a 10cm, este se apaga.
Sensor IR: Este detecta un control remoto, gracias a un control, dependiendo del numero que seleccionemos, podríamos cambiar el color de la iluminación y el estilo del iluminado.
Funcionamiento
Video
Materiales
-Arduino uno
-4 botones
-Tira de neopixeles de 60
-Sensor Ultrasónico
-Sensor IR
-Control remoto
-2 Protoboard
-Sensor de temperatura
-25 jumpers para protoboard
-Espuma
-Tijeras
-Cautín
-Tubo de cartón
-Cinta de aislar
-Estaño
-Crimper
-Cable de impresora
-Enchufe de teléfono
Diagrama Esquemático Del Circuito Electrónico
Construcción De La Lampara
Al construir este Lightsaber, le llevara tiempo y es un poco complicado al momento de estarlo realizando, por lo que les presento técnicas para poder hacer tu propio Lightsaber.
- Obtener los materiales del "Step 2"
- Se puede utilizar un Arduino uno y la aplicación que nos ayudara a poder programar y donde colocaremos le código que más abajo te proporcionaremos.
- Crea el circuito en físico, que te mostramos con un diagrama en el "Step 3"
- Ya después de esto, abre el Programa de Aduino, que podas conseguirlo en este link: https://www.arduino.cc/en/software
- Luego de todo esto, pega el código que esta en el "Step 6" y súbelo a la placa que conectaste a la computadora que estas utilizando.
- Luego de ya tener todo eso solo es de pegar la tira de Neopixeles alrededor del tubo de cartón.
- Y luego a disfrutar!
Diagrama De Flujo
Codigo
//Librerías a utilizar#include <Adafruit_NeoPixel.h>#include <NewPing.h>#include "DHT.h"#include <IRremote.h>#ifdef __AVR__ #include <avr/power.h> #endif//Variables generalesint NUMPIXELS=59; //Número de leds conectadosint PIN=2; //Pin donde está conectada la tira de ledsAdafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);//Variables encendido y apagadoconst int boton = 3;int contador = 0;//Variables modo manualconst int btnManual = 4;int contador2 = 0;//Variables cambio de modoconst int btnModo = 5;int contador3 = 2;//Botón para identificar qué sensor activar y que no se revuelvanconst int btnCambioSensor = 6;int contador4 = 0;//Variables sensor ultrasónico#define TRIGGER_PIN 7 #define ECHO_PIN 8 #define MAX_DISTANCE 200NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);int distance = 0;//Variable sensor infrarrojoint RECV_PIN = 10;//Pin de conexion del sensor de temperatura#define DHTPIN 9//Tipo de sensor utilizado#define DHTTYPE DHT11//Definicion del objeto dhtDHT dht(DHTPIN, DHTTYPE);void setup() { #if defined(__AVR_ATtiny85__) && (F_CPU == 16000000) clock_prescale_set(clock_div_1); #endif IrReceiver.begin(RECV_PIN, ENABLE_LED_FEEDBACK); Serial.println("Activadr IRin"); pinMode(boton, INPUT_PULLUP); pinMode(btnManual, INPUT_PULLUP); pinMode(btnModo, INPUT_PULLUP); pinMode(btnCambioSensor, INPUT_PULLUP); Serial.begin(9600); pixels.begin(); // Inicialización}void loop() { //Lectura de los botones, si presionan el de encendido y apagado que a el contador se le sume 1 if ((digitalRead(boton) == LOW) && (digitalRead(btnManual) == HIGH) && (digitalRead(btnModo) == HIGH) && (digitalRead(btnCambioSensor) == HIGH)){ delay(250); contador++; if ((contador % 2)!=0){ pixels.clear(); // Apagar neopixels inicio(); } else if((contador % 2)==0){ finalizar(); contador = 0; contador2 = 0; contador3 = 2; contador4 = 0; int distance = 0; //Inicializar variables } } if ((digitalRead(boton) == HIGH) && (digitalRead(btnManual) == LOW) && (digitalRead(btnModo) == HIGH) && (digitalRead(btnCambioSensor) == HIGH) && ((contador % 2)!=0) && ((contador3 % 2)==0)){ delay(250); contador2++; if (contador2 == 1){ ModoManual(255,0,20); } if (contador2 == 2){ ModoManual(153,255,0); } if (contador2 == 3){ ModoManual(255,51,255); } if (contador2 == 4){ ModoManual(255,80,0); } if (contador2 == 5){ contador2 = 0; ModoManual(85,255,255); } } distance = (sonar.ping_cm()); if ((digitalRead(boton) == HIGH) && (digitalRead(btnManual) == HIGH) && (digitalRead(btnModo) == LOW) && (digitalRead(btnCambioSensor) == HIGH) && ((contador % 2)!=0)){ delay(250); //Contador para saber que cambió a modo automático contador3++; finaall(); }}void finaall(){ do { condicion(); SensorIR(); Temperatura(); } while (contador3 % 2 != 0); }//Funciones de inicio y finalvoid inicio(){ for(int i=0; i<=NUMPIXELS; i++) { pixels.setPixelColor(i, pixels.Color(0, 175, 175)); pixels.show(); //Cargarlo en el hardware delay(30); //Pausa } }void finalizar(){ for(int i=NUMPIXELS; i>=0; i--) { pixels.setPixelColor(i, pixels.Color(0, 0, 0)); pixels.show(); //Cargarlo en el hardware delay(30); //Pausa } }//Función del modo manualvoid ModoManual(int a, int b,int c){ for(int i=0; i<=NUMPIXELS; i++) { pixels.setPixelColor(i, pixels.Color(a, b, c)); pixels.show(); //Cargarlo en el hardware delay(30); //Pausa } }//Funciones sensor ultrasónicovoid condicion(){ distance = (sonar.ping_cm()); if (distance > 99 || distance == 0){ green(); }else if (distance < 60 && distance > 20){ yellow(); }else if (distance < 20 && distance >10){ red(); }else if (distance < 10){ stopp(); }else { off(); }delay (100); }void green(){ for(int c=0;c<256;c++){ for(int i=0;i<NUMPIXELS;i++){ pixels.setPixelColor(i, pixels.Color(0,c,0)); } pixels.show(); delay(10); }}void yellow(){ for(int c=0;c<256;c++){ for(int i=0;i<NUMPIXELS;i++){ pixels.setPixelColor(i, pixels.Color(c,c,0)); } pixels.show(); delay(5); }}void red(){ for(int c=0;c<256;c++){ for(int i=0;i<NUMPIXELS;i++){ pixels.setPixelColor(i, pixels.Color(c,0,0)); } pixels.show(); delay(5); }}void stopp(){ for(int i=0;i<NUMPIXELS;i++){ pixels.setPixelColor(i, pixels.Color(200,0,0)); pixels.show(); } delay(50); for(int i=0;i<NUMPIXELS;i++){ pixels.setPixelColor(i, pixels.Color(0,0,0)); pixels.show(); }}void off(){ for (int i = 0;i<NUMPIXELS;i++){ pixels.setPixelColor(i, pixels.Color(0,0,0)); pixels.show(); }}//Funciones sensor IRvoid SensorIR(){ if (IrReceiver.decode()){ Serial.println(IrReceiver.decodedIRData.decodedRawData, DEC); if (IrReceiver.decodedIRData.decodedRawData == 3041591040){ //9 whiteOverRainbow(75, 5); } else if (IrReceiver.decodedIRData.decodedRawData == 4077715200){ //1 rainbowFade2White(3, 3, 1); } else if (IrReceiver.decodedIRData.decodedRawData == 3877175040){ //2 CicloColor(); } else if (IrReceiver.decodedIRData.decodedRawData == 2707357440){ //3 ModoManual(0,255,255); } else if (IrReceiver.decodedIRData.decodedRawData == 4144561920){ //4 CiclosColores(pixels.Color(127, 127, 127), 50); } IrReceiver.resume(); }}void whiteOverRainbow(int whiteSpeed, int whiteLength) { if(whiteLength >= pixels.numPixels()) whiteLength = pixels.numPixels() - 1; int head = whiteLength - 1; int tail = 0; int loops = 3; int loopNum = 0; uint32_t lastTime = millis(); uint32_t firstPixelHue = 0; for(;;) { for(int i=0; i<pixels.numPixels(); i++) { if(((i >= tail) && (i <= head)) || ((tail > head) && ((i >= tail) || (i <= head)))) { pixels.setPixelColor(i, pixels.Color(0, 0, 0, 255)); } else { int pixelHue = firstPixelHue + (i * 65536L / pixels.numPixels()); pixels.setPixelColor(i, pixels.gamma32(pixels.ColorHSV(pixelHue))); } } pixels.show(); firstPixelHue += 40; if((millis() - lastTime) > whiteSpeed) { if(++head >= pixels.numPixels()) { head = 0; if(++loopNum >= loops) return; } if(++tail >= pixels.numPixels()) { tail = 0; } lastTime = millis(); } }}void rainbowFade2White(int wait, int rainbowLoops, int whiteLoops) { int fadeVal=0, fadeMax=100; for(uint32_t firstPixelHue = 0; firstPixelHue < rainbowLoops*65536; firstPixelHue += 256) { for(int i=0; i<pixels.numPixels(); i++) { uint32_t pixelHue = firstPixelHue + (i * 65536L / pixels.numPixels()); pixels.setPixelColor(i, pixels.gamma32(pixels.ColorHSV(pixelHue, 255, 255 * fadeVal / fadeMax))); } pixels.show(); delay(wait); if(firstPixelHue < 65536) { if(fadeVal < fadeMax) fadeVal++; } else if(firstPixelHue >= ((rainbowLoops-1) * 65536)) { if(fadeVal > 0) fadeVal--; } else { fadeVal = fadeMax; } } for(int k=0; k<whiteLoops; k++) { for(int j=0; j<256; j++) { pixels.fill(pixels.Color(0, 0, 0, pixels.gamma8(j))); pixels.show(); } delay(1000);//1 SEGUNDO for(int j=255; j>=0; j--) { // Ramp down 255 to 0 pixels.fill(pixels.Color(0, 0, 0, pixels.gamma8(j))); pixels.show(); } } delay(500);}void CicloColor(){ pixels.clear(); for(int i=0; i<NUMPIXELS; i++) { pixels.setPixelColor(i, pixels.Color(0, 150, 0)); pixels.show(); delay(10); }}void CiclosColores(uint32_t color, int wait) { for(int a=0; a<10; a++) { for(int b=0; b<3; b++) { pixels.clear(); for(int c=b; c<pixels.numPixels(); c += 3) { pixels.setPixelColor(c, color); } pixels.show(); delay(wait); } }}//Función sensor de temperaturavoid Temperatura(){ delay(1500); float h = dht.readHumidity(); // Read temperature as Celsius (the default) float t = dht.readTemperature(); if (t>=22 && t<30){ ModoManual(255,0,0); }else if (t<22 && t>=10){ ModoManual(0,0,255); }}