Arduino стерео VU метр - PullRequest
0 голосов
/ 13 мая 2018

Я хочу создать аудио VU-метр, используя Arduino Nano и 5 светодиодов для каждого канала.
Проблема в том, что я не могу найти / создать программу, которая делает это.

Код

//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();
}

Проблемы:

  • через несколько минут он полностью перестает работать: случайно несколько светодиодов продолжают гореть
  • свет не связан со звуком

Мне кажется, проблема в изменении уровня входного сигнала, потому что я не понимаю, как должен распределяться уровень сигнала.Любая маленькая помощь будет полезна.

1 Ответ

0 голосов
/ 13 мая 2018

Возможно, вы хотели написать 12.5 вместо 12,5 в следующих выражениях: leftInput = analogRead(A0)/12,5; rightInput = analogRead(A1)/12,5; Но даже тогда analogRead возвращает значение от 0 до 1023 (включая). Таким образом, значение для left/rightInput будет варьироваться от 0 до 81, в то время как вам нужно, чтобы оно было в диапазоне 0...4. Я предлагаю иметь другой массив пороговых значений и в зависимости от силы сигнала загораются все светодиоды, которые превышают пороговое значение, например (не проверено), добавьте это вместо вашего 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));
}

Обратите внимание, что вам, вероятно, не нужно выключать все светодиоды, поскольку они выключаются в контуре, если сигнал ниже порога

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...