我想为每个频道使用Arduino Nano和5个LED创建一个音频VU表。
问题是我无法找到/创建执行此操作的程序。
//STEREO LED VU
const int leftLedCount = 5;
const int rightLedCount = 5;
const int leftLed[leftLedCount] = {2,3,4,5,6};
const int rightLed[rightLedCount] = {7,8,9,10,11};
int leftInput, l;
int rightInput, r;
void setup()
{
for (l = 0; l < leftLedCount; l++)
pinMode(leftLed[l], OUTPUT);
for (r = 0; r < rightLedCount; r++)
pinMode(rightLed[r], OUTPUT);
testLEDs();
}
void testLEDs()
{
for (l = 0; l < leftLedCount; l++)
digitalWrite(leftLed[l], HIGH);
for (r = 0; r < rightLedCount; r++)
digitalWrite(rightLed[r], HIGH);
delay(1000);
turnOffLEDs();
}
void turnOffLEDs()
{
for (l = 0; l < leftLedCount; l++)
digitalWrite(leftLed[l], LOW);
for (r = 0; r < rightLedCount; r++)
digitalWrite(rightLed[r], LOW);
}
void loop()
{
leftInput = analogRead(A0)/12,5;
rightInput = analogRead(A1)/12,5;
//LEFT
for(l=0; l <= leftInput; l++)
{
digitalWrite(leftLed[l], HIGH);
}
//RIGHT
for(r=0; r <= rightInput; r++)
{
digitalWrite(rightLed[r], HIGH);
}
//TURN OFF LEDS
turnOffLEDs();
}
问题:
我认为问题在于改变输入水平,因为我不明白应该如何分配信号水平。任何形式的帮助都会有所帮助。
答案 0 :(得分:0)
您可能希望在这些表达式中编写12.5
而不是12,5
:leftInput = analogRead(A0)/12,5; rightInput = analogRead(A1)/12,5;
但即使这样,analogRead
也会将值从0
返回到1023
1}}(包括)。因此left/rightInput
的值范围从0
到大约81
,而您需要它在0...4
的范围内。我建议使用另一组阈值,并根据信号强度点亮所有高于阈值的LED,例如(未测试)添加此值而不是loop()
:
const int thresholdsLeftLed[leftLedCount] = { 4, 208, 412, 616, 820 };
const int thresholdsRightLed[rightLedCount] = { 4, 208, 412, 616, 820 };
void LightLEDs(int signalLeft, int signalRight)
{
for (int l = 0; l < leftLedCount; ++l)
digitalWrite(leftLed[l], signalLeft > thresholdsLeftLed[l] ? HIGH : LOW);
for (int r = 0; r < rightLedCount; ++r)
digitalWrite(rightLed[r], signalRight > thresholdsRightLed[r] ? HIGH : LOW);
}
void loop()
{
LightLEDs(analogRead(A0), analogRead(A1));
}
请注意,如果信号低于阈值,您可能不需要关闭所有LED,因为它们在循环中关闭