历史上的今天
今天是:2025年01月03日(星期五)
2020年01月03日 | 声控LED频谱分析仪的制作
2020-01-03 来源:elecfans
第1步:测试您的LED

将所有东西布置在适当大小的工作空间上。插入电烙铁。您要做的第一件事就是测试您的LED。
我很快了解到这些灯不喜欢在没有数据的情况下响应电源。如果您跳起来尝试仅用电源测试它们而它们不起作用,请稍等片刻。他们可能只需要注入一些代码即可激活LED。在切割LED灯条之前,请遵循本指南将灯条连接至Arduino/电源。然后运行此处找到的示例代码。
注意:一端确实已预焊接了导线。随意尝试一下。在卷轴上,我收到了预包装的电缆,但没有用(哼哼声),所以我不得不切断两个LED并从卷轴的裸露端开始。
步骤2:焊接VU防护板

抓住Shifty VU防护板和Arduino。
VU防护板带有一组接头引脚,用于连接到Arduino的。这些接头需要焊接,因为连接太松,甚至不能出于测试目的而简单地插入。有关如何将屏蔽层焊接到Arduino的技巧,请参阅Sparkfun的这份出色指南。
步骤3:切割LED灯条

对于这个项目,我使用了3条带,每条带38个LED。
您可以决定要保留多长时间。较短的灯条(少于10个LED)可能不会给您带来很大的效果,但是请确定适合您的项目的长度,并相应调整本指南中的步骤。
LDP8806灯带每节带有两个LED,每16个LED与焊锡相连。您可以在插排的任何点进行切割和连接,但是如果需要在连接点断开插排的连接,请务必拆焊。观看此视频,该视频显示了如何分割这种类型的条带。
步骤4:连接准备


在本指南中,我将使用黑色,红色,黄色和绿色的线。您可以使用所需的任何颜色,但是请记住,在以下步骤中将参考这些颜色。
剥开两端的线以获得每种四种颜色的几根导线。
获取您的LED指示灯。您想找到箭头指向远离带状切口的末端。
小心地切掉密封条的末端,这样就可以到达连接器(或将其完全切掉)。
用焊料固定连接器。这样可以更轻松地焊接电线。再次注意箭头的方向;注意它是如何指向远离焊料的。这就是数据流的方向,如果将它们混在一起,可能会损坏条带。
只需检查一下,箭头方向是否正确?如果没有,您将破产。
第5步:连接LED



这些LED有四个引脚;地,5v,C(时钟)和D(数据)。条带的某些部分上标有值,有些则没有。没关系,只要知道您要焊接到哪个引脚即可。继续操作时请参阅接线图,并仔细检查条带面对的方向。
将条带焊接在一起,确保每个输出都连接到其各自的输入。
第6步:连接到Arduino/电源


获取5V电源和Arduino。
从在插排布置的输入端开始,将绿色数据线连接到引脚2,将黄色时钟线连接到引脚3。红色5V线直接连接到电源,并且电源和LED灯带与驱动器共享公共接地。 Arduino。
请参阅上面的接线图,并仔细检查所有连接。
第7步:代码

将Arduino连接到您的PC。抓住您的音频分配器并将其连接到PC。使用一根音频电缆连接至VU屏蔽,另一根电缆连接至扬声器。将电源适配器连接到电源插座。
一旦一切都连接好,请从步骤0开始运行测试程序以再次检查所有指示灯是否点亮。
从Github下载项目代码并添加到您的Arduino库。打开Arduino IDE并上传。
#include “fix_fft.h”
#include “HSBColor.h”
#include “LPD8806.h”
#include “SPI.h”
// Choose 2 pins for Arduino output
#define DATA_PIN 2
#define CLOCK_PIN 3
// Defines the number and arrangement of LEDs in the visualizer. For a vertical setup, this will determine the space to light ratio as they wrap
#define NUM_BARS 12
#define BAR_LENGTH 12
// The difference in hue for each bar after the first.
#define BAR_HUE_DIFF 8
// Create a LPD8806 instance to control the strip
LPD8806 strip = LPD8806(NUM_BARS * BAR_LENGTH, DATA_PIN, CLOCK_PIN);
// The current hue of the first strip of the bar
int curHue = 0;
// FFT data storage
char im[NUM_BARS * 2], data[NUM_BARS * 2];
int prev[NUM_BARS];
// HSB/RGB data buffer
int rColor[3];
// Converts a 2d visualizer point to it‘s location on the strip
int getStripLocation(int col, int row)
{
// Controls the strip in alternating directions. This allows for chaining horizontal bars end-to-end
if (col % 2 == 0)
row = BAR_LENGTH - row - 1;
return col * BAR_LENGTH + row;
}
void setup()
{
analogReference(DEFAULT);
strip.begin();
strip.show();
}
void loop()
{
uint16_t i, j, k;
uint32_t color;
// Read analog input
for (i = 0; i 《 NUM_BARS * 2; i++)
{
int val = (analogRead(3) + analogRead(2)) / 2;
data[i] = val * 2;
im[i] = 0;
delay(1);
}
// Set the background colour of the LEDs when they are not receiving music data
for (i = 0; i 《 NUM_BARS * BAR_LENGTH; i++)
strip.setPixelColor(i, 20, 20, 40);
// Set the proper pixels in each bar
for (i = 0; i 《 NUM_BARS; i++)
{
// Each LED bar has 2 FFT frequencies that are summed together
int fft_start = i * 2;
int fft_count = 2;
// Get a positive data point from the FFT
int curData = 0;
for (k = 0; k 《 fft_count; k++)
curData += sqrt(data[fft_start + k] * data[fft_start + k] + im[fft_start + k] * im[fft_start + k]);
// Account for the ShiftyVU’s filtering
if (i == 0 || i == 7)
curData /= 2;
// Smoothly drop from peaks by only allowing data points to be one LED lower than the previous iteration.
// This prevents seizure-inducing flashes which might be caused by the ShiftyVU‘s filtering (?)
if (prev[i] 》 BAR_LENGTH && curData 《 prev[i] - BAR_LENGTH)
curData = prev[i] - BAR_LENGTH;
// Base color for each bar
H2R_HSBtoRGB((curHue + i * 8) % 360, 99, 99, rColor);
color = strip.Color(rColor[0] / 2, rColor[1] / 2, rColor[2] / 2);
// If only the first LED is lit, but not fully. This is outside the for loop because the subtraction of
// BAR_LENGTH causes the value to wrap around to a very high number.
if (curData 《 BAR_LENGTH)
{
int brightness = curData * 99 / BAR_LENGTH;
H2R_HSBtoRGB((curHue + i * BAR_HUE_DIFF) % 360, 99, brightness, rColor);
// Colour of the base of each bar. Change this to match the background colour of the LEDs
strip.setPixelColor(i, 20, 20, 40);
}
else
{
for (j = 0; j 《 BAR_LENGTH; j++)
{
// Light up each fully lit LED the same way.
if (curData - BAR_LENGTH 》 j * BAR_LENGTH)
strip.setPixelColor(getStripLocation(i, j), color);
else if (curData 》 j * BAR_LENGTH)
{
// Dims the last LED in the bar based on how close the data point is to the next LED.
int brightness = (j * BAR_LENGTH - curData) * 99 / BAR_LENGTH;
H2R_HSBtoRGB((curHue + i * BAR_HUE_DIFF) % 360, 99, brightness, rColor);
strip.setPixelColor(getStripLocation(i, j), strip.Color(rColor[0] / 2, rColor[1] / 2, rColor[2] / 2));
}
}
}
// Store all of the data points for filtering of the next iteration.
prev[i] = curData;
}
// Cycle through all the colors.
if (curHue == 359)
curHue = 0;
else
curHue++;
// Display the strip.
strip.show();
}
步骤8:播放一些音乐
一旦上传了所有内容,就播放一些音乐!现在,您应该具有类似的内容(我的上面覆盖有用于扩散的光面板)。
上一篇:MCU在血液分析仪中的应用设计
下一篇:浅谈功率分析仪原理及应用
史海拾趣
|
基于51单片机开发的DS18B20的数字温度计(源程序+原理图) 基于51单片机开发的DS18B20的数字温度计 原程序用C编写可调试。原理图用protel设计 DS18B20为美国达拉斯(Dallas)公司开发的温度传感芯片,DS18B20可以直接 将被测温度转成串行数字信号,以供单片机处理! 感觉还行的朋友别忘了顶下啊! 请下 ...… 查看全部问答> |
|
本帖最后由 paulhyde 于 2014-9-15 09:03 编辑 听说不能用焊好元件的板,通用板和PCB板都不行,只能带一块空板,比赛时盖过章之后再焊上元件,最小系统板除外。是这样的吗? 那如果买的一辆小车上已经有控制PCB并且已经焊好电路了,那到时不能 ...… 查看全部问答> |
|
什么叫TTL电路? TTL(电路中的)2008-05-15 02:22TTL(逻辑门电路) 全称Transistor-Transistor Logic,即BJT-BJT逻辑门电路,是数字电子技术中常用的一种逻辑门电路,应用较早,技术已比较成熟。 TTL的主要分类 TTL主要有BJT(Bipolar Junction Trans ...… 查看全部问答> |
|
ISA总线上的A12~A31是20位数据总线,我用的是A28~A31不同的主板对地址的处理方式不一样,我现在手上有两款工控机,有一款是这么处理的,在程序里发送地址8,A28~A31就是1000,再没送其他地址之前,A28到A31始终保持是1000,但另一款不一样,不管送 ...… 查看全部问答> |
|
1.CPU内置超级电容,在不太长的断电时间内为保持数据和始终提供电源,不需要附件。2.CPU上附加电池卡,与内置超级电容配合,长期为时钟和数据保持提供电源。3.使用数据块,永久保存不需要更改的数据。4.编程时设置系统块,可在CPU断电时自动永久保 ...… 查看全部问答> |
|
电路如图所示,24V供电,分为AB两组LED,平时只亮其中的一组,通过切换电源220V开关选择,原因是这样的:客户给A组LED通电连续点亮了3个月左右,又给AB组同时通电了几天,最后单独给B组通电,约20天后,发现B组严重暗了许多,于是马上把B组断电只亮A组,现在A组 ...… 查看全部问答> |




