Проект 14. Эквалайзер
В этом проекте мы научимся работать со звуком: посмотрим как выглядит звуковая волна, фиксируемая датчиком звука, и как изменить её форму, чтобы она выглядела как на настоящих эквалайзерах.
Программирование:
Арифметические операции
Практика
Изучите как выглядит звуковая волна в плоттере по последовательному соединению.
Напишите программу, которая вычисляет среднее значение громкости звука.
Измените программу в мониторе порта, чтобы она использовала среднее значение в качестве точки отсчёта (нулевой точки), а остальные значения брала по модулю (чтобы у графика не было нижней части, а была только верхняя).
Дополнительное задание
Сделать измеритель громкости: если уровень маленький горит зеленый светодиод, если средний - жёлтый светодиод, если высокий - красный светодиод.
Решение
Мы рекомендуем сначала освоить материал и попробовать сделать программу самостоятельно! А потом проверить себя, посмотрев наш вариант решения:
Основная программа
#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);
}