from machine import I2C, Pin
import ssd1306
import time
from max30102 import MAX30102
# Initialisation des constantes
SCREEN_WIDTH = 128
SCREEN_HEIGHT = 64
OLED_ADDR = 0x3C # Adresse I2C par défaut de l'écran OLED
MAX30102_ADDR = 0x57 # Adresse I2C du capteur MAX30102
RATE_SIZE = 4
# Initialisation des variables
rates = [0] * RATE_SIZE # Tableau pour stocker les BPM
rate_spot = 0
last_beat = 0
beat_avg = 0
# Initialisation de l'I2C
i2c = I2C(0, scl=Pin(22), sda=Pin(21), freq=100000) # Modifier les broches si nécessaire
# Initialisation de l'écran OLED
display = ssd1306.SSD1306_I2C(SCREEN_WIDTH, SCREEN_HEIGHT, i2c)
# Initialisation de MAX30102 (créer une instance de MAX30102)
max30102 = MAX30102(scl_pin=22, sda_pin=21) # Assurez-vous que les broches correspondent à celles de votre ESP32
# Fonction pour simuler la lecture de l'IR du capteur MAX30102
def read_ir():
# Remplacer cette simulation par une implémentation réelle si vous avez le capteur.
return 60000 # Simule une valeur IR élevée pour détecter un doigt
# Fonction pour simuler la détection de battement
def check_for_beat(ir_value):
# Implémentation de simulation (remplacer avec un vrai algorithme)
return ir_value > 50000
# Fonction principale pour l'initialisation
def setup():
global last_beat
display.fill(0) # Efface l'écran
display.text("BPM:", 0, 20, 1)
display.text("0", 64, 20, 1)
display.show()
last_beat = time.ticks_ms() # Initialisation du temps de départ
# Boucle principale
def loop():
global last_beat, rate_spot, beat_avg
ir_value = read_ir() # Lecture de la valeur IR
if check_for_beat(ir_value): # Si un battement est détecté
current_time = time.ticks_ms()
delta = time.ticks_diff(current_time, last_beat)
if delta > 0: # Évitez la division par zéro
last_beat = current_time
bpm = 60000 / delta # Calcule les battements par minute
if 20 < bpm < 255: # Filtrer les valeurs anormales
rates[rate_spot] = int(bpm)
rate_spot = (rate_spot + 1) % RATE_SIZE
beat_avg = sum(rates) // RATE_SIZE
# Met à jour l'affichage
display.fill(0)
display.text("BPM:", 0, 20, 1)
display.text(str(beat_avg), 64, 20, 1)
display.show()
else:
# Affiche le message d'invite si aucun doigt n'est détecté
display.fill(0)
display.text("BPM:", 0, 20, 1)
display.text(str(beat_avg), 64, 20, 1)
display.text("Place your", 0, 45, 1)
display.text("finger on sensor", 0, 55, 1)
display.show()
# Programme principal
setup()
while True:
# Utilisez l'instance max30102 pour obtenir les valeurs de fréquence cardiaque et SpO2
hr = max30102.get_heart_rate() # Fréquence cardiaque
spo2 = max30102.get_spo2() # Saturation en oxygène
# Affichage des valeurs sur l'écran OLED
display.fill(0)
display.text("BPM:", 0, 20, 1)
display.text(str(hr), 64, 20, 1)
display.text("Place your", 0, 45, 1)
display.text("finger on sensor", 0, 55, 1)
display.show()
time.sleep(0.1)