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(); } |
Fellipe, tudo bem?
ResponderExcluirMuito 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?
Bom dia!
ExcluirQue 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!
Obrigado!
ResponderExcluirneste esquema...
ResponderExcluirhttp://www.efeitonerd.com.br/2012/09/super-sequencial-de-leds.html?m=1