//Incude I2S driver
#include<driver/i2s.h>

//Connections to INMP441 I2S microphone 
#define I2S_WS 25
#define I2S_SD 33
#define I2S_SCK 32

//Use I2S Processor 0
#define I2S_PORT I2S_NUM_0

//Define input buffer length 
#define bufferLen 64
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_peer_sample=i2s_bits_per_sample_t(16),
    .channel_format=I2S_CHANNEL_FMT_ONLY_LEFT,
    .communication_format=
  i2s_common_format_t(I2S_COMM_FORMAT_STAND_I2S),
    .intr_alloc_flags=0,
    .dma_buf_count=8,
    .dma_buf_len=bufferLen,
    .use_apll=false
  };
  i2s_driver_install(I2S_PORT,&i2s_config,0,NULL);
}
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);
  Serail.print(" ");

  //Get I2S data and place in data buffer 
  size_t bytesln=0;
  esp_err_t result=i2s_read(I2S_PORT,&sBuffer,bufferLen,&bytesln,portMAX_DELAY);
  {
    //Read I2S data buffer 
    int16_t samples_read=bytesln/8;
    if(samples_read>0) {
      float mean=0;
      for(int16_ti=0;i<samples_read;i++){
        mean+=(sBuffer[i]);
      }

      //Average the data reading
      mean/=samples_read;

      //Print to serial plotter
      Serial.println(mean);
    }
  }
}