#include <Wire.h>
#include "MAX30105.h" // Biblioteca do sensor MAX3010x
#include "heartRate.h" // Algoritmo de detecção de batimentos
#include <PubSubClient.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// Dimensões do display
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display1(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1); // Usa Wire, não I2C_1
MAX30105 particleSensor;
const byte RATE_SIZE = 4;
byte rates[RATE_SIZE];
byte rateSpot = 0;
long lastBeat = 0;
float beatsPerMinute;
int beatAvg;
unsigned long lastTempRead = 0;
float temperatureC = 0.0;
void setup() {
Serial.begin(115200);
// Inicia barramento I2C nos pinos 21 (SDA) e 22 (SCL)
Wire.begin(21, 22);
// Inicializa o sensor MAX30105
if (!particleSensor.begin(Wire, I2C_SPEED_FAST)) {
Serial.println("Sensor MAX30105 não encontrado. Verifique as conexões.");
while (true);
}
particleSensor.setup(); // Configurações padrão
particleSensor.enableDIETEMPRDY(); // Habilita leitura de temperatura
particleSensor.setPulseAmplitudeRed(0x0A); // Liga LED vermelho
// Inicializa o display OLED
if (!display1.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println("Erro ao iniciar display OLED");
while (true);
}
display1.clearDisplay();
display1.setTextSize(4);
display1.setTextColor(SSD1306_WHITE);
}
void loop() {
// Atualiza display com BPM
if (beatAvg > 0) {
display1.setTextSize(2.9);
display1.clearDisplay();
display1.setCursor(0, 0);
display1.print("BPM: ");
display1.println(beatAvg);
display1.print("Temp: ");
display1.print(temperatureC, 1);
display1.display();
} else {
display1.setTextSize(3);
display1.clearDisplay();
display1.setCursor(0, 0);
display1.print("Coloqueo");
display1.println(" dedo");
display1.display();
}
long irValue = particleSensor.getIR();
if (irValue > 7000) { // Dedo detectado
if (checkForBeat(irValue)) {
long delta = millis() - lastBeat;
lastBeat = millis();
beatsPerMinute = 60 / (delta / 1000.0);
if (beatsPerMinute < 255 && beatsPerMinute > 20) {
rates[rateSpot++] = (byte)beatsPerMinute;
rateSpot %= RATE_SIZE;
beatAvg = 0;
for (byte x = 0; x < RATE_SIZE; x++) {
beatAvg += rates[x];
}
beatAvg /= RATE_SIZE;
}
Serial.print(beatAvg);
Serial.println(" BPM");
}
} else {
beatAvg = 0;
Serial.println("Por favor, coloque seu dedo.");
}
// Só lê a temperatura a cada 5 segundos (5000 ms)
if (millis() - lastTempRead > 5000) {
temperatureC = particleSensor.readTemperature();
lastTempRead = millis();
Serial.print(" | Temp (C): ");
Serial.println(temperatureC, 1);
}
//Serial.print(" | Temp (C): ");
//Serial.println(temperatureC, 1);
//delay(20); // Pequeno atraso para estabilidade
}