[sdiy] [SDIY] Measuring the sound levels from a microphone using an ESP32 board

Tom Wiltshire tom at electricdruid.net
Mon Jul 6 13:42:38 CEST 2020

I’d sample the incoming audio directly at a good rate (48KHz maybe) and then do any processing on the data. Much easier to do math inside the uP, rather than outside in analog circuitry.

As to what algorithm you use to measure sound level, there are an absolute ton of them, as I discovered when I looked into VU meters.


       Electric Druid
Synth & Stompbox DIY

> On 6 Jul 2020, at 09:18, Spiros Makris <spirosmakris92 at gmail.com> wrote:
> Hello list,
> I have to develop a small metering application for a university project. The idea behind it is to demonstrate the internet of things and how it can be used to monitor the (audio) noise levels in a room, to be used in places like studios, production facilities or even bars. 
> The sensor used is a common electret type microphone, which is preamplified using a current to voltage opamp stage, based on the OPA172 amplifier. The supply voltage is 3V (same as the microcontroller), but I have the option of 5, 9 or even 12V if needed (only unipolar, though.) Then, this amplified signal needs to be converted to a measurement that will somehow relate to "how loud" the sounds are. Accurate SPL measurements are not required (although they would sure be nice if this was a commercial application). I may have access to a measuring microphone in order to calibrate this when I'm done. I'm using an ESP32 board and its onboard ADC.
> I first tried to use the RMS Arduino library, which measures an AC signal coming into any analogue pin (no external processing, other than prequalification). I couldn't get it to show any coherent readings - I'm not sure if this is due to the sample number or sampling period I'm using. Making an RMS calculation method from scratch wasn't much better either - the variations I could detect were (or seemed to be) minuscule - definitely not enough to be meaningful in this application.
> I'm now trying a more analogue approach: the preamp signal is passed through a Schottky diode, connected to a large capacitor. A transistor is placed parallel to the capacitor, to be used as a reset switch (controlled by the processor).
> <image.png>
> I have tried AC coupling and DC coupling the input - both methods work (DC coupled version is shown). When the input goes over the threshold of the diode, the capacitor is charged (with a pretty large current), and the droop rate is small enough to measure it with the controller, then reset it, to take another measurement. So far so good, but I need some way of eliminating that 0.3V threshold.
> <image.png>
> The graph is taken from the AC coupled version (but is identical to the DC-coupled one, save for some DC offset). The X-axis shows the input amplitude and the Y-axis shows the capacitor's final voltage.
> The ESP32 has adjustable attenuation for the ADC - the maximum range can be adjusted to ~1.3V, ~2.5V and ~3.3V (approximate values). The resolution is 12bits.
> I thought of using a rail to rail opamp to make an ideal diode - however, I only have a SOIC8 version of an OPA172 and no time to print a PCB. Perhaps I can source adapters quickly though - is there a single opamp circuit that could help me?
> I can also mess around with the preamplifier stage, adjusting the dc bias or gain. 
> I'm kinda stuck. Any ideas?
> _______________________________________________
> Synth-diy mailing list
> Synth-diy at synth-diy.org
> http://synth-diy.org/mailman/listinfo/synth-diy

More information about the Synth-diy mailing list