diff --git a/src/main.cpp b/src/main.cpp index 308ca5c..7e89438 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,16 +1,116 @@ +/* + ESP32 I2S Microphone Sample + esp32-i2s-mic-sample.ino + Sample sound from I2S microphone, display on Serial Plotter + Requires INMP441 I2S microphone + + DroneBot Workshop 2022 + https://dronebotworkshop.com +*/ #include -const int potPin = 33; -//la valeur du potentiomètre +// Include I2S driver +#include -int potvalue=0; +// Connections to INMP441 I2S microphone +#define I2S_WS 25 +#define I2S_SD 33 +#define I2S_SCK 32 -void setup() { -pinMode(potPin,INPUT); -Serial.begin(9600); +// Use I2S Processor 0 +#define I2S_PORT I2S_NUM_0 +// Define input buffer length +#define bufferLen 1024 +int16_t sBuffer[bufferLen]; + +void i2s_install() +{ + // Set up I2S Processor configuration + const i2s_config_t i2s_config = { + .mode = i2s_mode_t(I2S_MODE_MASTER | I2S_MODE_RX), + .sample_rate = 44100, + .bits_per_sample = i2s_bits_per_sample_t(16), + .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT, + .communication_format = i2s_comm_format_t(I2S_COMM_FORMAT_STAND_I2S), + .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1, + .dma_buf_count = 4, + .dma_buf_len = bufferLen, + .use_apll = false, + .tx_desc_auto_clear = false, + .fixed_mclk = 0}; + + i2s_driver_install(I2S_PORT, &i2s_config, 0, NULL); } -void loop() { -//mesure la valeur du potentiomtre -potvalue=analogRead (potPin); -Serial.println (potvalue);} \ No newline at end of file +void i2s_setpin() +{ + // Set I2S pin configuration + const i2s_pin_config_t pin_config = { + .bck_io_num = I2S_SCK, + .ws_io_num = I2S_WS, + .data_out_num = -1, + .data_in_num = I2S_SD}; + + i2s_set_pin(I2S_PORT, &pin_config); +} + +void setup() +{ + + // Set up Serial Monitor + Serial.begin(115200); + Serial.println(" "); + + delay(1000); + + // Set up I2S + i2s_install(); + i2s_setpin(); + i2s_start(I2S_PORT); + + delay(500); +} + +void loop() +{ + + // False print statements to "lock range" on serial plotter display + // Change rangelimit value to adjust "sensitivity" + int rangelimit = 3000; + Serial.print(rangelimit * -1); + Serial.print(" "); + Serial.print(rangelimit); + Serial.print(" "); + + // Get I2S data and place in data buffer + size_t bytesIn = 0; + esp_err_t result = i2s_read(I2S_PORT, &sBuffer, bufferLen, &bytesIn, portMAX_DELAY); + + if (result == ESP_OK) + { + // Read I2S data buffer + int16_t samples_read = bytesIn / 8; + if (samples_read > 0) + { + float mean = 0; + for (int16_t i = 0; i < samples_read; ++i) + { + mean += (sBuffer[i]); + } + + // Average the data reading + mean /= samples_read; + + // Print to serial plotter + Serial.println(mean); + + int recu = bytesIn / sizeof(int32_t); + for (int i = 0; i < recu; i++) + { + Serial.printf("%ld\n", sBuffer[i]); + } + // Serial.print(" - "); + Serial.println(bytesIn); + } + } +}