I have been working on a similar project . In which I want to capture data using the PDM mic and trasmit it through the BLE available . I am new to hardware and these sensors so I am unable to make sense of the data I am reciving on the other side(central) that is my mobile device(iphone X) with BlueLight application. I am able to find a service and I am reciving some form of hex code,but I don't know how to convert it to wave files or don't know whether it's possible or not .
If you guys have any idea or any resources that could help please do share.
I am attaching my code below :
#include <ArduinoBLE.h>
#include <mic.h> // microphone library
// Microphone Settings
#define DEBUG 1
#define SAMPLES 800
mic_config_t mic_config = {
.channel_cnt = 1,
.sampling_rate = 16000,
.buf_size = 1600,
.debug_pin = LED_BUILTIN
};
NRF52840_ADC_Class Mic(&mic_config);
int16_t recording_buf[SAMPLES];
volatile static bool record_ready = false;
// Updated UUIDs
#define SERVICE_UUID "19B10000-E8F2-537E-4F6C-D104768A1214"
#define CHARACTERISTIC_UUID_AUDIO "19B10001-E8F2-537E-4F6C-D104768A1214"
// BLE Service and Characteristic
BLEService audioService(SERVICE_UUID);
// Corrected initialization with explicit value size and fixed length flag
BLECharacteristic audioDataCharacteristic(CHARACTERISTIC_UUID_AUDIO, BLERead | BLENotify | BLEWrite, sizeof(recording_buf), true);
void setup() {
Serial.begin(115200);
while (!Serial) delay(10);
Serial.println("Initializing microphone...");
Mic.set_callback(audio_rec_callback);
if (!Mic.begin()) {
Serial.println("Mic initialization failed");
while (1);
}
Serial.println("Mic initialized.");
Serial.println("Initializing BLE...");
if (!BLE.begin()) {
Serial.println("Failed to start BLE!");
while (1);
}
BLE.setLocalName("SCT Audio");
BLE.setAdvertisedService(audioService);
audioService.addCharacteristic(audioDataCharacteristic);
BLE.addService(audioService);
// Corrected writeValue call with explicit casting
audioDataCharacteristic.writeValue((uint8_t)0);
BLE.advertise();
Serial.println("BLE Peripheral is now advertising");
}
void loop() {
BLEDevice central = BLE.central();
if (central) {
Serial.println("Connected to central device");
while (central.connected()) {
if (record_ready) {
// Plot the audio data in the Serial Plotter
for (int i = 0; i < SAMPLES; i++) {
Serial.println(recording_buf[i]);
}
// Transmit the audio data
audioDataCharacteristic.writeValue((uint8_t*)recording_buf, 2 * SAMPLES);
Serial.println("Audio data transmitted over BLE");
record_ready = false;
}
}
Serial.println("Disconnected from central device");
}
}
static void audio_rec_callback(uint16_t *buf, uint32_t buf_len) {
static uint32_t idx = 0;
for (uint32_t i = 0; i < buf_len; i++) {
recording_buf[idx++] = buf[i];
if (idx >= SAMPLES){
idx = 0;
record_ready = true;
break;
}
}
}
My overall project capture the audio using the pdm mic and transmit it through the BLE and we will do a audio processing throguh api(fast api) calls . I don't know whether it's the right way to do this,but that's the overall idea .