#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <MAX30105.h>
#include "spo2_algorithm.h"
#include "heartRate.h"
// Display OLED
Adafruit_SSD1306 display(128, 64, &Wire, -1);
// DHT22
#define DHTPIN 15
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// MAX30102
MAX30105 particleSensor;
uint32_t irBuffer[100], redBuffer[100];
int32_t bufferLength, spo2, heartRate;
int8_t validSPO2, validHeartRate;
void setup() {
Serial.begin(115200);
Wire.begin(21, 22); // Explicitly define I2C pins
// Initialize OLED
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for (;;);
}
display.display();
delay(2000);
display.clearDisplay();
// Initialize DHT22
dht.begin();
// Initialize MAX30102
if (!particleSensor.begin(Wire, I2C_SPEED_FAST, 0x57)) {
Serial.println(F("MAX30105 was not found. Please check wiring/power."));
while (1);
}
particleSensor.setup(50, 4, 2, 100, 411, 4096);
}
void loop() {
float h = dht.readHumidity();
float t = dht.readTemperature();
// Read MAX30102 data
bufferLength = 100;
for (byte i = 0; i < bufferLength; i++) {
while (!particleSensor.available()) {
particleSensor.check();
}
redBuffer[i] = particleSensor.getRed();
irBuffer[i] = particleSensor.getIR();
particleSensor.nextSample();
}
// Compute SpO2 and heart rate
maxim_heart_rate_and_oxygen_saturation(irBuffer, bufferLength, redBuffer, &spo2, &validSPO2, &heartRate, &validHeartRate);
// Display data on OLED
display.clearDisplay();
display.setCursor(0, 0);
display.setTextSize(1);
display.setTextColor(WHITE);
display.print("Temp: "); display.print(t); display.println(" *C");
display.print("Humidity: "); display.print(h); display.println(" %");
if (validHeartRate) {
display.print("Heart Rate: "); display.print(heartRate); display.println(" bpm");
} else {
display.println("Invalid Heart Rate");
}
if (validSPO2) {
display.print("SpO2: "); display.print(spo2); display.println(" %");
} else {
display.println("Invalid SpO2");
}
display.display();
delay(2000);
}