Pulse Oximeter Code

```
```
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SH1106.h>
#include "MAX30100_PulseOximeter.h"

#define OLED_RESET 4
Adafruit_SH1106 display(OLED_RESET);

PulseOximeter pox;

bool beat = false;
uint32_t lastDraw = 0;
float bpm = 0;
float spo2 = 0;

void onBeatDetected() {
  beat = true;
}

// ❤️ قلب كبير جدًا
void drawBigHeart(int x, int y, bool pulse) {
  int r = pulse ? 7 : 6;

  display.fillCircle(x, y, r, WHITE);
  display.fillCircle(x + r * 2, y, r, WHITE);
  display.fillTriangle(
    x - r, y,
    x + r * 3, y,
    x + r, y + r * 3,
    WHITE);
}

void setup() {
  Wire.begin();
  display.begin(SH1106_SWITCHCAPVCC, 0x3C);
  display.clearDisplay();
  display.display();

  display.setTextColor(WHITE);
  display.setTextSize(1);
  display.setCursor(15, 28);
  display.println("Pulse Oximeter");
  display.display();
  delay(2000);

  Serial.begin(9600);

  if (!pox.begin()) {
    display.clearDisplay();
    display.setCursor(0, 30);
    display.println("MAX30100 ERROR");
    display.display();
    while (1);
  }

  pox.setIRLedCurrent(MAX30100_LED_CURR_11MA);
  pox.setOnBeatDetectedCallback(onBeatDetected);
}

void loop() {
  pox.update();

  float hr = pox.getHeartRate();
  float ox = pox.getSpO2();

  if (hr > 40 && hr < 180) bpm = hr;
  if (ox > 80 && ox <= 100) spo2 = ox;

  if (millis() - lastDraw > 700) {
    lastDraw = millis();

    display.clearDisplay();

    display.setTextSize(1);
    display.setCursor(0, 0);
    display.print("BPM : ");
    display.println((int)bpm);

    display.setCursor(0, 14);
    display.print("SpO2: ");
    display.print((int)spo2);
    display.println(" %");

    drawBigHeart(70, 20, beat);
    beat = false;

    display.display();

    Serial.print("BPM:");
    Serial.print((int)bpm);
    Serial.print("; SpO2:");
    Serial.println((int)spo2);
  }
}
```
```