import smbus2
import time
# MAX30102 I2C address
MAX30102_ADDR = 0x57
# Registers
REG_INTR_STATUS_1 = 0x00
REG_FIFO_DATA = 0x07
REG_MODE_CONFIG = 0x09
REG_SPO2_CONFIG = 0x0A
REG_LED1_PA = 0x0C
REG_LED2_PA = 0x0D
bus = smbus2.SMBus(1) # RPi I2C bus 1
# Reset and Setup
bus.write_byte_data(MAX30102_ADDR, REG_MODE_CONFIG, 0x40) # Reset
time.sleep(0.1)
bus.write_byte_data(MAX30102_ADDR, REG_MODE_CONFIG, 0x03) # Heart Rate + SpO2 mode
bus.write_byte_data(MAX30102_ADDR, REG_SPO2_CONFIG, 0x27) # 411us pulse, 100 samples/sec
bus.write_byte_data(MAX30102_ADDR, REG_LED1_PA, 0x24) # Red LED current
bus.write_byte_data(MAX30102_ADDR, REG_LED2_PA, 0x24) # IR LED current
print("Reading Raw Data (Red/IR)... Press Ctrl+C to stop")
try:
while True:
# Read 6 bytes from FIFO (3 for Red, 3 for IR)
data = bus.read_i2c_block_data(MAX30102_ADDR, REG_FIFO_DATA, 6)
red = (data[0] << 16 | data[1] << 8 | data[2]) & 0x3FFFF
ir = (data[3] << 16 | data[4] << 8 | data[5]) & 0x3FFFF
print(f"RED: {red}, IR: {ir}")
time.sleep(0.05)
except Exception as e:
print(f"Error: {e}")
finally:
bus.close()