FastLED 3.9.15
Loading...
Searching...
No Matches
AudioInput.h
Go to the documentation of this file.
1// I2S Audio Example for ESP32
2// This example demonstrates using I2S audio input to control FastLED strips
3// Based on audio levels from microphone or line input
4//
5// This example uses the extremely popular (as of 2025-September) INMP441 microphone.
6// Notes:
7// - Connect L/R to PWR so it's recognized as a right channel microphone.
8
9#include <Arduino.h>
10#include <FastLED.h>
11
12#include "fl/sstream.h"
13#include "fl/type_traits.h"
14
15#include "fl/audio_input.h"
16
17#include "platforms/esp/32/audio/sound_util.h"
18
19using fl::i16;
20
21// I2S Configuration
22#define I2S_WS_PIN 7 // Word Select (LRCLK)
23#define I2S_SD_PIN 8 // Serial Data (DIN)
24#define I2S_CLK_PIN 4 // Serial Clock (BCLK)
25#define I2S_CHANNEL fl::Right
26
27fl::AudioConfig config = fl::AudioConfig::CreateInmp441(I2S_WS_PIN, I2S_SD_PIN, I2S_CLK_PIN, I2S_CHANNEL);
29
30void setup() {
31 Serial.begin(115200);
32
33 Serial.println("I2S Audio FastLED Example");
34 Serial.println("Waiting 5000ms for audio device to stdout initialization...");
35 delay(5000);
36
37 // Initialize I2S Audio
38 fl::string errorMsg;
39 audioSource = fl::IAudioInput::create(config, &errorMsg);
40
41 if (!audioSource) {
42 Serial.print("Failed to create audio source: ");
43 Serial.println(errorMsg.c_str());
44 return;
45 }
46
47
48 // Start audio capture
49 Serial.println("Starting audio capture...");
50 audioSource->start();
51
52 // Check for start errors
53 fl::string startErrorMsg;
54 if (audioSource->error(&startErrorMsg)) {
55 Serial.print("Audio start error: ");
56 Serial.println(startErrorMsg.c_str());
57 return;
58 }
59
60 Serial.println("Audio capture started!");
61}
62
63
64void loop() {
65 EVERY_N_MILLIS(1000) { Serial.println("loop active."); }
66 // Check if audio source is valid
67 if (!audioSource) {
68 Serial.println("Audio source is null!");
69 delay(1000);
70 return;
71 }
72
73 // Check for audio errors
74 fl::string errorMsg;
75 if (audioSource->error(&errorMsg)) {
76 Serial.print("Audio error: ");
77 Serial.println(errorMsg.c_str());
78 delay(100);
79 return;
80 }
81
82 // Read audio data
83 fl::AudioSample sample = audioSource->read();
84
85 if (sample.isValid()) {
86 EVERY_N_MILLIS(100) {
87 const auto& audioBuffer = sample.pcm();
88 const i16* max_sample = fl::max_element(audioBuffer.begin(), audioBuffer.end());
89 const i16* min_sample = fl::min_element(audioBuffer.begin(), audioBuffer.end());
90 fl::sstream ss;
91 ss << "\nRead " << audioBuffer.size() << " samples, timestamp: " << sample.timestamp() << "ms\n";
92 ss << "Max sample: " << *max_sample << "\n";
93 ss << "Min sample: " << *min_sample << "\n";
94 ss << "RMS: " << sample.rms() << "\n";
95 ss << "ZCF: " << sample.zcf() << "\n";
96 FL_WARN(ss.str());
97 }
98 }
99}
#define I2S_SD_PIN
Definition AudioInput.h:23
#define I2S_CHANNEL
Definition AudioInput.h:25
fl::AudioConfig config
Definition AudioInput.h:27
void setup()
Definition AudioInput.h:30
fl::shared_ptr< fl::IAudioInput > audioSource
Definition AudioInput.h:28
#define I2S_CLK_PIN
Definition AudioInput.h:24
void loop()
Definition AudioInput.h:64
#define I2S_WS_PIN
Definition AudioInput.h:22
central include file for FastLED, defines the CFastLED class/object
const VectorPCM & pcm() const
Definition audio.cpp:62
float zcf() const
Definition audio.cpp:119
bool isValid() const
Definition audio.h:36
float rms() const
Definition audio.cpp:128
fl::u32 timestamp() const
Definition audio.cpp:121
const char * c_str() const
Definition str.h:326
const string & str() const
Definition strstream.h:51
#define EVERY_N_MILLIS(N)
Checks whether to execute a block of code every N milliseconds.
Definition lib8tion.h:1177
Iterator min_element(Iterator first, Iterator last)
Definition algorithm.h:55
StrStream sstream
Definition sstream.h:6
Iterator max_element(Iterator first, Iterator last)
Definition algorithm.h:17
#define FL_WARN(X)
Definition warn.h:18