@cleoqc
i2c = refdes117.REFDES117()
while True:
start = time()
red,ir = i2c.read_once()
##--------------------------------INSIDE THE REFDES lib------------------------------##
class REFDES117():
#Can find the address using bash command: “i2cdetect -a -y 1”
#default hard coded gpio pin 7, not requried unless bulk read
def init(self,address=0x57):
rev = GPIO.RPI_REVISION
if rev == 2 or rev == 3:
bus = smbus.SMBus(1)
else:
bus = smbus.SMBus(0)
self.bus = bus
self.address=address
self.b02 = 0
self.b02_bool = 0
self.BPM = 0
self.hr_bool = 0
self.ibi = 0
self.red_val = 0
self.ir_val = 0
self.signal = 0
self.reset()
sleep(1) # wait 1 sec
# read & clear interrupt register (read 1 byte)
reg_data = self.bus.read_i2c_block_data(self.address, REG_INTR_STATUS_1, 1)
print(f"[SETUP] reset complete with interrupt register0: {reg_data}")
self.setup()
def reset(self):
# Reset the device, this will clear all settings,
# so after running this, run setup() again.
self.bus.write_i2c_block_data(self.address, REG_MODE_CONFIG, [0x40])
def setup(self, led_mode=0x03):
# This will setup the device with the values written in sample Arduino code.
# INTR setting
# 0xc0 : A_FULL_EN and PPG_RDY_EN = Interrupt will be triggered when
# fifo almost full & new fifo data ready
self.bus.write_i2c_block_data(self.address, REG_INTR_ENABLE_1, [0xc0])
self.bus.write_i2c_block_data(self.address, REG_INTR_ENABLE_2, [0x00])
# FIFO_WR_PTR[4:0]
self.bus.write_i2c_block_data(self.address, REG_FIFO_WR_PTR, [0x00])
# OVF_COUNTER[4:0]
self.bus.write_i2c_block_data(self.address, REG_OVF_COUNTER, [0x00])
# FIFO_RD_PTR[4:0]
self.bus.write_i2c_block_data(self.address, REG_FIFO_RD_PTR, [0x00])
# 0b 0100 1111
# sample avg = 4, fifo rollover = false, fifo almost full = 17
self.bus.write_i2c_block_data(self.address, REG_FIFO_CONFIG, [0x4f])
# 0x02 for read-only, 0x03 for SpO2 mode, 0x07 multimode LED
self.bus.write_i2c_block_data(self.address, REG_MODE_CONFIG, [led_mode])
# 0b 0010 0111
# SPO2_ADC range = 4096nA, SPO2 sample rate = 100Hz, LED pulse-width = 411uS
self.bus.write_i2c_block_data(self.address, REG_SPO2_CONFIG, [0x27])
# choose value for ~7mA for LED1
self.bus.write_i2c_block_data(self.address, REG_LED1_PA, [0x24])
# choose value for ~7mA for LED2
self.bus.write_i2c_block_data(self.address, REG_LED2_PA, [0x24])
# choose value fro ~25mA for Pilot LED
self.bus.write_i2c_block_data(self.address, REG_PILOT_PA, [0x7f])
def read_once(self):
# read 1 byte from registers (values are discarded)
reg_INTR1 = self.bus.read_i2c_block_data(self.address, REG_INTR_STATUS_1, 1)
reg_INTR2 = self.bus.read_i2c_block_data(self.address, REG_INTR_STATUS_2, 1)
# read 6-byte data from the device
d = self.bus.read_i2c_block_data(self.address, REG_FIFO_DATA, 6)
# mask MSB [23:18]
self.red_led = (d[0] << 16 | d[1] << 8 | d[2]) & 0x03FFFF
self.ir_led = (d[3] << 16 | d[4] << 8 | d[5]) & 0x03FFFF