loader image

Luces de policía con Arduino y tira de LED WS2812

Arduino Proyectos 0
Luces de policía proyecto con Arduino UNO. Cómo hacerlo

Crea tu propia réplica de las luces de los coches de policía que se utilizan en la mayor parte de América. Podrás saber lo que pasa en el techo de una patrulla cuando el sheriff presiona el botón.

Desde luego esto se puede reproducir con la tira LED WS2812 y una placa Arduino. Aquí te mostramos cómo hacerlo.

Materiales

Elementos y componentes

  • Arduino UNO

    Tabla protoboard

    Cable o jumpers

    1 resistencia de 470 Ohm (o aproximada)

    WS2812 LED-Strip (8 LEDs son suficientes)

    1 condensador 1000µF

  • Software, aplicaciones y servicios online

  • Arduino IDE

  • Diagrama del circuito

    El circuito consiste en un Arduino UNO. El pin 6 digital está conectado al pin DI (Data In) de la tira LED a través de una resistencia de 470 Ohm.

    La tierra GND de la cinta led está conectada a la tierra GND del Arduino.

    Solamente se usan 8 LEDs en este ejemplo. Por lo tanto, los 5V+ de la tira de LED también se pueden conectar directamente a los 5V+ de la placa Arduino.

    Opcionalmente, se puede utilizar una fuente de alimentación externa, por ejemplo, una batería, un powerbank o una fuente de alimentación.

    Esto es especialmente recomendado si se están usando muchos LEDs de una tira WS2812.

    Código

    El programa Arduino requiere la librería Adafruit NeoPixel. Ésta debe ser instalada en el software de Arduino.

    Para ello, dirígete a «Programa / Incluir Librería / Administrar Bibliotecas» en el IDE de Arduino e introduce NeoPixel en el campo de búsqueda. Instala la librería Adafruit NeoPixel en su versión más reciente.

    • El programa utiliza un arreglo multidimensional para mostrar la animación.
    • El parpadeo de los LEDs no es otra cosa que una animación en 8 píxeles.

    Este arreglo almacena los valores de color (RGB) para 8 píxeles para cada fase de animación.

    frame [Fase de animación] [Número de LED] [Color]

    En esta práctica se utilizaron 19 fases de animación. Cada fase de animación también tiene una duración de animación, es decir, un valor que determina cuánto tiempo debe mostrarse dicha fase de animación.

    Esto es importante porque, por ejemplo, el parpadeo blanco de los LEDs sólo debe ocurrir durante un tiempo muy corto, mientras que el parpadeo alterno rojo-azul debe demorar más tiempo.

    Aprende también sobre:  COVID-19 Dispensador de jabón automático con Arduino

    Se probaron las fases de animación y las duraciones de la animación hasta que el resultado fuera lo más cercano a unas luces de policía.

    Volviendo al código, en el bucle o loop se llama primero el método police1. Luego, se muestra la fase de animación actual en los LEDs y se espera la duración de la animación.

    Entonces el contador de la animación FrameCurrent se incrementa en 1 (++). Ahora, se comprueba si el contador de animación es mayor que la fase máxima de animación (frameMax). Si este es el caso, el contador de la animación se reinicia a 0 y la animación comienza de nuevo.

    #include <Adafruit_NeoPixel.h>
    
    #define LED_PIN 6
    #define LED_COUNT 8
    
    Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);
    
    const int frameMax = 19;
    
    int frames[frameMax][8][3] = {
      {{0, 0, 255 }, {0, 0, 255 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {255, 0, 0 }, {255, 0, 0 }},
      {{0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {255, 0, 0 }, {255, 0, 0 }},
      {{0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }},
      {{0, 0, 255 }, {0, 0, 255 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }},
      {{0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {255, 0, 0 }, {255, 0, 0 }},
      {{0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }},
      {{0, 0, 255 }, {0, 0, 255 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }},
      {{0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {255, 0, 0 }, {255, 0, 0 }},
      {{0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {255, 255, 255}, {255, 255, 255}, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }},
      {{0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }},
      {{0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {255, 255, 255}, {255, 255, 255}, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }},
      {{0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }},
      {{0, 0, 0 }, {255, 0, 0 }, {255, 0, 0 }, {255, 0, 0 }, {255, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }},
      {{0, 0, 0 }, {255, 0, 0 }, {255, 0, 0}, {0, 0, 0 }, {255, 0, 0 }, {0, 0, 0 }, {255, 0, 0 }, {255, 0, 0 }},
      {{0, 0, 255 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {255, 0, 0 }},
      {{255, 255, 255},{255, 255, 255},{255, 255, 255},{255, 255, 255},{255, 255, 255},{255, 255, 255},{255, 255, 255},{255, 255, 255}},
      {{0, 0, 255 }, {0, 0, 255 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }},
      {{0, 0, 0 },{0, 0, 0 },{255, 255, 255},{255, 255, 255},{255, 255, 255},{255, 255, 255},{0, 0, 0 },{0, 0, 0 }},
      {{0, 0,  0}, {0, 0, 0 }, {255, 0, 0}, {255, 0, 0 }, {255, 0, 0 }, {255, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }}
        };
    
    int durations[frameMax] = {1000, 100, 100, 50, 50, 10, 50, 50, 50,40,50,40,100,100,100,20,40,20,100};
    int frameCurrent = 0;
    
    void setup() {
      strip.begin();           // INITIALIZE NeoPixel strip object (REQUIRED)
      strip.show();            // Turn OFF all pixels ASAP
      strip.setBrightness(50); // Set BRIGHTNESS to about 1/5 (max = 255)
    }
    
    void loop() {
      police1(strip.Color(255,   0,   0), durations[frameCurrent]);
      frameCurrent++;
      if (frameCurrent >= frameMax) frameCurrent = 0;
    }
    
    void police1(uint32_t color, int wait) {
      for (int i = 0; i < 8; i++) { // For each pixel in strip...
        strip.setPixelColor(i, strip.Color(frames[frameCurrent][i][0],frames[frameCurrent][i][1],frames[frameCurrent][i][2])); //  Set pixel's color (in RAM)
        strip.show(); //  Update strip to match
      }
      delay(wait); //  Pause for a moment
    }

    Puedes ajustar, extender o acortar la animación.

    Aprende también sobre:  Máquina de sonidos con Arduino

    Únicamente tienes que añadir más fases de animación en los fotogramas de la matriz, añadir más duración a la matriz y ajustar el frameMax variable.


    Submit your review
    1
    2
    3
    4
    5
    Submit
         
    Cancel

    Create your own review

    MiElectrónicaFácil.com
    Average rating:  
     0 reviews

     

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada.

    Deja una Review

    Submit your review
    1
    2
    3
    4
    5
    Submit
         
    Cancel

    Create your own review

    MiElectrónicaFácil.com
    Average rating:  
     0 reviews