Если ты пришёл сюда, скорее всего, хочешь собрать устройство, которое измеряет уровень шума в децибелах и отправляет данные по Bluetooth на телефон или другое устройство. Может, для проекта по акустике, может — для мониторинга шума в мастерской, а может — просто из интереса. Разберёмся, как это сделать рабочей схемы, без лишной теории и с конкретными рекомендациями.
Что понадобится «на старте»
Сердце устройства — три основных блока:
- Микрофон MEMS — преобразует звук в электрический сигнал.
- Микроконтроллер с АЦП — оцифровывает сигнал и считает уровень звука.
- Bluetooth-модуль — передаёт результат на смартфон, ПК или другое устройство.
Всё это можно собрать на макетной плате, а если проект долгосрочный — спроектировать свою печатную плату. Рассмотрим каждый блок подробнее.
Выбор микрофона MEMS
Микрофоны MEMS бывают аналоговые и цифровые. Для измерения уровня звука подходят оба типа, но аналоговые проще в подключении к большинству микроконтроллеров.
Аналоговые MEMS-микрофоны выдают аналоговый сигнал, который нужно подавать на вход АЦП микроконтроллера. Популярные варианты:
- INMP441 — на самом деле цифровой (I²S), но часто используется в любительских проектах.
- SPH0645LM4H — тоже I²S, хороший, но требует соответствующего входа у МК.
- MAX9814 — аналоговый выход, встроенный автоматический контроль усиления (AGC), удобен, если не хочешь возиться с усилением вручную.
- MAX4466 — аналоговый, простой, работает от 2.4–5.5 В, подходит для базовых измерений.
Цифровые MEMS-микрофоны (с интерфейсом I²S или PDM) передают уже оцифрованный сигнал. Они дают более стабильный результат, потому что аналоговая часть не подвержена помехам на пути к АЦП. Но тут нужен микроконтроллер, который поддерживает I²S или PDM — например, ESP32, STM32, nRF52.
Для первого проекта я бы рекомендовал MAX9814 с аналоговым выходом — он проще в подключении, и с ним проще добиться приемлемой точности без глубоких знаний цифровой обработки сигналов.
Усиление и фильтрация сигнала
Сырой сигнал с аналогового микрофона MEMS — это переменное напряжение с амплитудой в милливольтах. Его нужно:
- Сместить — поднять на половину напряжения питания (Vcc/2), чтобы сигнал не выходил за пределы диапазона АЦП.
- Усилить — поднять амплитуду до уровня, который АЦП может оцифровать с хорошим разрешением.
- Отфильтровать — убрать постоянную составляющую перед подачей на АЦП.
Если используешь MAX9814 — часть этой работы уже сделана внутри микрофона: у него есть выход со смещением и регулируемое усиление. Если берёшь что-то попроще, например MAX4466, понадобится внешний операционный усилитель или хотя бы делитель напряжения и конденсатор для развязки по постоянному току.
Типовая обвязка для аналогового микрофона:
- Резистор 2.2 кОм между выходом микрофона и землёй (для некоторых моделей).
- Конденсатор 1 мкФ последовательно с выходом — убирает постоянную составляющую.
- Делитель из двух резисторов по 10 кОм от Vcc к земле, средняя точка — через резистор к сигнальной линии, чтобы выставить смещение Vcc/2.
Микроконтроллер: кто будет считать децибелы
Здесь начинается самое интересное. Микроконтроллер должен:
- Оцифровывать сигнал с микрофона через АЦП.
- Вычислять среднеквадратичное значение (RMS) на окне выборок.
- Переводить RMS в децибелы.
- Отправлять результат по Bluetooth.
ESP32 — пожалуй, лучший выбор для этого проекта. У него встроенный Bluetooth (Classic и BLE), два 12-битных АЦП, достаточно производительности для расчётов в реальном времени и огромное количество готовых библиотек. Питается от 3.3 В, легко программируется через Arduino IDE или ESP-IDF.
Альтернативы:
- Arduino Nano + HC-05 — рабочий вариант, но 10-битный АЦП ограничивает точность, а HC-05 — это Bluetooth Classic, который жрёт больше энергии и не работает с iPhone без MFI.
- nRF52832 / nRF52840 — отличный выбор, если нужен BLE и низкое энергопотребление. Есть 12-битный АЦП, хорошая поддержка в Arduino через Adafruit.
- STM32 — мощный, но сложнее в освоении новичкам.
Как считать децибелы из сигнала АЦП
Тут важно понимать одну вещь: мы не получаем «настоящие» децибелы в акустическом смысле без калибровки. Мы получаем относительный уровень, который можно привязать к шкале dB SPL, только если откалибровать устройство по известному источнику звука.
Но даже без калибровки можно получить полезные данные — например, отслеживать, как меняется уровень шума в течение дня, или сравнивать разные помещения.
Алгоритм расчёта:
- Считываем выборки АЦП с частотой не менее 8 кГц (для захвата звука до 4 кГц). Лучше — 16 кГц.
- Вычитаем смещение (Vcc/2 в цифровом виде — примерно 2048 для 12-битного АЦП при 3.3 В).
- Считаем RMS на окне из N выборок (обычно 256–1024):
RMS = sqrt( (1/N) × Σ(sample_i − offset)² )
Voltage_RMS = RMS × (3.3 / 4096) — для 12-битного АЦП.
dBFS = 20 × log10(Voltage_RMS / Vref)
Чтобы получить приближение к dB SPL, нужна калибровка: измерь показания при известном уровне звука (например, с калибратором на 94 дБ) и введи поправочный коэффициент.
Bluetooth-модуль и передача данных
Если выбрал ESP32 — Bluetooth уже встроен. Если используешь Arduino или другой МК без Bluetooth, понадобится внешний модуль.
Варианты Bluetooth:
- BLE (Bluetooth Low Energy) — экономит энергию, работает с Android и iOS, передаёт малые порции данных. Идеально для периодической отправки значений уровня звука.
- Bluetooth Classic (SPP) — быстрее, но жрёт больше энергии и не работает с iPhone без специальной сертификации. Подходит, если нужна передача на Android или ПК.
Для BLE на ESP32 можно использовать библиотеку NimBLE — она легче стандартной BLE из Arduino-пакета и работает быстрее. Создаёшь BLE-сервер с кастомным сервисом и характеристикой, куда записываешь текущее значение уровня звука.
Примерная структура пакета данных:
- 1 байт — номер пакета (для отслеживания потерь).
- 2 байта — значение dB (целое число, умноженное на 10, например 653 = 65.3 дБ).
- 1 байт — флаг (например, перегрузка микрофона).
Сравнение популярных платформ для проекта
| Платформа | АЦП | Bluetooth | Питание | Сложность | Подходит для |
|---|---|---|---|---|---|
| ESP32 | 12 бит, 2 канала | BLE + Classic | 3.3 В | Низкая | Универсальный выбор |
| Arduino Nano + HC-05 | 10 бит | Classic (SPP) | 5 В | Низкая | Прототипы, Android |
| nRF52840 | 12 бит | BLE | 3.3 В | Средняя | Низкое энергопотребление, iOS |
| STM32F103 + HC-05 | 12 бит | Classic | 3.3 В | Средняя | Когда нужна производительность |
Схема подключения (на примере ESP32 + MAX9814)
Минимальная обвязка:
- Vcc микрофона → 3.3 В ESP32.
- GND микрофона → GND ESP32.
- OUT микрофона → GPIO34 (ADC1_CH6) ESP32.
MAX9814 не требует внешних компонентов для базовой работы — у него уже есть внутреннее смещение и усиление. Ногу Gain можно оставить висящей (усиление 40 дБ), подтянуть к Vcc (50 дБ) или к GND (60 дБ) в зависимости от ожидаемого диапазона уровней.
Если используешь MAX4466 — понадобится конденсатор 1 мкФ на выходе и делитель напряжения для смещения. Потенциометр на 100 кОм на ноге Gain позволяет подстроить чувствительность.
Программная часть: что писать в коде
Логика программы для ESP32 на Arduino выглядит примерно так:
- Настройка АЦП — 12-битный режим, аттенюация 11 дБ (диапазон до 3.3 В).
- Настройка Bluetooth — инициализация BLE, создание сервиса и характеристики.
- Цикл измерений:
- Собираем 512 выборок за ~32 мс (при 16 кГц).
- Считаем RMS.
- Переводим в dBFS.
- Отправляем значение через BLE.
- Пауза 100–500 мс перед следующим измерением.
Частота отправки зависит от задачи: для мониторинга достаточно 1–2 раз в секунду, для анализа звуковых событий — 10 раз в секунду и чаще.
Важный момент: АЦП ESP32 по умолчанию не очень стабилен. Рекомендую сделать калибровку — измерить напряжение на входе при известном сигнале и скорректировать коэффициент преобразования. Также полезно включить встроенную калибровку АЦП (функция adc1_config_channel_atten).
Частые ошибки при сборке
Забыли про смещение сигнала. Если подать аналоговый сигнал от микрофона напрямую на АЦП без смещения на Vcc/2, отрицательная полуволна сигнала будет «обрубаться» и показания будут хаотичными.
Слишком высокое усиление. Если микрофон смотрит на громкий источник и усиление выставлено максимальное — сигнал «упрётся» в потолок АЦП. Получишь одно и то же значение для разных уровней. Лучше начать с минимального усиления и увеличивать.
Не учитывают время окна измерения. Если считать RMS по 4 выборкам — получишь случайные числа. Нужно минимум 256 выборок для более-менее стабильного результата.
Попытка получить «настоящие» децибелы без калибровки. Без калибратора ты получишь относительные значения. Это нормально для многих задач, но не обещай точность ±1 дБ, если не калибровал.
Плохое питание. Микрофон MEMS чувствителен к помехам по питанию. Если ESP32 питается от USB ноутбука — будут наводки. Поставь керамический конденсатор 100 нФ и электролит 10 мкФ между Vcc и GND прямо у микрофона.
Что выбрать под свою задачу
Нужен простой логгер шума с передачей на Android-телефон: ESP32 + MAX9814 + BLE. Собирается за вечер, работает от аккумулятора, данные принимаются через приложение nRF Connect или самописное.
Нужна работа с iPhone: только BLE. ESP32 подходит, nRF52840 — ещё лучше. Bluetooth Classic с iPhone не работает без MFI-сертификации.
Нужна автономная работа неделями: nRF52840 + аналоговый микрофон + аккумулятор 18650. BLE с интервалом рекламы 1 секунда, глубокий сон между измерениями.
Нужна высокая точность и частота обновления: STM32 + цифровой микрофон I²S (например INMP441) + обработка через библиотеку CMSIS-DSP для быстрого расчёта RMS и FFT.
Приём данных на телефоне
Для прототипа не обязательно писать приложение. Можно использовать:
- nRF Connect (Android/iOS) — сканирует BLE-устройства и показывает характеристики.
- Serial Bluetooth Terminal — если используешь Bluetooth Classic (SPP).
Если хочешь что-то своё — проще всего начать с MIT App Inventor (визуальный конструктор для Android) или Flutter с библиотекой flutter_blue_plus для кроссплатформенной разработки.
Питание и энергопотребление
Если устройство должно работать от батареи:
- ESP32 в активном режиме потребляет ~80 мА. В глубоком сне — ~10 мкА.
- MAX9814 жрёт около 230 мкА — это мелочь.
- nRF52840 в активном режиме — ~15 мА, в сне — единицы мкА.
Для работы от аккумулятора 3.7 В подойдёт повышающий преобразователь до 5 В (если нужен 5 В для периферии) или можно питать ESP32 напрямую от аккумулятора через LDO 3.3 В, если напряжение аккумулятора не опускается ниже 3.3 В.
Итог: с чего начать
Вот конкретный план для первого рабочего прототипа:
- Бери ESP32 DevKit и MAX9814 на модуле.
- Подключи микрофон к GPIO34, 3.3 В и GND.
- Найди в интернете библиотеку
arduino-sound-level-meterили напиши простой код с расчётом RMS. - Добавь BLE-сервер с характеристикой для передачи значения в дБ.
- Проверь через nRF Connect на телефоне — приходят ли данные.
- Сравни показания с приложением-шумомером на телефоне — оцени разницу и введи поправку.
После этого можно улучшать: добавить фильтр А-взвешивания (чтобы измерения соответствовали восприятию человеческого уха), записывать данные на SD-карту, добавить экран для локального отображения.
Главное — не пытаться сразу сделать «идеальный шумомер». Сначала собери что-то, что вообще работает и передаёт хоть какие-то данные. А потом уже итеративно улучшай точность и стабильность.
