不务正业之音乐节奏灯

前几天在知乎上看到一个音乐节奏灯得帖子,觉得很有意思。就上淘宝买了材料,跟着淘主得视频做了个LED音乐节奏灯。(我可能是吃饱撑着没事做)。在此记录一下制作过程。

本程序代码由Scott Lawson编写,并发布在Github,这个代码最后一次更新在2年前。由于兼容性问题,由知乎用户:(英语老师摸我腿)修改,其还有制作教程。感谢各位大佬支持。

工具

1.Arduino

2.Anaconda(Python)

3.PVC管

4.ESP8266开发板

5.LED灯带(60颗/1米)

6.5V的灯座

7.灯罩

8.杜邦线

9.MicroUSB数据线

扫描二维码关注公众号,回复: 5536044 查看本文章

实现步骤:

1.

下载并安装Arduino和Anaconda

2.

在Anaconda中创建Python环境,并命名为MusicLed

3.

在Anaconda的MusicLed环境下Open Terminal安装一些库

conda install numpy scipy pyqtgraph
pip insatll pyaudio

4.

注:最好先连上VPN,不然安装很容易失败

安装完Arduino,打开安装一些库。

首先点击(文件)-(首选项)-(附加开发板管理器网址)-(http://arduino.esp8266.com/stable/package_esp8266com_index.json

然后点击(工具)-(开发板)-(开发板管理器)-(等它加载完成在搜索框输入:ESP8266。只有一个结果直接点击安装)。

接着点击(项目)-(加载库)-(管理库)-(搜索框输入websock,安装的版本为2.1.1)。

5.

注:电脑小白最好安装Notepad++

修改代码:注意以下注释就好了。只要修改ws2812_controller.ion和config.py两处的部分注释代码。

源代码在https://github.com/ZhangCats/MusicLed

6.

修改完两个代码后,就要把arduino代码上传到ESP8266上。

首先把板子插在电脑的USB端口上。

然后查看设备管理器中板子在哪个口,例如:CH340(COM3)。

接着点击ws2812_controller.ino进入Arduino,点击(工具)-(开发板)-(SparkFun ESP8266 Thing Eev)-修改端口为(COM3)-(上传代码即可)。

最后点击Strat.bat,看到以下界面说明代码基本无误:

7.

接下来就是组装节奏灯就好啦。

注:这里注意灯带上的箭头,不要接反了。

如果看不懂上图可以看这个(灵魂画手):

这里将用将两根杜邦线分别接上5v的红线与GND,然后用PVC电气胶布缠绕上即可。

记得用一根杜邦线将ESP8266的RX口和灯带的DI口连接起来,否则灯带不会亮。

然后将灯带缠绕到PVC管上。

最后通电就可以啦。注:灯座的插头电压可能不够导致灯带亮的时候,ESP板子不通电(分压)。这时候把充电头换成手机的快充头即可给两个部件同时通电。

节奏灯,程序打开了,灯不亮。PING一下你给ESP8266设置的IP地址,如果通,那说明ESP8266运行正常,请检查线是否接好,并保证两个文件设置正确。关闭PC程序,重新打开试试

8.

大家电脑可能没有混音功能。所以先下载Viocemeeter,点击A1选择如下图所示:

然后在(声音)-(播放)将其设置为默认设备即可,(录制)也是如此。

9.

最后(给灯座通上点)-(点击Start.bat)-(打开Voicemeeter)-(打开音乐播放器播放音乐即可,当然你直接对着电脑讲话也有同样效果只要是有声音输入都行)。

完!

Arduino代码

ws2812_controller.ino

/*
 * 注意,一定要看到文件隔壁还有很多后缀名为".h"的文件,如果没有的话,那说明当前文件夹下没有这个文件。编译会出错。
 * 参考资料:https://github.com/scottlawsonbc/audio-reactive-led-strip
 * 源码2年未更新,稍作修改。
 * 你只需要修改代码后面后中文注释的地方!
 */

#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <WebSocketsServer.h>
#include <Hash.h>
#include <WiFiUdp.h>
#include "ws2812_i2s.h"


#define NUM_LEDS 120 //LED灯数量

#define BUFFER_LEN 1024

#define PRINT_FPS 1


const char* ssid     = "zzzzzzzccccccc"; //你家WIFI名字
const char* password = "zcp5313.."; //你家WIFI密码
unsigned int localPort = 7777;
char packetBuffer[BUFFER_LEN];


static WS2812 ledstrip;
static Pixel_t pixels[NUM_LEDS];
WiFiUDP port;

//你可以使用Windows+R键输入cmd,然后输入命令ipconfig 查看自己网络情况。

IPAddress ip(192, 168, 1, 150); //你给ESP8266设置的IP地址,注意,这个IP不可以跟其他设备(手机电脑灯)重复。

IPAddress gateway(192, 168, 1, 1); //你家网络的网关,这个跟你电脑的网关一样

IPAddress subnet(255, 255, 255, 0); //子网掩码,跟你电脑的一样,一般不需要修改。

void setup() {
    Serial.begin(115200);
    WiFi.config(ip, gateway, subnet);
    WiFi.begin(ssid, password);
    Serial.println("");
    // Connect to wifi and print the IP address over serial
    while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
    }
    Serial.println("");
    Serial.print("Connected to ");
    Serial.println(ssid);
    Serial.print("IP address: ");
    Serial.println(WiFi.localIP());
    port.begin(localPort);
    ledstrip.init(NUM_LEDS);
}

uint8_t N = 0;
#if PRINT_FPS
    uint16_t fpsCounter = 0;
    uint32_t secondTimer = 0;
#endif

void loop() {
    // Read data over socket
    int packetSize = port.parsePacket();
    // If packets have been received, interpret the command
    if (packetSize) {
        int len = port.read(packetBuffer, BUFFER_LEN);
        for(int i = 0; i < len; i+=4) {
            packetBuffer[len] = 0;
            N = packetBuffer[i];
            pixels[N].R = (uint8_t)packetBuffer[i+1];
            pixels[N].G = (uint8_t)packetBuffer[i+2];
            pixels[N].B = (uint8_t)packetBuffer[i+3];
        } 
        ledstrip.show(pixels);
        #if PRINT_FPS
            fpsCounter++;
        #endif
    }
    #if PRINT_FPS
        if (millis() - secondTimer >= 1000U) {
            secondTimer = millis();
            Serial.printf("FPS: %d\n", fpsCounter);
            fpsCounter = 0;
        }   
    #endif
}

Python代码

config.py

# 你只需要修改有注释的地方
# 其他未备注的地方,看得懂代码的人,请自行修改,需要需要了解numpy,pyaudio

#conding = utf8
from __future__ import print_function
from __future__ import division
import os

DEVICE = 'esp8266'


if DEVICE == 'esp8266':
# 下面是你刚才在Arduino中为ESP8266设置的IP地址,不要填错了。
    UDP_IP = '192.168.1.150'
   
    UDP_PORT = 7777
  
    SOFTWARE_GAMMA_CORRECTION = False
 

if DEVICE == 'pi':
    LED_PIN = 18
   
    LED_FREQ_HZ = 800000
   
    LED_DMA = 5
   
    BRIGHTNESS = 255

    LED_INVERT = True
   
    SOFTWARE_GAMMA_CORRECTION = True
  

if DEVICE == 'blinkstick':
    SOFTWARE_GAMMA_CORRECTION = True
    

USE_GUI = True


DISPLAY_FPS = True

# 下面是你LED灯的数量,这个也不能搞错,错了,程序就运行出错!
N_PIXELS = 120


GAMMA_TABLE_PATH = os.path.join(os.path.dirname(__file__), 'gamma_table.npy')


MIC_RATE = 44100


FPS = 60

_max_led_FPS = int(((N_PIXELS * 30e-6) + 50e-6)**-1.0)
assert FPS <= _max_led_FPS, 'FPS must be <= {}'.format(_max_led_FPS)

MIN_FREQUENCY = 200


MAX_FREQUENCY = 12000


N_FFT_BINS = 24


N_ROLLING_HISTORY = 2


MIN_VOLUME_THRESHOLD = 1e-7

猜你喜欢

转载自blog.csdn.net/qq_40755643/article/details/83239776