Hello All, I am working on a project where I am using an ESP32 board with an adafruit sph0645 microphone. I am using the code provided on git hub in the link listed below. Currently I have gotten an output from the mic using the serial monitor. However now I am sending this data to a web server and then using yarn and node to download the raw data to my computer. It seems that the ESP32 is not generating the server with the URL in the code. I cannot open the server which I believe would have a record button so yarn can save the data. I have never used Yarn or node before so bear with me. Thanks! I also attempted to use the
Code:
tags so hopefully it works. Also yes I did enter my ESP32 IP into the code where it says MY_IP_ADDRESS
[URL='https://github.com/atomic14/esp32_audio/tree/master/i2s_sampling']esp32_audio/i2s_sampling at master · atomic14/esp32_audio (github.com)[/URL]
[
#include <Arduino.h>
#include <WiFi.h>
#include <HTTPClient.h>
#include "WiFiCredentials.h"
#include "I2SMEMSSampler.h"
#include "ADCSampler.h"
WiFiClient *wifiClientADC = NULL;
HTTPClient *httpClientADC = NULL;
WiFiClient *wifiClientI2S = NULL;
HTTPClient *httpClientI2S = NULL;
ADCSampler *adcSampler = NULL;
I2SSampler *i2sSampler = NULL;
// replace this with your machines IP Address 192.168.1.51
#define ADC_SERVER_URL "http://MY_IP_ADDRESS:5003/adc_samples"
#define I2S_SERVER_URL "http://MY_IP_ADDRESS/i2s_samples"
// i2s config for using the internal ADC
// i2s_config_t adcI2SConfig = {
// .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX | I2S_MODE_ADC_BUILT_IN),
// .sample_rate = 16000,
// .bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT,
// .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT,
// .communication_format = I2S_COMM_FORMAT_I2S_LSB,
// .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,
// .dma_buf_count = 4,
// .dma_buf_len = 1024,
// .use_apll = false,
// .tx_desc_auto_clear = false,
// .fixed_mclk = 0};
// i2s config for reading from left channel of I2S
i2s_config_t i2sMemsConfigLeftChannel = {
.mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX),
.sample_rate = 16000,
.bits_per_sample = I2S_BITS_PER_SAMPLE_32BIT,
.channel_format = I2S_CHANNEL_FMT_ONLY_LEFT,
.communication_format = i2s_comm_format_t(I2S_COMM_FORMAT_I2S),
.intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,
.dma_buf_count = 4,
.dma_buf_len = 1024,
.use_apll = false,
.tx_desc_auto_clear = false,
.fixed_mclk = 0};
// i2s pins
i2s_pin_config_t i2sPins = {
.bck_io_num = GPIO_NUM_32,
.ws_io_num = GPIO_NUM_25,
.data_out_num = I2S_PIN_NO_CHANGE,
.data_in_num = GPIO_NUM_33};
// how many samples to read at once
const int SAMPLE_SIZE = 16384;
// send data to a remote address
void sendData(WiFiClient *wifiClient, HTTPClient *httpClient, const char *url, uint8_t *bytes, size_t count)
{
// send them off to the server
digitalWrite(2, HIGH);
httpClient->begin(*wifiClient, url);
httpClient->addHeader("content-type", "application/octet-stream");
httpClient->POST(bytes, count);
httpClient->end();
digitalWrite(2, LOW);
}
// Task to write samples from ADC to our server
void adcWriterTask(void *param)
{
I2SSampler *sampler = (I2SSampler *)param;
int16_t *samples = (int16_t *)malloc(sizeof(uint16_t) * SAMPLE_SIZE);
if (!samples)
{
Serial.println("Failed to allocate memory for samples");
return;
}
while (true)
{
int samples_read = sampler->read(samples, SAMPLE_SIZE);
sendData(wifiClientADC, httpClientADC, ADC_SERVER_URL, (uint8_t *)samples, samples_read * sizeof(uint16_t));
}
}
// Task to write samples to our server
void i2sMemsWriterTask(void *param)
{
I2SSampler *sampler = (I2SSampler *)param;
int16_t *samples = (int16_t *)malloc(sizeof(uint16_t) * SAMPLE_SIZE);
if (!samples)
{
Serial.println("Failed to allocate memory for samples");
return;
}
while (true)
{
int samples_read = sampler->read(samples, SAMPLE_SIZE);
sendData(wifiClientI2S, httpClientI2S, I2S_SERVER_URL, (uint8_t *)samples, samples_read * sizeof(uint16_t));
}
}
void setup()
{
Serial.begin(115200);
// launch WiFi
Serial.printf("Connecting to WiFi");
WiFi.mode(WIFI_STA);
WiFi.begin(SSID, PASSWORD);
while (WiFi.waitForConnectResult() != WL_CONNECTED)
{
Serial.print(".");
delay(1000);
}
Serial.println("");
Serial.println("WiFi Connected");
Serial.println("Started up");
Serial.print("IP Address: ");
Serial.println(WiFi.localIP());
// indicator LED
pinMode(2, OUTPUT);
// setup the HTTP Client
wifiClientADC = new WiFiClient();
httpClientADC = new HTTPClient();
wifiClientI2S = new WiFiClient();
httpClientI2S = new HTTPClient();
// input from analog microphones such as the MAX9814 or MAX4466
// internal analog to digital converter sampling using i2s
// create our samplers
// adcSampler = new ADCSampler(ADC_UNIT_1, ADC1_CHANNEL_7, adcI2SConfig);
// set up the adc sample writer task
// TaskHandle_t adcWriterTaskHandle;
// adcSampler->start();
// xTaskCreatePinnedToCore(adcWriterTask, "ADC Writer Task", 4096, adcSampler, 1, &adcWriterTaskHandle, 1);
// Direct i2s input from INMP441 or the SPH0645
i2sSampler = new I2SMEMSSampler(I2S_NUM_0, i2sPins, i2sMemsConfigLeftChannel, false);
i2sSampler->start();
// set up the i2s sample writer task
TaskHandle_t i2sMemsWriterTaskHandle;
xTaskCreatePinnedToCore(i2sMemsWriterTask, "I2S Writer Task", 4096, i2sSampler, 1, &i2sMemsWriterTaskHandle, 1);
// // start sampling from i2s device
}
void loop()
{
// nothing to do here - everything is taken care of by tasks
}
]