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