Проект 14. Эквалайзер

В этом проекте мы научимся работать со звуком: посмотрим как выглядит звуковая волна, фиксируемая датчиком звука, и как изменить её форму, чтобы она выглядела как на настоящих эквалайзерах.

Оборудование:

(new) Датчик звука
TrafficLight

Программирование:

Арифметические операции

Практика

Изучите как выглядит звуковая волна в плоттере по последовательному соединению. Напишите программу, которая вычисляет среднее значение громкости звука. Измените программу в мониторе порта, чтобы она использовала среднее значение в качестве точки отсчёта (нулевой точки), а остальные значения брала по модулю (чтобы у графика не было нижней части, а была только верхняя).

Дополнительное задание

Сделать измеритель громкости: если уровень маленький горит зеленый светодиод, если средний - жёлтый светодиод, если высокий - красный светодиод.

Решение

Мы рекомендуем сначала освоить материал и попробовать сделать программу самостоятельно! А потом проверить себя, посмотрев наш вариант решения:

#include <Eryoma.h>
Eryoma eryoma;

long volume = 0;
void setup() {
  eryoma.setupConnector(ePort6, Microphone);
  Serial.begin(9600);
  for (int i = 0; i < 100; i++) {
    volume += eryoma.read(ePort6);
    delay(10);
  }
  volume /= 100;
}

void loop() {
  int volume_now =  eryoma.read(ePort6);
  Serial.println(abs(volume_now - volume));
}

#include <Eryoma.h>
Eryoma eryoma;

long volume = 0;
void setup() {
  eryoma.setupConnector(ePort1, TrafficLight);
  eryoma.setupConnector(ePort6, Microphone);
  Serial.begin(9600);
  for (int i = 0; i < 100; i++) {
    volume += eryoma.read(ePort6);
    delay(10);
  }
  volume /= 100;
}

void loop() {
  int volume_now = eryoma.read(ePort6);
  volume_now = abs(volume - volume_now);
  if (volume_now < 20) {
    eryoma.write(ePort1, 0, 0, 0);
  } else {
    if (volume_now < 100) {
      eryoma.write(ePort1, 255, 0, 0);
    } else {
      if (volume_now < 350) {
        eryoma.write(ePort1, 0, 255, 0);
      } else {
        eryoma.write(ePort1, 0, 0, 255);
      }
    }
  }
  delay(1);
}