20 de novembro de 2020

Luz Rítmica RGB

As luzes piscam e alteram as cores ao som da música!

Material utilizado:

  • Módulo de microfone de eletreto MAX4466
  • Barra LEDs RGB WS2812
  • Arduino Nano

Segue o esquema elétrico e o código fonte com comentários para melhor entendimento:
 

 

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
/*---------------------------------------------------------
  Programa : LUZ RITMICA RGB
  Autor    : Fellipe Couto [ http://www.efeitonerd.com.br ]
  Data     : 18/11/2020
  ---------------------------------------------------------*/
#include <Adafruit_NeoPixel.h> //https://github.com/adafruit/Adafruit_NeoPixel
#include <MillisTimerLib.h>    //https://github.com/fellipecouto/MillisTimerLib [ http://www.efeitonerd.com.br ]

#define PIN_MIC A1   //Pino de ligação do microfone
#define PIN_LED 3    //Pino de conexão da barra de leds
#define NUM_PIXELS 8 //Número de leds rgb

Adafruit_NeoPixel pixels(NUM_PIXELS, PIN_LED); //Instancia a barra de leds RGB WS2812
MillisTimerLib timerStyle(30000); //Instancia e inicializa timer com 30000ms (30 segundos)

int previousMic = 0;
int diffMic = 0;
int style = 0;

void setup() {
  //Inicializa a barra de leds RGB WS2812
  pixels.begin();

  //Inicializa o gerador de números pseudoaleatórios
  randomSeed(analogRead(A2));
}

void loop() {
  //Leitura do valor do microfone - Módulo MAX4466
  int mic = analogRead(PIN_MIC);

  //Calcula a diferença entre os valores lidos
  if (previousMic >= mic) {
    diffMic = previousMic - mic;
  } else {
    diffMic = mic - previousMic;
  }
  previousMic = mic;

  //Ajusta o valor de diferença lido
  int maxDiffMic = 350;
  if (diffMic > maxDiffMic) diffMic = maxDiffMic; //Seta o valor maxDiffMic como maior diferença
  diffMic = map(diffMic, 0, maxDiffMic, 0, 8); //Mapeia a diferença entre valores de 0 a 8

  //Temporizador para alterar o estilo do ritmo
  if (timerStyle.timer()) style++;
  if (style > 2) style = 0;

  //Executa o beatLeds
  beatLeds(diffMic, style);

  //Delay randômico
  int delayRdm = random(10, 250);
  delay(delayRdm);
}

void beatLeds(int p, int style) {
  int maxValueLed = 50;
  int color = random(5); //Valores de 0 a 4. 0=Vermelho 1=verde 2=Azul 3e4=Random
  pixels.clear(); //Apaga todos os leds
  if (style == 0 || style == 2) {
    for (int i = 0; i < p; i++) { //Acende os leds até a posição setada
      if (color == 0) {
        pixels.setPixelColor(i, maxValueLed, 0, 0); //Led, R, G, B
        if (style == 2) pixels.setPixelColor(NUM_PIXELS - 1 - i, maxValueLed, 0, 0); //Led, R, G, B
      } else if (color == 1) {
        pixels.setPixelColor(i, 0, maxValueLed, 0); //Led, R, G, B
        if (style == 2) pixels.setPixelColor(NUM_PIXELS - 1 - i, 0, maxValueLed, 0); //Led, R, G, B
      } else if (color == 2) {
        pixels.setPixelColor(i, 0, 0, maxValueLed); //Led, R, G, B
        if (style == 2) pixels.setPixelColor(NUM_PIXELS - 1 - i, 0, 0, maxValueLed); //Led, R, G, B
      } else {
        pixels.setPixelColor(i, random(0, maxValueLed), random(0, maxValueLed), random(0, maxValueLed)); //Led, R, G, B
        if (style == 2) pixels.setPixelColor(NUM_PIXELS - 1 - i, random(0, maxValueLed), random(0, maxValueLed), random(0, maxValueLed)); //Led, R, G, B
      }
    }
  } else if (style == 1) {
    for (int i = NUM_PIXELS; i >= NUM_PIXELS - p; i--) { //Acende os leds até a posição setada
      if (color == 0) {
        pixels.setPixelColor(i, maxValueLed, 0, 0); //Led, R, G, B
      } else if (color == 1) {
        pixels.setPixelColor(i, 0, maxValueLed, 0); //Led, R, G, B
      } else if (color == 2) {
        pixels.setPixelColor(i, 0, 0, maxValueLed); //Led, R, G, B
      } else {
        pixels.setPixelColor(i, random(0, maxValueLed), random(0, maxValueLed), random(0, maxValueLed)); //Led, R, G, B
      }
    }
  }
  pixels.show();
}

4 comentários:

  1. Fellipe, tudo bem?
    Muito legal este seu blog!
    Queria saber o seguinte: no esquema do link abaixo para sequencial com 30 leds, posso duplicar para sessenta colocando dois leds no lugar de cada um? Ou então, duplicar a programação?

    ResponderExcluir
    Respostas
    1. Bom dia!
      Que bom que gostou do blog!
      É possível adicionar dois leds em cada saída sim, porém, é necessário atenção a corrente máxima de cada registrador de deslocamento (74HC595). Se não me engano, a corrente máxima é de 70mA para cada, mas cada saída com até 35mA. Deve-se observar as potências dos leds que estará utilizando. Leds difusos comuns 5mm, acredito ser possível.
      De qualquer forma, para cargas mais altas, pode-se utilizar um transistor um cada saída para aumento de corrente.
      Abraços! Bons projetos!

      Excluir
  2. neste esquema...

    http://www.efeitonerd.com.br/2012/09/super-sequencial-de-leds.html?m=1

    ResponderExcluir