1

I'm trying to make an audio streamer by using SPH0645 I2S MEMS mic and ESP32 DevKit. I found 2 code, First one is achieved by using MAX9814 Electret mic. The second one is I2S audio streaming but to ESP32 not from ESP32. I want to combine these 2 codes to make I2S streaming to the server. I wrote the working code done with analog output, I2S sample can be checked from link. If you help me to convert analog code to digital, I will be glad.

Streaming I2S Audio on ESP32

Streaming Audio from ESP32

/* Audio streamer with ESP32 and Adafruit elected microphone board. 
 * Created by Julian Schroeter.
*/
#include <Arduino.h>
#include <WiFi.h>
#include <driver/adc.h>

#define AUDIO_BUFFER_MAX 800

uint8_t audioBuffer[AUDIO_BUFFER_MAX]; uint8_t transmitBuffer[AUDIO_BUFFER_MAX]; uint32_t bufferPointer = 0;

const char* ssid = "YOUR SSID"; const char* password = "YOUR PASSWORD"; const char* host = "YOUR SERVER IP ADDRESS";

bool transmitNow = false;

WiFiClient client;

hw_timer_t * timer = NULL; // our timer portMUX_TYPE timerMux = portMUX_INITIALIZER_UNLOCKED;

void IRAM_ATTR onTimer() { portENTER_CRITICAL_ISR(&timerMux); // says that we want to run critical code and don't want to be interrupted int adcVal = adc1_get_voltage(ADC1_CHANNEL_0); // reads the ADC uint8_t value = map(adcVal, 0 , 4096, 0, 255); // converts the value to 0..255 (8bit) audioBuffer[bufferPointer] = value; // stores the value bufferPointer++;

if (bufferPointer == AUDIO_BUFFER_MAX) { // when the buffer is full bufferPointer = 0; memcpy(transmitBuffer, audioBuffer, AUDIO_BUFFER_MAX); // copy buffer into a second buffer transmitNow = true; // sets the value true so we know that we can transmit now } portEXIT_CRITICAL_ISR(&timerMux); // says that we have run our critical code }

void setup() { Serial.begin(115200);

WiFi.mode(WIFI_STA); WiFi.begin(ssid, password);

while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); }

Serial.println(""); Serial.println("WiFi connected"); Serial.println("MY IP address: "); Serial.println(WiFi.localIP());

adc1_config_width(ADC_WIDTH_12Bit); // configure the analogue to digital converter adc1_config_channel_atten(ADC1_CHANNEL_0, ADC_ATTEN_0db); // connects the ADC 1 with channel 0 (GPIO 36)

const int port = 4444; while (!client.connect(host, port)) { Serial.println("connection failed"); delay(1000); }

Serial.println("connected to server");

timer = timerBegin(0, 80, true); // 80 Prescaler timerAttachInterrupt(timer, &onTimer, true); // binds the handling function to our timer timerAlarmWrite(timer, 125, true); timerAlarmEnable(timer);

}

void loop() { if (transmitNow) { // checks if the buffer is full transmitNow = false; client.write((const uint8_t *)audioBuffer, sizeof(audioBuffer)); // sending the buffer to our server } }

Bence Kaulics
  • 7,843
  • 8
  • 42
  • 90
Selim Turkoglu
  • 111
  • 1
  • 3

0 Answers0