INMP441 ESP32 I2S Mikrofon: Audio lesen, dB messen, Wellenform
INMP441 I2S-Mikrofon am ESP32 anschließen: Pinbelegung, 24-Bit-Audio per I2S lesen, Lautstärke in dB berechnen, Wellenform im Serial Plotter, Pico-Code.
Das INMP441 ist ein kleines MEMS-Mikrofonmodul, das den Schall intern digitalisiert und über den I2S-Bus direkt 24-Bit-Samples sendet. Die Kombination INMP441 ESP32 ist der einfachste Weg zu sauberem Audio, ohne analoges Mikrofon, Verstärker und ADC. Du schließt das Modul mit sechs Kabeln an den ESP32 an, holst mit ein paar Zeilen I2S-Code 16 000 Samples pro Sekunde ab, berechnest daraus den Lautstärkepegel der Umgebung in Dezibel (dB) und verfolgst die Wellenform live im Serial Plotter.
In dieser Anleitung siehst du Schritt für Schritt, wie das INMP441 funktioniert, wofür die drei I2S-Leitungen da sind, einen fertigen Code, der sowohl mit dem ESP32-Arduino-Core 2.x als auch 3.x kompiliert, den Unterschied zwischen dBFS und dB SPL und die Formel eines echten Schallpegelmessers. Am Ende findest du die Nutzung mit dem Raspberry Pi Pico in MicroPython, den Unterschied zum günstigen analogen KY-038 Schallsensor und die häufigsten Verdrahtungsfehler.

Was ist das INMP441 und wie funktioniert es?
Das INMP441 ist ein von TDK InvenSense gefertigtes, omnidirektionales MEMS-Mikrofon. MEMS bedeutet hier einen winzigen Kondensator aus einer mikroskopisch kleinen Membran und einer festen Platte auf Silizium: Schwingt die Membran durch den Schall, ändert sich die Kapazität. Bei einem klassischen Elektretmikrofon kommt diese Änderung als schwache analoge Spannung heraus, die du selbst verstärken, filtern und mit einem ADC messen musst. Im INMP441 sitzen dagegen Vorverstärker, Anti-Aliasing-Filter, 24-Bit-Sigma-Delta-ADC und I2S-Schnittstelle in einem Gehäuse. Aus dem Mikrofon kommen also keine Spannungen mehr, sondern Zahlen im Takt eines Taktsignals. So sammelt das Kabel kein analoges Rauschen auf, die ADC-Qualität deines Boards spielt keine Rolle, und jeder passende 3,3-V-Mikrocontroller erreicht die gleiche Audioqualität. Das kleine Loch auf dem Modul ist der Schalleinlass; achte beim Einbau in ein Gehäuse darauf, es nicht zu verdecken.
| Eigenschaft | Wert |
|---|---|
| Typ | MEMS-Mikrofon, omnidirektional, digitaler Ausgang |
| Schnittstelle | I2S, 24 Bit, MSB zuerst, Zweierkomplement |
| Versorgung | 1,8–3,3 V |
| Strom | Etwa 1,4 mA |
| Empfindlichkeit | −26 dBFS (1 kHz, 94 dB SPL) |
| Signal-Rausch-Verhältnis (SNR) | 61 dBA |
| Frequenzgang | 60 Hz – 15 kHz |
| Maximaler Schalldruck (AOP) | 120 dB SPL |
| SCK-Frequenz | Etwa 0,5–3,2 MHz (Abtastrate etwa 7,8–50 kHz) |
| Modulpins | VDD, GND, SD, L/R, WS, SCK |
Was ist I2S? Digitales Audio mit drei Leitungen
I2S (Inter-IC Sound) ist ein serieller Bus, der entwickelt wurde, um Audio-Samples zwischen Chips zu übertragen; trotz des ähnlichen Namens hat er nichts mit I2C zu tun. Er hat drei Leitungen: SCK (Bittakt) sagt, wann jedes Datenbit gelesen wird, WS (Word Select, auch LRCLK genannt) gibt an, ob gerade der linke oder der rechte Kanal gesendet wird, und SD ist die Datenleitung selbst. Dabei ist der ESP32 der Master: Er erzeugt beide Takte, und das Mikrofon legt die Daten im Takt auf die SD-Leitung. Beim INMP441 besteht jeder Frame aus 64 SCK-Impulsen: 32 Bit linker Kanal, 32 Bit rechter Kanal. Die Abtastrate ist deshalb SCK / 64; für 16 kHz erzeugt der ESP32 einen Bittakt von etwa 1,024 MHz. Das Mikrofon schreibt die 24-Bit-Messung MSB zuerst in den 32-Bit-Slot seines Kanals, die restlichen 8 Bit sind null. Deshalb schieben wir den Wert im Code um 8 Bit nach rechts.
| INMP441-Pin | Funktion |
|---|---|
| VDD | Versorgung, 1,8–3,3 V |
| GND | Masse |
| SCK | Bittakt-Eingang (kommt vom Board) |
| WS | Eingang für den Kanalwahl-Takt (kommt vom Board) |
| SD | Serieller Audiodaten-Ausgang (vom Mikrofon zum Board) |
| L/R | Kanalwahl: GND = linker Kanal, VDD = rechter Kanal |
INMP441 anschließen: ESP32 und Raspberry Pi Pico
| INMP441-Pin | ESP32 | Raspberry Pi Pico |
|---|---|---|
| VDD | 3V3 | 3V3(OUT) (Pin 36) |
| GND | GND | GND |
| SCK | GPIO 32 | GP16 |
| WS | GPIO 25 | GP17 |
| SD | GPIO 33 | GP18 |
| L/R | GND | GND |
Beim ESP32 lassen sich die I2S-Signale über die GPIO-Matrix auf beliebige Pins legen; die Nummern 32, 25 und 33 in der Tabelle sind nicht zwingend, sondern nur sichere Wahlen. Halte dich nur von den Strapping-Pins fern, die das Verhalten beim Start bestimmen (GPIO 0, 2, 5, 12, 15), und von GPIO 6–11, die für den Flash-Speicher reserviert sind. GPIO 34–39 sind reine Eingänge und eignen sich deshalb für die SD-Leitung, aber nicht für SCK und WS. Beim Pico gilt eine andere Regel: Der MicroPython-I2S-Treiber nutzt PIO, und der WS-Pin muss um eins größer sein als der SCK-Pin (z. B. GP16 und GP17). Halte die Kabel kürzer als 10–15 cm; das Taktsignal im Megahertz-Bereich wird auf langen Jumperkabeln verzerrt. Die Pinbelegung deines Boards kannst du im Pinout-Tool prüfen.
Schritt für Schritt: erstes Audio mit dem ESP32 lesen
- Stelle sicher, dass das ESP32-Board-Paket in der Arduino IDE installiert ist, und wähle unter Werkzeuge > Board ESP32 Dev Module. Wenn du die Installation nicht kennst, lies Was ist der ESP32?.
- Stecke das Modul aufs Breadboard; verbinde VDD mit 3V3, GND mit GND und L/R ebenfalls mit GND.
- Verbinde SCK mit GPIO 32, WS mit GPIO 25 und SD mit GPIO 33 und halte die Kabel kurz.
- Lade den Code unten hoch. Du brauchst keine zusätzliche Bibliothek: ESP_I2S im 3.x-Core und driver/i2s.h im 2.x-Core sind bereits im Board-Paket enthalten.
- Öffne den Serial Monitor mit 115200 Baud; in einem ruhigen Raum solltest du etwa 35–50 dB sehen, beim Sprechen etwa 55–70 dB.
- Öffne Werkzeuge > Serieller Plotter und verfolge die dBFS- und dB-SPL-Kurven live; klatsche neben dem Mikrofon und sieh, wie die Kurve springt.
ESP32-Code: Lautstärke (dB) mit dem INMP441 messen
Der Code prüft die Version des ESP32-Arduino-Cores mit ESP_ARDUINO_VERSION_MAJOR. Bei 3.x nutzt er die neue ESP_I2S-Bibliothek, bei 2.x den klassischen I2S-Treiber von ESP-IDF. Da beide Wege dieselben Funktionen micBegin() und micRead() bieten, bleibt die Berechnung in loop() gleich. In jedem Durchlauf werden 512 Samples gelesen (bei 16 kHz also 32 ms Audio), der DC-Offset wird abgezogen, der Effektivwert (RMS) berechnet und in Dezibel umgerechnet.
1// INMP441 + ESP32: ses seviyesi (dB) olcer / sound level (dB) meter
2// ESP32 Arduino core 2.x ve 3.x / ESP32 Arduino core 2.x and 3.x
3#include <Arduino.h>
4#include <math.h>
5
6#define MIC_SCK 32 // INMP441 SCK
7#define MIC_WS 25 // INMP441 WS
8#define MIC_SD 33 // INMP441 SD
9
10const uint32_t SAMPLE_RATE = 16000; // ornekleme hizi / sample rate
11const size_t BLOCK = 512; // blok basina ornek / samples per block
12const double FS_RMS = 5931642.0; // 8388608 / sqrt(2): tam olcek sinus RMS / full-scale sine RMS
13const double DB_OFFSET = 120.0; // 94 dB SPL - (-26 dBFS)
14
15int32_t samples[BLOCK];
16
17#if ESP_ARDUINO_VERSION_MAJOR >= 3
18#include <ESP_I2S.h>
19I2SClass i2s;
20
21bool micBegin() {
22 i2s.setPins(MIC_SCK, MIC_WS, -1, MIC_SD); // bclk, ws, dout (yok / none), din
23 return i2s.begin(I2S_MODE_STD, SAMPLE_RATE, I2S_DATA_BIT_WIDTH_32BIT,
24 I2S_SLOT_MODE_MONO, I2S_STD_SLOT_LEFT); // L/R = GND -> sol / left
25}
26
27size_t micRead(int32_t *buf, size_t count) {
28 size_t bytes = i2s.readBytes((char *)buf, count * sizeof(int32_t));
29 return bytes / sizeof(int32_t);
30}
31#else
32#include <driver/i2s.h>
33
34bool micBegin() {
35 i2s_config_t cfg = {};
36 cfg.mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX); // ana cihaz, alici / master, receiver
37 cfg.sample_rate = SAMPLE_RATE;
38 cfg.bits_per_sample = I2S_BITS_PER_SAMPLE_32BIT;
39 cfg.channel_format = I2S_CHANNEL_FMT_ONLY_LEFT; // L/R = GND -> sol / left
40 cfg.communication_format = I2S_COMM_FORMAT_STAND_I2S;
41 cfg.intr_alloc_flags = ESP_INTR_FLAG_LEVEL1;
42 cfg.dma_buf_count = 4;
43 cfg.dma_buf_len = 256;
44 cfg.use_apll = false;
45
46 i2s_pin_config_t pins = {};
47 pins.mck_io_num = I2S_PIN_NO_CHANGE;
48 pins.bck_io_num = MIC_SCK;
49 pins.ws_io_num = MIC_WS;
50 pins.data_out_num = I2S_PIN_NO_CHANGE;
51 pins.data_in_num = MIC_SD;
52
53 if (i2s_driver_install(I2S_NUM_0, &cfg, 0, NULL) != ESP_OK) return false;
54 return i2s_set_pin(I2S_NUM_0, &pins) == ESP_OK;
55}
56
57size_t micRead(int32_t *buf, size_t count) {
58 size_t bytes = 0;
59 i2s_read(I2S_NUM_0, buf, count * sizeof(int32_t), &bytes, portMAX_DELAY);
60 return bytes / sizeof(int32_t);
61}
62#endif
63
64void setup() {
65 Serial.begin(115200);
66 if (!micBegin()) {
67 Serial.println("I2S baslatilamadi / I2S init failed");
68 while (true) delay(1000);
69 }
70}
71
72void loop() {
73 size_t n = micRead(samples, BLOCK);
74 if (n == 0) return;
75
76 double sum = 0;
77 for (size_t i = 0; i < n; i++) {
78 samples[i] >>= 8; // 32 bit yuvadan 24 bit veri / 24-bit data from 32-bit slot
79 sum += samples[i];
80 }
81 double mean = sum / n; // DC kaymasi / DC offset
82
83 double sq = 0;
84 for (size_t i = 0; i < n; i++) {
85 double v = (double)samples[i] - mean;
86 sq += v * v;
87 }
88 double rms = sqrt(sq / n);
89 if (rms < 1.0) rms = 1.0; // log10(0) olmasin / avoid log10(0)
90
91 double dbfs = 20.0 * log10(rms / FS_RMS);
92 double spl = dbfs + DB_OFFSET;
93
94 Serial.print("dBFS:");
95 Serial.print(dbfs, 1);
96 Serial.print(" dB_SPL:");
97 Serial.println(spl, 1);
98}| Codeteil | Was macht er? |
|---|---|
| SAMPLE_RATE = 16000 | Es werden 16 000 Samples pro Sekunde aufgenommen; die SCK-Frequenz beträgt 16 000 × 64 = 1,024 MHz. Das reicht für Sprache; für Musik kannst du 44 100 wählen (SCK etwa 2,82 MHz). |
| 32 Bit Datenbreite | Das INMP441 erwartet pro WS-Frame 64 SCK-Impulse; wählst du 16 Bit, wird der Frame kürzer und die Daten werden unbrauchbar. |
| MONO + LEFT / ONLY_LEFT | Es wird nur der linke Kanal gelesen; da L/R mit GND verbunden ist, nutzt das Mikrofon den linken Slot. |
| samples[i] >>= 8 | Extrahiert die 24-Bit-Messung aus dem 32-Bit-Slot; der Wert liegt zwischen −8 388 608 und +8 388 607. |
| Mittelwert abziehen | Entfernt den kleinen DC-Offset im Signal; sonst fiele der RMS-Wert zu groß aus. |
| rms | Wurzel aus dem Mittelwert der Sample-Quadrate; steht für die mittlere Leistung des Schalls. |
| dbfs + DB_OFFSET | Rechnet das Ergebnis mit der Datenblatt-Empfindlichkeit von −26 dBFS bei 94 dB SPL in dB SPL um. |
Wie wird der Pegel berechnet? dBFS und dB SPL
Weil sich der Schalldruck über einen sehr großen Bereich ändert, nutzt man die logarithmische Dezibel-Skala: Eine Verdopplung der Amplitude entspricht etwa 6 dB mehr, eine Verzehnfachung 20 dB. Die Zahlen des Mikrofons werden zuerst in dBFS (Dezibel relativ zur Vollaussteuerung) umgerechnet: dBFS = 20 × log10(RMS / Vollausschlag-RMS). Die Vollaussteuerung ist der RMS-Wert einer Sinuswelle, deren Spitze den größten 24-Bit-Wert 8 388 608 erreicht, also 8 388 608 / √2 ≈ 5 931 642. Auf dieser Skala ist 0 dBFS die Übersteuerungsgrenze des Mikrofons, jeder leisere Schall bekommt einen negativen Wert. Für den physikalischen Schalldruck, also dB SPL, nutzt man die Empfindlichkeit aus dem Datenblatt: Das INMP441 liefert einen 1-kHz-Ton mit 94 dB SPL als −26 dBFS. Daraus ergibt sich dB SPL = dBFS + 94 − (−26) = dBFS + 120. Kommt zum Beispiel ein RMS-Wert von 5 932 heraus, ist dBFS = 20 × log10(0,001) = −60, und der Pegel liegt bei etwa 60 dB SPL, also normaler Gesprächslautstärke.
| Schallquelle | Ca. dB SPL | dBFS beim INMP441 |
|---|---|---|
| Eigenrauschen des Mikrofons | 33 | −87 |
| Ruhiger Raum | 40 | −80 |
| Normales Gespräch (1 m) | 60 | −60 |
| Dichter Verkehr, Staubsauger | 70–80 | −50 bis −40 |
| Gehörschädigung bei langer Einwirkung | 85 | −35 |
| Messreferenz (Kalibrator) | 94 | −26 |
| Bohrmaschine, vor der Konzertbühne | 100–110 | −20 bis −10 |
| Obergrenze des Mikrofons (AOP) | 120 | 0 |
Wellenform im Serial Plotter zeichnen
Der Dezibelwert sagt dir, wie laut es ist; um die Form des Schalls zu sehen, musst du die rohen Samples zeichnen lassen. Ersetze im selben Sketch nur die Funktion loop() durch die folgende. Hier gibt es eine wichtige Grenze: Eine serielle Verbindung mit 115200 Baud überträgt etwa 11 500 Zeichen pro Sekunde, und das reicht nicht, um 16 000 Samples pro Sekunde auszugeben. Deshalb gibt der Code einen Block von 512 Samples hintereinander aus; während der Block geschrieben wird, geht der eintreffende Schall verloren, aber jedes Stück, das du im Plotter siehst, ist ein lückenloser, echter 32-ms-Ausschnitt.
1// dB taslaginda loop() yerine bunu kullan / Use this instead of loop() in the dB sketch
2void loop() {
3 size_t n = micRead(samples, BLOCK);
4 for (size_t i = 0; i < n; i++) {
5 int32_t v = samples[i] >> 8; // 24 bit ham ornek / 24-bit raw sample
6 Serial.print("ses:");
7 Serial.println(v);
8 }
9}Wenn du ins Mikrofon pfeifst, siehst du im Plotter eine fast saubere Sinuswelle. Bei einem 1-kHz-Pfiff dauert eine Periode 1 ms und entspricht bei 16 kHz Abtastrate 16 Punkten; durch Zählen der Punkte pro Periode kannst du die Frequenz grob abschätzen. Sprache ist eine Mischung vieler Frequenzen und zeichnet deshalb eine unregelmäßige Welle mit Hüllkurve; ein Klatschen erzeugt eine kurze, sehr hohe Spitze. Da der Plotter die Achse automatisch skaliert, können kleine Rauschschwankungen in der Stille groß aussehen; das ist normal. Details zum Serial Monitor und Serial Plotter findest du im Artikel Arduino Serial Monitor.
INMP441 am Raspberry Pi Pico (MicroPython)
Der Raspberry Pi Pico hat keine eigene I2S-Einheit, aber die programmierbaren PIO-Blöcke emulieren I2S in Hardware-Geschwindigkeit, und die Klasse machine.I2S von MicroPython übernimmt das für dich. Du musst keine zusätzliche Datei installieren; eine aktuelle MicroPython-Version genügt. Im Code werden bits=32 und format=I2S.MONO gewählt, die gelesenen Samples werden wieder um 8 Bit nach rechts geschoben und mit derselben Formel in Dezibel umgerechnet. Da Python-Schleifen langsamer sind als C, ist eine Blockgröße von 512 Samples ein guter Kompromiss; dass während der Berechnung ein paar Millisekunden Schall verloren gehen, beeinflusst das Messergebnis kaum. Programmierst du den Pico mit der Arduino IDE, erfüllt die I2S-Bibliothek im arduino-pico-Core denselben Zweck; auch dort muss der WS-Pin (LRCLK) um eins größer sein als der BCLK-Pin. Bist du neu bei MicroPython, wirf zuerst einen Blick auf Was ist der Raspberry Pi Pico?.
1from machine import Pin, I2S
2import array
3import math
4
5SCK_PIN = 16 # INMP441 SCK
6WS_PIN = 17 # INMP441 WS (SCK + 1 olmali / must be SCK + 1)
7SD_PIN = 18 # INMP441 SD
8
9FS_RMS = 5931642.0 # 8388608 / sqrt(2): tam olcek sinus RMS / full-scale sine RMS
10DB_OFFSET = 120.0 # 94 dB SPL - (-26 dBFS)
11LN10 = math.log(10)
12
13mic = I2S(0, sck=Pin(SCK_PIN), ws=Pin(WS_PIN), sd=Pin(SD_PIN),
14 mode=I2S.RX, bits=32, format=I2S.MONO,
15 rate=16000, ibuf=8192)
16
17samples = array.array('i', [0] * 512) # 32 bit ornek dizisi / 32-bit sample array
18
19while True:
20 n = mic.readinto(samples) // 4 # okunan ornek sayisi / number of samples read
21 if n == 0:
22 continue
23 total = 0
24 for i in range(n):
25 samples[i] >>= 8 # 24 bit degeri ayikla / extract 24-bit value
26 total += samples[i]
27 mean = total / n # DC kaymasi / DC offset
28 sq = 0.0
29 for i in range(n):
30 d = samples[i] - mean
31 sq += d * d
32 rms = max(math.sqrt(sq / n), 1.0)
33 dbfs = 20 * math.log(rms / FS_RMS) / LN10
34 print("dBFS: {:.1f} dB SPL: {:.1f}".format(dbfs, dbfs + DB_OFFSET))INMP441 und KY-038: der Unterschied zum analogen Schallsensor

Der KY-038 ist ein günstiges Modul aus einer Elektretmikrofonkapsel, einem Trimmer zur Schwelleneinstellung und einem LM393-Komparator. Sein digitaler Ausgang (DO) wechselt den Zustand, wenn der Schall deine eingestellte Schwelle überschreitet; der analoge Ausgang (AO) gibt die rohe Spannung der Kapsel aus und wird mit dem ADC des Boards gelesen. Das reicht, um Klatschen zu erkennen oder festzustellen, ob überhaupt Geräusche da sind. Weil das Modul aber keinen Verstärker hat, ist das Signal sehr schwach: Der 10-Bit-ADC des Arduino Uno sieht bei Sprache nur eine Änderung von wenigen Stufen, und auch der ADC des ESP32 rauscht. Das INMP441 misst dagegen schon im Mikrofon mit 24 Bit; da zwischen Mikrofon und Board weder analoges Kabel noch Verstärker noch ADC liegen, nimmt es einen Bereich von etwa 87 dB vom Rauschboden bis zur Übersteuerungsgrenze sauber auf. Kurz gesagt: Der KY-038 ist ein Geräuschschalter, das INMP441 ein echtes Mikrofon. Die Grenzen analoger Messung findest du ausführlich im ADC-Leitfaden.
| Eigenschaft | INMP441 | KY-038 |
|---|---|---|
| Mikrofontyp | MEMS, digitaler Ausgang | Elektretkapsel, analog |
| Ausgang | I2S, 24-Bit-Samples | AO analoge Spannung + DO Schwellenausgang |
| Versorgung | 1,8–3,3 V | 3,3–5 V |
| Kompatible Boards | ESP32, Pico und Boards mit I2S | Jedes Board inkl. Uno |
| Audioqualität | Ausreichend für Aufnahme und Analyse (60 Hz – 15 kHz) | Nur grober Pegel |
| dB-Messung | Mit Formel möglich | Nicht zuverlässig |
| Typische Nutzung | Lärmmessgerät, Tonaufnahme, FFT, Sprachbefehle | Klatschschalter, Geräusch-Alarm |
Projektideen mit dem INMP441
- Musikreaktive LEDs: Wandle den Pegel in die Anzahl der leuchtenden LEDs eines WS2812B-Streifens um; Details in den Artikeln Musikreaktive LEDs und WS2812B NeoPixel.
- Lärmampel für die Klasse: Baue eine Warnlampe, die unter 55 dB grün, zwischen 55 und 70 dB gelb und darüber rot leuchtet.
- Live-Lärmpanel im Web: Sende den dB-Wert per WebSocket an den Browser und verfolge ihn als Diagramm auf dem Handy; die Grundlagen stehen im Artikel ESP32 Webserver und WebSocket.
- Lärmsensor fürs Smart Home: Übertrage die Messwerte per MQTT an Home Assistant; die Anleitung ESP32 MQTT und Home Assistant erleichtert dir die Arbeit.
- Warnung bei Babyweinen oder Hundebellen: Überschreitet der Schall eine bestimmte Zeit lang die Schwelle, sende dir mit einem Telegram-Bot eine Nachricht aufs Handy.
- Tonrekorder: Schreibe die Samples als 16-Bit-WAV-Datei auf ein SD-Kartenmodul und höre sie am Computer an.
- Pfeifsteuerung: Finde per FFT die dominante Frequenz und löse bei einem bestimmten Pfeifton eine LED oder ein Relais aus.
Häufige Fehler und ihre Lösungen
| Symptom | Mögliche Ursache | Lösung |
|---|---|---|
| Der dB-SPL-Wert bleibt konstant bei etwa −15,5 | Auf der SD-Leitung kommen keine Daten an, alle Samples sind 0 | Prüfe das SD-Kabel und ob L/R mit GND verbunden ist; sonst stelle den Kanal auf rechts (I2S_STD_SLOT_RIGHT in 3.x, I2S_CHANNEL_FMT_ONLY_RIGHT in 2.x) |
| Bei lauterem Schall steigt der Wert nicht, er springt zufällig | SCK und WS sind vertauscht oder die Kabel sind zu lang | Korrigiere die Pins laut Tabelle, kürze die Kabel auf unter 10–15 cm |
| Beim Start der Fehler "CONFLICT! The new i2s driver can't work along with the legacy i2s driver" | Im 3.x-Core wurden das alte driver/i2s.h und der neue Treiber zusammen verwendet | Nutze nur einen Treiber; die #if-Struktur hier wählt automatisch den richtigen |
| dB-Werte weichen 10–20 dB vom Schallpegelmesser ab | Falsche Bitverschiebung, DC nicht abgezogen oder nicht kalibriert | Verschiebe um 8 Bit, ziehe den Mittelwert ab, kalibriere mit einem konstanten Ton |
| ValueError beim Erstellen von I2S am Pico | Der WS-Pin ist nicht um eins größer als der SCK-Pin | Nutze aufeinanderfolgende Pins, z. B. SCK = GP16, WS = GP17 |
| Das Mikrofon wird heiß oder reagiert gar nicht | VDD wurde an 5 V angeschlossen | Sofort an 3V3 anschließen; das Mikrofon könnte beschädigt sein, probiere ein neues |
| Die Welle im Serial Plotter erscheint abgehackt | Die serielle Leitung schafft keine 16 000 Samples pro Sekunde | Das ist normal; für ein flüssigeres Bild erhöhe die Baudrate auf 921600 |
Mit ein paar Kabeln und einem kurzen Code verschafft das INMP441 dem ESP32 ein echtes digitales Mikrofon; es ist die Grundlage vieler Projekte, vom Schallpegelmesser bis zu musikreaktivem Licht. Wenn du Schall lieber als Zahlen verarbeiten willst, statt dich mit einem analogen Sensor zu begnügen, ist es die erste Wahl. In der BlueGrays-App findest du ESP32-Projekte mit LEDs, Buzzer, WS2812B-Streifen und Webserver mit Schaltplan und Code Schritt für Schritt und kannst dieses Mikrofon leicht dazu ergänzen.
Häufige Fragen
Funktioniert das INMP441 mit dem Arduino Uno?
Nein, praktisch nicht. Arduino Uno und Nano haben keine I2S-Hardware, arbeiten mit 5-V-Logik, und 2 KB RAM reichen nicht für einen Audiopuffer. Für das INMP441 brauchst du einen ESP32, ESP32-S3, Raspberry Pi Pico oder ein anderes 3,3-V-Board mit I2S.
Wofür ist der L/R-Pin des INMP441 da?
Der L/R-Pin wählt, welchen Kanal des Stereo-Frames das Mikrofon nutzt: an GND der linke, an 3,3 V der rechte Kanal. Verbindest du SCK, WS und SD zweier INMP441 gemeinsam und stellst eines auf links, das andere auf rechts, bekommst du Stereo-Audio über eine einzige I2S-Leitung. Lass den Pin nicht offen; sonst sind die Messwerte null oder instabil.
Kann ich mit dem INMP441 Ton aufnehmen?
Ja. Reduzierst du die 24-Bit-Samples auf 16 Bit und schreibst sie mit WAV-Header auf eine SD-Karte, erhältst du eine Aufnahme, die du am Computer abspielen kannst. 16 kHz Abtastrate reichen für Sprache; eine Minute 16-Bit-Mono belegt etwa 1,9 MB.
Wie genau ist die Dezibel-Messung mit dem INMP441?
Die Berechnung mit der Datenblatt-Empfindlichkeit von −26 dBFS liefert auch ohne Kalibrierung Ergebnisse innerhalb weniger dB; die Empfindlichkeitstoleranz der Mikrofone liegt bei ±1 dB. Da die Rechnung nicht A-bewertet ist, kann sie in Umgebungen mit viel tieffrequentem Brummen höher ausfallen als ein Schallpegelmesser. Kalibrierst du mit einer bekannten Schallquelle, bekommst du für Raumlärm ein gutes Ergebnis, ein amtliches Messgerät ersetzt es aber nicht.
Soll ich das INMP441 oder den KY-038 kaufen?
Willst du nur Klatschen oder laute Geräusche erkennen und etwas auslösen, reicht der KY-038, und er funktioniert mit jedem Board. Möchtest du den Pegel in dB messen, Ton aufnehmen, Frequenzen analysieren oder musikreaktives Licht bauen, liefert das INMP441 deutlich sauberere und genauere Ergebnisse.
Warum liest das INMP441 am ESP32 immer 0?
Die häufigsten Ursachen sind ein offener L/R-Pin, ein Kanal im Code, der nicht zur Mikrofoneinstellung passt, und ein SD-Kabel am falschen Pin. Verbinde zuerst L/R mit GND und stelle dann den Kanal im Code auf rechts um. Prüfe außerdem, dass die Bitbreite 32 Bit beträgt und das Modul mit 3V3 versorgt wird.
Projekte, die du danach bauen kannst
Alle Projekte ansehen
LED Blinken mit ESP32
Lehrt die grundlegende Verwendung von GPIO-Ausgängen mit ESP32. Wir erreichen einen Blinkeffekt, indem wir eine LED über einen digitalen Pin ein- und ausschalten. ESP32-Version des klassischen Blink-Projekts auf Arduino UNO; die grundlegenden Blink-Befehle in der Arduino-Umgebung bleiben gleich, aber die Pinbelegung und die GPIO-Pegel von 3,3 V des ESP32 unterscheiden sich von denen des Arduino UNO.

Verwendung des Summers
Hast du dich mal gefragt, wie eine Türklingel oder ein Alarm seinen Ton erzeugt? Der Arduino lässt einen kleinen Summer in kurzen Abständen piepen: piep, Pause, piep, Pause. Du siehst, wie Strom zu Kl

ESP32 LED-Überblendung mit PWM
Ändern Sie die Helligkeit der LED stufenlos von 0 bis max, von max bis 0. Wir steuern PWM mit analogWrite() wie in Arduino - die gleiche Syntax mit ESP32 Arduino Core 3.0+ funktioniert reibungslos. Pin-Definition + pinMode + analogWrite ist genug.

ESP32 Melodie-Wiedergabe mit Buzzer
Spielen einer einfachen Melodie (Twinkle Twinkle Little Star) mit einem passiven Buzzer. Wir spielen die Noten mit den Funktionen tone() und noTone() wie in Arduino - die gleiche Syntax funktioniert mit ESP32 Arduino Core 3.0+. Es muss ein passiver Buzzer verwendet werden (ein aktiver Buzzer spielt keine Melodie).

Steuerung des ESP32 WS2812B NeoPixel-Streifens
WS2812B (NeoPixel) adressierbare LEDs sind intelligente RGB-LEDs, die über einen einzigen Datenpin in Reihe geschaltet gesteuert werden können. In diesem Projekt werden wir einen WS2812B-Streifen mit 8 LEDs mithilfe der Adafruit_NeoPixel-Bibliothek steuern und eine fließende Regenbogenanimation erzeugen. Obwohl der 3,3-V-Logikpegel des ESP32 bei den meisten WS2812B-Bausteinen problemlos funktioniert, zeigen wir im Falle von Instabilität die Lösung mit einem 470-Ω-Reihenwiderstand und einem 1000-

ESP32 Async-Webserver (mit IP-Anzeige auf dem LCD)
In diesem Projekt verwandeln wir den ESP32 in einen asynchronen Webserver, den Sie über Ihr Smartphone oder Ihren Computer im selben WLAN-Netzwerk steuern können. Dank der ESPAsyncWebServer-Bibliothek kann der Server mehrere Anfragen gleichzeitig bearbeiten (im Gegensatz zum klassischen WebServer.h, der bei einer einzigen Anfrage blockiert). Sie können über den Browser die IP-Adresse des ESP32 öffnen und durch Drücken der ON/OFF-Schaltflächen (Routen /on und /off) die an GPIO 5 anges

ESP32-WebSocket-Zähler (2 Tasten + LCD + Web-Echtzeit)
In diesem Projekt ändern zwei am ESP32 angeschlossene Taster (GPIO 5 zählt hoch, GPIO 4 zählt herunter) einen Zähler. Der Wert wird sofort auf einem 16x2-I2C-LCD und über die WebSocket-Unterstützung von ESPAsyncWebServer in allen verbundenen Browsern aktualisiert, ohne die Seite neu zu laden. Statt HTTP-Polling wird eine einzige dauerhafte Verbindung genutzt; der ESP32 sendet den neuen Wert mit ws.textAll() an alle.

ESP32 HTTPClient + Wetter-API (mit SSD1306-OLED-Display)
In diesem Projekt führen wir mit dem ESP32 über das Internet mithilfe von HTTPClient.h einen REST-API-Aufruf an die Wetter-API (wttr.in) durch. Im Gegensatz zur vorherigen I2C-LCD-Version verwenden wir hier ein SSD1306-OLED-Display (128×64) – dies ermöglicht große Schriftarten, Vektor-Symbole und eine reichhaltige visuelle Darstellung auf einem einzigen Bildschirm. Für die Wetteranzeige werden 7 verschiedene Vektor-Symbole (sonnig, teilweise bewölkt, bewölkt, regnerisch, schneereich, stürmisch
Weitere Artikel
BlueGrays-App
Diese Schaltung Schritt für Schritt auf dem Handy nachbauen
Schaltplan, Code und Teileliste auf einem Bildschirm. Über 200 Arduino-, ESP32- und Pico-Projekte zum Nachbauen.
Mit dem Handy scannen
Richte die Kamera auf den Code, dann öffnet sich der App-Store deines Handys.
oder im Store öffnen

