ESP32 with MAX30102 and MLX90614

I'm assembling a system of sensors with the ESP32 Devkit V4, MLX90614 and MAX30102. Separately they work perfectly, however now that I assembled both together, for some reason I don't get the bpm values, only temperature. The readings of the IR are normal. Can someone help me out?

#include <Wire.h>
#include <MAX30105.h>
#include <Adafruit_MLX90614.h>
#include <heartRate.h>

// --- configurações de I2C ---
// Barramento principal: Wire (GPIO21=SDA, GPIO22=SCL)
#define I2C_PRIMARY_SDA 21
#define I2C_PRIMARY_SCL 22

// Barramento secundário: I2Ctwo (GPIO17=SDA₂, GPIO16=SCL₂)
#define I2C2_SDA 16
#define I2C2_SCL 17
TwoWire I2Ctwo = TwoWire(1);

// --- sensores ---
MAX30105 particleSensor;           // no barramento secundário
Adafruit_MLX90614 mlx = Adafruit_MLX90614(); // no barramento principal

// --- variáveis do MAX30105 ---
const byte RATE_SIZE = 4;
byte rates[RATE_SIZE];
byte rateSpot = 0;
long lastBeat = 0;
float beatsPerMinute = 0.0;
int beatAvg = 0;

void setup() {
  Serial.begin(115200);
  Serial.println("Iniciando…");

  // 1) I2C principal para o MLX90614
  Wire.begin(I2C_PRIMARY_SDA, I2C_PRIMARY_SCL);
  // 2) I2C secundário para o MAX30105
  I2Ctwo.begin(I2C2_SDA, I2C2_SCL, 100000);

  // --- inicializa MLX90614 ---
  if (!mlx.begin()) {
    Serial.println("Erro: MLX90614 não encontrado. Verifique as ligações.");
    while (1);
  }
  Serial.println("MLX90614 OK.");

  // --- inicializa MAX30105 no barramento secundário ---
  if (!particleSensor.begin(I2Ctwo, I2C_SPEED_FAST)) {
    Serial.println("Erro: MAX30105 não encontrado no I2C2. Verifique as ligações.");
    while (1);
  }
  Serial.println("MAX30105 OK. Posicione o dedo no sensor.");

  // configurações padrão do MAX30105
  particleSensor.setup();
  particleSensor.setPulseAmplitudeGreen(0);
  particleSensor.setPulseAmplitudeIR(0x20);


}

void loop() {
  // --- leitura MAX30105 (batimento) ---
  long irValue = particleSensor.getIR();

  if (checkForBeat(irValue)) {
    long delta = millis() - lastBeat;
    lastBeat = millis();
    beatsPerMinute = 60.0 / (delta / 1000.0);
    if (beatsPerMinute > 20 && beatsPerMinute < 255) {
      rates[rateSpot++] = (byte)beatsPerMinute;
      rateSpot %= RATE_SIZE;
      beatAvg = 0;
      for (byte i = 0; i < RATE_SIZE; i++) beatAvg += rates[i];
      beatAvg /= RATE_SIZE;
    }
  }

  Serial.print("IR=");
  Serial.print(irValue);
  Serial.print("  BPM=");
  Serial.print(beatsPerMinute);
  Serial.print("  Avg BPM=");
  Serial.print(beatAvg);
  if (irValue < 50000) Serial.print("  (sem dedo)");
  Serial.println();

  // --- leitura MLX90614 (temperatura) ---
  Serial.print("Ambiente=");
  Serial.print(mlx.readAmbientTempC());
  Serial.print("*C  Objeto=");
  Serial.print(mlx.readObjectTempC());
  Serial.println("*C");
  Serial.println();

  delay(200);
}

Topic moved. please do not post in "Uncategorized"; see the sticky topics in Uncategorized - Arduino Forum.

1 Like