Схема измерения уровня звука с микрофоном MEMS и выводом в Bluetooth-модуль

Если ты пришёл сюда, скорее всего, хочешь собрать устройство, которое измеряет уровень шума в децибелах и отправляет данные по 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 — это переменное напряжение с амплитудой в милливольтах. Его нужно:

  1. Сместить — поднять на половину напряжения питания (Vcc/2), чтобы сигнал не выходил за пределы диапазона АЦП.
  2. Усилить — поднять амплитуду до уровня, который АЦП может оцифровать с хорошим разрешением.
  3. Отфильтровать — убрать постоянную составляющую перед подачей на АЦП.

Если используешь 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, только если откалибровать устройство по известному источнику звука.

Но даже без калибровки можно получить полезные данные — например, отслеживать, как меняется уровень шума в течение дня, или сравнивать разные помещения.

Алгоритм расчёта:

  1. Считываем выборки АЦП с частотой не менее 8 кГц (для захвата звука до 4 кГц). Лучше — 16 кГц.
  2. Вычитаем смещение (Vcc/2 в цифровом виде — примерно 2048 для 12-битного АЦП при 3.3 В).
  3. Считаем RMS на окне из N выборок (обычно 256–1024):

RMS = sqrt( (1/N) × Σ(sample_i − offset)² )

  • Переводим в напряжение:
  • Voltage_RMS = RMS × (3.3 / 4096) — для 12-битного АЦП.

  • Считаем уровень в децибелах (относительно полной шкалы — dBFS):

    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 выглядит примерно так:

    1. Настройка АЦП — 12-битный режим, аттенюация 11 дБ (диапазон до 3.3 В).
    2. Настройка Bluetooth — инициализация BLE, создание сервиса и характеристики.
    3. Цикл измерений:
    • Собираем 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 В.

    Итог: с чего начать

    Вот конкретный план для первого рабочего прототипа:

    1. Бери ESP32 DevKit и MAX9814 на модуле.
    2. Подключи микрофон к GPIO34, 3.3 В и GND.
    3. Найди в интернете библиотеку arduino-sound-level-meter или напиши простой код с расчётом RMS.
    4. Добавь BLE-сервер с характеристикой для передачи значения в дБ.
    5. Проверь через nRF Connect на телефоне — приходят ли данные.
    6. Сравни показания с приложением-шумомером на телефоне — оцени разницу и введи поправку.

    После этого можно улучшать: добавить фильтр А-взвешивания (чтобы измерения соответствовали восприятию человеческого уха), записывать данные на SD-карту, добавить экран для локального отображения.

    Главное — не пытаться сразу сделать «идеальный шумомер». Сначала собери что-то, что вообще работает и передаёт хоть какие-то данные. А потом уже итеративно улучшай точность и стабильность.

  • Radio-Blog.ru