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);
}