Аналоговый вход A0 на плате принимает сигнал с сенсора, реагирующего на звуковые волны. Максимальное напряжение – 5 В, разрешение АЦП – 10 бит (диапазон 0–1023). Чувствительность регулируется подстроечным резистором на модуле.
Подсоедините выход датчика к A0, питание – к 5V и GND. Для стабильной работы добавьте конденсатор 0.1 мкФ между сигнальным проводом и землей. Показания снимаются функцией analogRead(), но для обработки аудио требуется частота дискретизации от 4 кГц.
void setup() {
Serial.begin(9600);
}
void loop() {
int value = analogRead(A0);
Serial.println(value);
delay(1);
}
Для анализа громкости вычислите среднее квадратичное отклонение за 100 замеров. Пороговое значение шума устанавливается экспериментально – от 50 до 200 единиц АЦП в тихом помещении.
Работа с акустическим датчиком на платформе Arduino
Схема соединения: Аналоговый выход звукового сенсора (например, KY-038) подключите к A0, питание – к 5V, землю – к GND. Для цифрового выхода используйте любой свободный пин, например, D2.
Калибровка порога срабатывания: Загрузите скетч, считайте значения с аналогового входа через монитор порта. Установите порог на 20–30% выше фонового шума.
void setup() {
Serial.begin(9600);
}
void loop() {
int sensorValue = analogRead(A0);
Serial.println(sensorValue);
delay(100);
}
Обработка сигнала: Для фильтрации ложных срабатываний добавьте усреднение:
const int numReadings = 10;
int readings[numReadings];
int index = 0;
void setup() {
Serial.begin(9600);
for (int i = 0; i < numReadings; i++) readings[i] = 0;
}
void loop() {
readings[index] = analogRead(A0);
index = (index + 1) % numReadings;
int average = 0;
for (int i = 0; i < numReadings; i++) average += readings[i];
average /= numReadings;
Serial.println(average);
delay(50);
}
Цифровой режим: Если сенсор поддерживает логический выход, настройте триммер для изменения чувствительности. Пример реакции на звук:
void setup() {
pinMode(2, INPUT);
Serial.begin(9600);
}
void loop() {
if (digitalRead(2) == HIGH) {
Serial.println("Обнаружен сигнал");
}
delay(10);
}
Совмещение с другими устройствами: Для управления светодиодом добавьте в цикл:
pinMode(13, OUTPUT);
if (average > threshold) digitalWrite(13, HIGH);
else digitalWrite(13, LOW);
Схема соединения аналогового звукового датчика с платой
Подсоедините выходной контакт сенсора к аналоговому входу (A0–A5). Питание подайте через стабилизированный источник 3,3–5 В. Для снижения помех добавьте конденсатор 0,1 мкФ между сигнальной линией и землёй.
Компоненты:
- Звуковой модуль с аналоговым выходом (например, KY-038)
- Конденсатор 100 нФ
- Резистор 10 кОм (опционально, для делителя напряжения)
Порядок действий:
- Соедините VCC сенсора с 5V на плате.
- Подключите GND к общему проводу.
- Сигнальный провод (OUT) присоедините к A0.
- Параллельно сигналу и земле установите керамический конденсатор.
Чтение сигнала
Используйте функцию analogRead() для получения данных. Диапазон значений – 0–1023. Пример:
int sensorPin = A0;
int rawValue = 0;
void setup() {
Serial.begin(9600);
}
void loop() {
rawValue = analogRead(sensorPin);
Serial.println(rawValue);
delay(100);
}
Для фильтрации шумов примените скользящее среднее или медианную фильтрацию в коде.
Обработка аудиосигнала
Считывание аналоговых данных с выхода звукодатчика выполняется через ADC. Для работы с сигналом в реальном времени применяйте analogRead()
с минимальной задержкой.
const int pin = A0;
int rawValue;
void setup() {
Serial.begin(9600);
}
void loop() {
rawValue = analogRead(pin);
Serial.println(rawValue);
delay(10);
}
Фильтрация шума реализуется скользящим средним. Добавьте буфер на 10–20 измерений для сглаживания резких скачков.
#define BUFFER_SIZE 15
int buffer[BUFFER_SIZE];
int index = 0;
void loop() {
buffer[index] = analogRead(pin);
index = (index + 1) % BUFFER_SIZE;
int smoothed = 0;
for (int i = 0; i < BUFFER_SIZE; i++) {
smoothed += buffer[i];
}
smoothed /= BUFFER_SIZE;
Serial.println(smoothed);
}
Пороговая активация позволяет реагировать на громкие звуки. Установите границу срабатывания, сравнивая текущее значение с константой.
#define THRESHOLD 500
void loop() {
int value = analogRead(pin);
if (value > THRESHOLD) {
digitalWrite(LED_BUILTIN, HIGH);
} else {
digitalWrite(LED_BUILTIN, LOW);
}
}
Для анализа частот используйте библиотеку FixFFT
. Преобразуйте аналоговые данные в массив, затем примените быстрое преобразование Фурье.
#include
char real[128], imag[128];
void loop() {
for (int i = 0; i < 128; i++) {
real[i] = analogRead(pin) / 4 - 128;
imag[i] = 0;
}
fix_fft(real, imag, 7, 0);
int magnitude = sqrt(real[10] * real[10] + imag[10] * imag[10]);
Serial.println(magnitude);
}