XIAO BLE with MAX30100 and BLE

Hi, when I run MAX30100 by itself everything works fine. But when I add BLE into code, MAX30100 stops getting beats when BLE begins. I am not sure why. pox.update() is already in the main loop and not within the time checking.

My code is here:

//MAX30100 BPM + SPO2 header
#include <MAX30100_PulseOximeter.h>

//BLE header
#include <Arduino.h>
#include <ArduinoBLE.h>

//Communication header
#include <Wire.h>

//MAX30100
PulseOximeter pox;
uint8_t hearty = 0;
uint8_t oxy = 0;

//MAX timer
unsigned long max_prev_millis = 0;

//BLE timer
unsigned long ble_prev_millis = 0;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);

  if (!pox.begin()) Serial.println(F("MAX30100 error"));
  else Serial.println(F("MAX30100 OK!"));

  pox.setOnBeatDetectedCallback(onBeatDetected);
  
  // setting the registers for the bluetooth transmit power
  uint32_t *TXPOWER = (uint32_t *)0x4000150C;
  *TXPOWER &= 0x0;
  *TXPOWER |= 0x08;

  uint32_t *MODE = (uint32_t *)0x40001510;
  *MODE &= 0x0;
  *MODE |= 0x05;
  
  BLE.setLocalName("IT'S ME, BLE");
}

void loop() {
  // put your main code here, to run repeatedly:
  pox.update();
  //Heart rate reading every 1 second
  if (millis() - max_prev_millis >= 1000){
      readMax30100();
  }

  //Bluetooth upload every 15 seconds
  if (millis() - ble_prev_millis >= 15 * 1000) {
      BLEUpload();
  }
}

void readMax30100(){
    hearty = pox.getHeartRate();
    oxy = pox.getSpO2();
  
    Serial.print(F("Heart rate:"));
    Serial.print(hearty);
    Serial.print(F("bpm / SpO2:"));
    Serial.print(oxy);
    Serial.println(F("%"));

    max_prev_millis = millis();
}

void BLEUpload(){
    BLE.begin();
    BLE.stopAdvertise();
    BLEAdvertisingData advData;
    advData.setFlags(BLEFlagsBREDRNotSupported | BLEFlagsGeneralDiscoverable);

    unsigned char send_data[2]
    {
      (unsigned char) (hearty),
      (unsigned char) (oxy)
    };
    
    advData.setAdvertisedServiceData(0x2ACA, send_data, sizeof(send_data));
    BLE.setAdvertisingData(advData);
    BLE.advertise();
    BLE.end();
    ble_prev_millis = millis();
}

void onBeatDetected(){
  Serial.println(F("Beat!"));
}

is the code of Your sketch complete ?
I can not see ay ble initialization .... like add service and add characteristic ?
You define txpower and mode but where do You use it ?

it looks like ble starts and stops immediately - is there any transmission of the data ?

thanks for explanation.

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