Lightsaber Arduino, Neopixeles

by vel21351 in Circuits > Arduino

178 Views, 0 Favorites, 0 Comments

Lightsaber Arduino, Neopixeles

WhatsApp Image 2021-09-24 at 11.13.30 PM.jpeg

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

LLightsber

Video

Materiales

materiales a.jpeg

-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

circuitos proyecto.jpeg
WhatsApp Image 2021-09-30 at 8.25.58 AM.jpeg

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

_Diagrama de flujo.png

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);      }}