Bluetooth Connection Status Light

Hi!

I am running into some problems finding a solution when it comes to performing some form of Bluetooth connection check for my project that will allow me to have a connection indication light.

My project consist of creating a Bluetooth speaker that has Led Strips controlled over Bluetooth serial (an app will be made to handle this) and audio stream over Bluetooth from a single ESP32.

I have found plenty of examples and had success with performing an spp callback event, however, of course this only works if I connect to the Bluetooth serial through my 'Serial Bluetooth Terminal' app on my phone. If I just go into my phone Bluetooth list and connect to the audio side of things, nothing is registered, which isn't very useful for a Bluetooth speaker!

Basically I really need some help finding a way of registering that a device has connected to the Bluetooth audio so that I can have some form of indication light to tell the user that they are successfully connected to the speaker to play music.

Below is my code:

//SOURCE-CODE--------------------------------------------------
#include <btAudio.h>     //<-------this is the library that I am using to handle Bluetooth audio to an external I2s DAC
#include "BluetoothSerial.h"
#include <FastLED.h>

TaskHandle_t Task1;

//POWER/BT-LIGHT-SETUP----------------------------------------
int powerPinR = 4;
int powerPinG = 16;
int powerPinB = 17;
bool BTisConnected;

//FAST-LED-STUFF----------------------------------------------
CRGB leds[NUM_STRIPS][NUM_LEDS];
CRGB leds_temp[NUM_STRIPS][NUM_LEDS/2]; 


//BLUETOOTH-SETUP---------------------------------------------
btAudio audio = btAudio("");
BluetoothSerial SerialBT;

//CONNECTION-CHECK--------------------------------------------
void callback(esp_spp_cb_event_t event, esp_spp_cb_param_t*param){
  
  if(event == ESP_SPP_SRV_OPEN_EVT){
    Serial.println("Client Connected");
    BTisConnected = true;
  }

  else {
    BTisConnected = false;
  }
}

//------------------------------------------------------------
void setup() {

  //CORE-1-INITIALISE
  xTaskCreatePinnedToCore(
    codeForTask1,            /* Task function. */
    "Task_1",                 /* name of task. */
    1000,                    /* Stack size of task */
    NULL,                     /* parameter of the task */
    1,                        /* priority of the task */
    &Task1,                   /* Task handle to keep track of created task */
    0);                       /* Core */

  //POWER/BLUETOOTH-CONNECTION-LIGHT-SETUP
  pinMode(powerPinR, OUTPUT);
  pinMode(powerPinG, OUTPUT);
  pinMode(powerPinB, OUTPUT);
  digitalWrite (powerPinR, HIGH);
  digitalWrite (powerPinG, HIGH);
  digitalWrite (powerPinB, HIGH);

  //COOLDOWN-DELAY
  delay(3000);

  //AUDIO-INITIALISE   
  audio.begin();
  int bck = 26; 
  int ws = 27;
  int dout = 25;
  audio.I2S(bck, dout, ws);

  //LED-STRIP-SETUP-&-CLEAR-ALL
  FastLED.addLeds<WS2812B,STRIP1PIN,GRB>(leds[0], NUM_LEDS);
  FastLED.addLeds<WS2812B,STRIP2PIN,GRB>(leds[1], NUM_LEDS);
  FastLED.clear();
  FastLED.show();
  
  //SERIAL-INITIALISE-&-CLIENT-CONNECTION-CHECK
  Serial.begin(115200);
  SerialBT.begin("Pilot");   //<-----BLUETOOTH NAME
  SerialBT.register_callback(callback); //<-- SerialBT connection check works perfectly, but nothing for audio connection! :(
  
}

//CORE-0-VOID-LOOP--------------------------------------------
void codeForTask1( void * parameter )
{
  for (;;) {

    manageData();
    delay(10);

  }
}

//CORE-1-VOID-LOOP--------------------------------------------
void loop() {

  BTconnectionCheck();
  
  playScene();
 
}

//MANAGE-INCOMING-BLUETOOTH-SERIAL-DATA-----------------------------------------------
void manageData() {
  //READ FROM SERIAL AND PARSE OUT ** READ FROM SERIAL AND PARSE OUT ** READ FROM SERIAL AND PARSE OUT **
  char rawData[100] = "";
  char keyword[] = "Mydata=";
  
  
    if (SerialBT.available() > 0) {//new data in
      size_t byteCount = SerialBT.readBytesUntil('\n', rawData, sizeof(rawData) - 1); //read in data to buffer
      rawData[byteCount] = NULL;//put an end character on the data
 

        const char delimiter[] = ",";
        char parsedStrings[5][8]; //first number = how many bits of data - 2nd number = max size of eeach data
        int dataCount = 0;
        int dataPosition = 0;
        char *token =  strtok(&rawData[dataPosition], delimiter);//look for first piece of data after keyword until comma
        if (token != NULL && strlen(token) < sizeof(parsedStrings[0])) {
          strncpy(parsedStrings[0], token, sizeof(parsedStrings[0]));
          dataCount++;
        } else {
          Serial.println("token to big");
          strcpy(parsedStrings[0], NULL);
        }

        for (int i = 1; i < 5; i++) {
          token =  strtok(NULL, delimiter);
          if (token != NULL && strlen(token) < sizeof(parsedStrings[i])) {
            strncpy(parsedStrings[i], token, sizeof(parsedStrings[i]));
            dataCount++;
          } else {
            Serial.println("token to big");
            strcpy(parsedStrings[i], NULL);
          }
        } 

        if (dataCount == 5) {
          scene = atoi (parsedStrings[0]);
          hue = atoi(parsedStrings[1]);
          saturation = atoi(parsedStrings[2]);
          brightness = atoi(parsedStrings[3]);
          eventInterval = atol (parsedStrings[4]);
        } 
      } 
    
  }

//BLUETOOTH-CONNECTION-CHECK---------------------------------------------------------
void BTconnectionCheck(){

  SerialBT.register_callback(callback);

  if (BTisConnected == true){
    bluetoothConnected();
   
  }

  else {
    bluetoothSearch();
  }
}
  
void bluetoothSearch(){
  digitalWrite (powerPinR, LOW);
  digitalWrite (powerPinG, LOW);
  digitalWrite (powerPinB, HIGH);
}

void bluetoothConnected(){
  digitalWrite (powerPinR, HIGH);
  digitalWrite (powerPinG, LOW);
  digitalWrite (powerPinB, HIGH);
}

I have cut lots of the code to do with the LEDs out but its still quite long, If it would help to have a more condensed version then I will chop it down further. Or if it helps to have the full code then I can also post it.

Any help would be greatly appreciated as I am well and truly stuck with this one and its a pretty important part of the project.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.