0

Hướng dẫn chế tạo led nháy theo nhạc | DIY led matrix 32×16

Hôm nay espitek xin quay trở lại giới thiệu với các bạn một món mới 🙂 . Để giải trí khi làm việc, học tập thì chúng ta thường sẽ nghe nhạc đúng không? Vậy kèm theo chút led nháy theo nhạc sẽ giúp ca khúc, âm điệu thêm phần sinh động hơn phải không!

Led nháy theo nhạc sử dụng cảm biến Max9814

Xem thêm video demo:

Yêu cầu cần có để DIY led nháy theo nhạc

Hardware:

  1. Bảng led ma trận: 32×16 (p5 thì phải 🙂 ) mình đang xài loại HUB75
Bảng led ma trận 32×16 HUB75

2. Module nhận dạng âm thanh Max981

Nhận diện âm thanh để tạo led nháy theo nhạc
Nhận diện âm thanh Max981

Kết nối chân OUT với chân 34 của ESP32 (tùy chọn)

3. MCU: ESP32 (mình sẵn có dùng luôn). Nếu các bạn chưa biết cách sử dụng esp32 trên arduino thì có thể tham khảo chuỗi bài viết về lập trình esp32.

4. Board mạch sử dụng ESP32 quét led ma trận

Về nguyên lý để quét led nháy theo nhạc chúng ta sẽ dùng các chân GPIO của ESP32 và thông qua 2 IC dịch 74HC để đẩy dữ liệu từ ESP sang Hub75.

Sơ đồ mạch ESP32 dùng để quét led ma trận
Sơ đồ mạch ESP32 dùng để quét led ma trận

Code hướng dẫn

#include<MegunoLink.h>
#include<Filter.h>

#include "ESP32-RGBMatrixPanel-GRAB.h"
RGB64x32MatrixPanel_I2S_DMA matrix(32, 16);

#define NOISE 550 // 550
#define MIC_PIN 34
#define led 22





int lvl = 0; // tweak the min and max as needed
ExponentialFilter<long> ADCFilter(5,0);

void setup() {
  // put your setup code here, to run once:
  //
  Serial.begin(115200);
  //pinMode(Red, OUTPUT);
  
  matrix.begin();
  matrix.fillScreen(0);
  matrix.setPanelBrightness(20);
    

  for(int k =31; k>= 0 ;k--) {
      for(int h = 15; h >= 0 ;h--) {
        matrix.drawPixel(k,h,LED_RED_HIGH);
        
      }
    }
    digitalWrite(led, 1);
    delay(1000);
    matrix.fillScreen(0);
    pinMode(led, OUTPUT);
    digitalWrite(led, 0);
    Serial.print("SETUP");
}

void loop() {
  // put your main code here, to run repeatedly:
  int n, heightx;
  n = analogRead(MIC_PIN);
  // remove the MX9614 bias of 1.25VDC
  n = abs(1023 - n); //1023
  // hard limit noise/hum
  n = (n <= NOISE) ? 0 : abs(n - NOISE);
  // apply the exponential filter to smooth the raw signal
  ADCFilter.Filter(n);
  lvl = ADCFilter.Current();


  int ySpec = map(lvl,0,140,0,15);

// *************** LED MATRIX *******************
        
        int led31 = random(ySpec);
        lightcolumns(31, ySpec+ led31);
        lightcolumns(30, ySpec+ led31);
        lightcolumns(29, 0);

        int led28 = random(ySpec);
        lightcolumns(28, ySpec+ led28);
        lightcolumns(27, ySpec+ led28);
        lightcolumns(26, 0);


        int led25 = random(ySpec);
        lightcolumns(25, ySpec + led25);
        lightcolumns(24, ySpec+ led25);
        lightcolumns(23, 0);

        int led22 = random(ySpec);
        lightcolumns(22, ySpec+ led22);
        lightcolumns(21, ySpec+ led22);
        lightcolumns(20, 0);

        int led19 = random(ySpec);
        lightcolumns(19, ySpec+ led19);
        lightcolumns(18, ySpec+ led19);
        lightcolumns(17, 0);

        int led16 = random(ySpec);
        lightcolumns(16, ySpec+ led16);
        lightcolumns(15, ySpec+ led16);
        lightcolumns(14, 0);

        int led13 = random(ySpec);
        lightcolumns(13, ySpec+ led13);
        lightcolumns(12, ySpec+ led13);
        lightcolumns(11, 0);

        int led10 = random(ySpec);
        lightcolumns(10, ySpec+ led10);
        lightcolumns(9, ySpec+ led10);
        lightcolumns(8, 0);

        int led7 = random(ySpec);
        lightcolumns(7, ySpec+ led7);
        lightcolumns(6, ySpec+ led7);
        lightcolumns(5, 0);

        int led4 = random(ySpec);
        lightcolumns(4, ySpec+ led4);
        lightcolumns(3, ySpec+ led4);
        lightcolumns(2, 0);

        int led1 = random(ySpec);
        lightcolumns(1, ySpec+ led1);
        lightcolumns(0, ySpec+ led1);
      //delay(10);
}

void lightcolumns(int rownum, int amplitude)
{
  if(amplitude >=12)  // <-O-> set the threshold for the band to turn red
  {
      for( int y = 0; y < 2; y++){
        matrix.drawPixel(rownum, y, matrix.Color333(0, 0, 7));     // red-green
      }
      for( int y = 2; y <= 12; y++){
        matrix.drawPixel(rownum, y, matrix.Color333(0, 5, 0));     // red-green
      }
      
      
      for(int y = amplitude; y <16; y++)
      {
        matrix.drawPixel(rownum, y, matrix.Color333(0, 0, 0));  
      }
      //matrix.drawPixel(rownum, amplitude+2, matrix.Color333(7, 7, 7));
  }
  
  else if(amplitude>9 &amp;&amp; amplitude < 12 ) // <-O-> set the threshold for the band to turn yellow
  {
      for( int y = 0; y < 2; y++){
        matrix.drawPixel(rownum, y, matrix.Color333(0, 0, 7));     // red-green
      }
      for( int y = 2; y < amplitude; y++){
        matrix.drawPixel(rownum, y, matrix.Color333(0, 5, 0));     // red-green
      }
      
      for(int y = amplitude; y < 16; y++)
      {
        matrix.drawPixel(rownum, y, matrix.Color333(0, 0, 0));  
      }
      //matrix.drawPixel(rownum, amplitude+2, matrix.Color333(7, 7, 7));
  }
  
  else if(amplitude>2 &amp;&amp; amplitude < 9) // <-O-> set the threshold for the band to turn green
  {
      for( int y = 0; y < 2; y++){
        matrix.drawPixel(rownum, y, matrix.Color333(0, 0, 7));     // red-green
      }
      for( int y = 2; y < amplitude; y++){
        matrix.drawPixel(rownum, y, matrix.Color333(0, 5, 0));
      }
      for(int y = amplitude; y < 16; y++)
      {
        matrix.drawPixel(rownum, y, matrix.Color333(0, 0, 0));  
      }
      //matrix.drawPixel(rownum, amplitude+2, matrix.Color333(7, 7, 7));
  } 
  
  else if(amplitude != 0)
  {
      for( int y = 0; y < 2; y++){
        matrix.drawPixel(rownum, y, matrix.Color333(0, 0, 7));     // red-green
      }
      for(int y = amplitude; y < 16; y++)
      {
        matrix.drawPixel(rownum, y, matrix.Color333(0, 0, 0));  
      }
  } 

  if(amplitude >0 &amp; amplitude < 16){
    matrix.drawPixel(rownum, amplitude+2, matrix.Color333(7, 7, 7));

    delay(2);
  }
  
  
}

Giải thích code led:

Thêm thư viện Megunolink và Filter
Thêm thư viện Megunolink và Filter

Thêm thư viện vào giúp đọc các thông số từ cảm biến âm thanh Max981 tốt hơn.

Thêm thư viện giúp ESP32 quét led tốt hơn, sử dụng DMA để quét tốc độ cao hơn

Sử dụng tín hiệu cường độ âm thanh vào từ cảm biến Max981 để làm đầu ra cho việc hiển thị led nháy theo nhạc đẹp. Tùy vào sở thích, mục đích của mỗi bạn điều chỉnh code cho phù hợp và đẹp mắt hơn!

Hướng mở rộng

Trong bài hướng dẫn này, Espitek sử dụng bảng led loại HUB75, và module esp32 quét led được thiết kế sẵn và riêng biệt nên rất khó để các bạn có thể tìm thấy trên thị trường.

Vì thế mục đích bài này là giới thiệu công nghệ giải trí, và gợi mở hướng dẫn cho các bạn có mong muốn DIY góc làm việc, học tập trở nên cá tính hơn.

Ngoài ra các bạn có thể tìm hiểu thêm các module led WS2812 và arduino. Có rất nhiều hướng dẫn tạo led nháy theo nhạc sinh động và đơn giản hơn nhiều.

Các hướng mở rộng có thể áp dụng:

  • Tạo module âm thanh không dây gửi về ESP32 quét led để giúp đặt thiết bị thu âm nhạc bất kỳ đâu trong phòng, quán cafe,…
  • Mở rộng bảng led để “CHILL” hơn
  • Nhận dạng giọng nói, âm thanh để thể hiện thông điệp lên bảng led: ví dụ ra lệnh thì sẽ hiển thị nội dung lên bảng led,…

Chúc các bạn thành công!

Trả lời

Email của bạn sẽ không được hiển thị công khai.