#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
MAX30105 particleSensor;
// Pins I2C pour l'ESP32
#define SDA_PIN 21
#define SCL_PIN 22
void setup() {
Serial.begin(115200);
// Initialisation I2C
Wire.begin(21, 22);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
// Tentative d'initialisation du capteur
if (!particleSensor.begin(Wire, I2C_SPEED_FAST)) {
Serial.println("Capteur non trouvé, passage en MODE SIMULATION");
simulationMode = true;
} else {
particleSensor.setup();
}
// Initialisation Ecran OLED
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 introuvable"));
for(;;);
}
display.clearDisplay();
display.setTextColor(SSD1306_WHITE);
display.setTextSize(1);
display.setCursor(10, 20);
display.print("Initialisation...");
display.display();
// Initialisation Capteur MAX30102
if (!particleSensor.begin(Wire, I2C_SPEED_FAST)) {
Serial.println(F("MAX30102 introuvable"));
display.clearDisplay();
display.setCursor(0, 0);
display.print("Erreur Capteur !");
display.display();
while(1);
}
particleSensor.setup();
}
void loop() {
// Lecture du capteur (en simulation Wokwi, ces valeurs
// dépendront de la logique du chip ou de valeurs de test)
long irValue = particleSensor.getIR();
// Variables de test (à remplacer par les calculs réels du capteur en mode physique)
int bpm, spo2;
if (simulationMode) {
// On génère des données de test pour vérifier ton OLED et ta logique
// Tu peux changer ces valeurs pour tester tes alertes (Stress/Apnée)
bpm = random(60, 120);
spo2 = random(88, 100);
delay(1000);
} else {
// Code pour le vrai capteur (ne tournera pas dans Wokwi)
bpm = getRealBPM();
spo2 = getRealSPO2();
}
updateDisplay(bpm, spo2);
if (irValue > 50000) { // Si un doigt est détecté
display.clearDisplay();
display.setCursor(0, 0);
display.setTextSize(1);
display.println("--- MONITORING ---");
display.setTextSize(2);
display.print("BPM: "); display.println(bpm);
display.setTextSize(1);
display.print("SpO2: "); display.print(spo2); display.println("%");
display.println("--------------------");
// LOGIQUE DE DIAGNOSTIC
if (spo2 < 92) {
display.println("ALERTE: APNEE ?");
display.println("VOIR UN MEDECIN");
}
else if (bpm > 100) {
display.println("ETAT: STRESSE");
display.println("Respirez lentement");
}
else {
display.println("ETAT: NORMAL");
}
} else {
display.clearDisplay();
display.setCursor(20, 25);
display.println("POSEZ LE DOIGT");
}
display.display();
delay(1000);
}Loading
ssd1306
ssd1306