import smbus import time SI1132_I2C_ADDR = 0x60 SI1132_PARTID = 0x32 cmds = { "Si1132_PARAM_QUERY": 0x80, "Si1132_PARAM_SET": 0xA0, "Si1132_NOP": 0x00, "Si1132_RESET": 0x01, "Si1132_BUSADDR": 0x02, "Si1132_GET_CAL": 0x12, "Si1132_ALS_FORCE": 0x06, "Si1132_ALS_PAUSE": 0x0A, "Si1132_ALS_AUTO": 0x0E, } params = { "Si1132_PARAM_I2CADDR": 0x00, "Si1132_PARAM_CHLIST": 0x01, "Si1132_PARAM_CHLIST_ENUV": 0x80, "Si1132_PARAM_CHLIST_ENAUX": 0x40, "Si1132_PARAM_CHLIST_ENALSIR": 0x20, "Si1132_PARAM_CHLIST_ENALSVIS": 0x10, "Si1132_PARAM_ALSENCODING": 0x06, "Si1132_PARAM_ALSIRADCMUX": 0x0E, "Si1132_PARAM_AUXADCMUX": 0x0F, "Si1132_PARAM_ALSVISADCCOUNTER": 0x10, "Si1132_PARAM_ALSVISADCGAIN": 0x11, "Si1132_PARAM_ALSVISADCMISC": 0x12, "Si1132_PARAM_ALSVISADCMISC_VISRANGE": 0x20, "Si1132_PARAM_ALSIRADCCOUNTER": 0x1D, "Si1132_PARAM_ALSIRADCGAIN": 0x1E, "Si1132_PARAM_ALSIRADCMISC": 0x1F, "Si1132_PARAM_ALSIRADCMISC_RANGE": 0x20, "Si1132_PARAM_ADCCOUNTER_511CLK": 0x70, "Si1132_PARAM_ADCMUX_SMALLIR": 0x00, "Si1132_PARAM_ADCMUX_LARGEIR": 0x03, } regs = { "Si1132_REG_PARTID": 0x00, "Si1132_REG_REVID": 0x01, "Si1132_REG_SEQID": 0x02, "Si1132_REG_INTCFG": 0x03, "Si1132_REG_INTCFG_INTOE": 0x01, "Si1132_REG_IRQEN": 0x04, "Si1132_REG_IRQEN_ALSEVERYSAMPLE": 0x01, "Si1132_REG_IRQMODE1": 0x05, "Si1132_REG_IRQMODE2": 0x06, "Si1132_REG_HWKEY": 0x07, "Si1132_REG_MEASRATE0": 0x08, "Si1132_REG_MEASRATE1": 0x09, "Si1132_REG_UCOEF0": 0x13, "Si1132_REG_UCOEF1": 0x14, "Si1132_REG_UCOEF2": 0x15, "Si1132_REG_UCOEF3": 0x16, "Si1132_REG_PARAMWR": 0x17, "Si1132_REG_COMMAND": 0x18, "Si1132_REG_RESPONSE": 0x20, "Si1132_REG_IRQSTAT": 0x21, "Si1132_REG_ALSVISDATA0": 0x22, "Si1132_REG_ALSVISDATA1": 0x23, "Si1132_REG_ALSIRDATA0": 0x24, "Si1132_REG_ALSIRDATA1": 0x25, "Si1132_REG_UVINDEX0": 0x2C, "Si1132_REG_UVINDEX1": 0x2D, "Si1132_REG_PARAMRD": 0x2E, "Si1132_REG_CHIPSTAT": 0x30, } class SI1132: def __init__(self, i2c_dev): self.bus = smbus.SMBus(int(i2c_dev.split("-")[-1])) self.id = self.read_reg8(0x00) if self.id != SI1132_PARTID: print("Wrong Device ID [", hex(self.id), "]") exit() self.reset() self.write_reg8(regs["Si1132_REG_UCOEF0"], 0x7B) self.write_reg8(regs["Si1132_REG_UCOEF1"], 0x6B) self.write_reg8(regs["Si1132_REG_UCOEF2"], 0x01) self.write_reg8(regs["Si1132_REG_UCOEF3"], 0x00) param = ( params["Si1132_PARAM_CHLIST_ENUV"] | params["Si1132_PARAM_CHLIST_ENALSIR"] | params["Si1132_PARAM_CHLIST_ENALSVIS"] ) self.writeParam(params["Si1132_PARAM_CHLIST"], param) self.write_reg8(regs["Si1132_REG_INTCFG"], regs["Si1132_REG_INTCFG_INTOE"]) self.write_reg8( regs["Si1132_REG_IRQEN"], regs["Si1132_REG_IRQEN_ALSEVERYSAMPLE"] ) self.writeParam( params["Si1132_PARAM_ALSIRADCMUX"], params["Si1132_PARAM_ADCMUX_SMALLIR"] ) time.sleep(0.01) self.writeParam(params["Si1132_PARAM_ALSIRADCGAIN"], 0) time.sleep(0.01) self.writeParam( params["Si1132_PARAM_ALSIRADCCOUNTER"], params["Si1132_PARAM_ADCCOUNTER_511CLK"], ) self.writeParam( params["Si1132_PARAM_ALSIRADCMISC"], params["Si1132_PARAM_ALSIRADCMISC_RANGE"], ) time.sleep(0.01) self.writeParam(params["Si1132_PARAM_ALSIRADCGAIN"], 0) time.sleep(0.01) self.writeParam( params["Si1132_PARAM_ALSIRADCCOUNTER"], params["Si1132_PARAM_ADCCOUNTER_511CLK"], ) self.writeParam( params["Si1132_PARAM_ALSVISADCMISC"], params["Si1132_PARAM_ALSVISADCMISC_VISRANGE"], ) time.sleep(0.01) self.write_reg8(regs["Si1132_REG_MEASRATE0"], 0xFF) self.write_reg8(regs["Si1132_REG_COMMAND"], cmds["Si1132_ALS_AUTO"]) def reset(self): self.write_reg8(regs["Si1132_REG_MEASRATE0"], 0) self.write_reg8(regs["Si1132_REG_MEASRATE1"], 0) self.write_reg8(regs["Si1132_REG_IRQEN"], 0) self.write_reg8(regs["Si1132_REG_IRQMODE1"], 0) self.write_reg8(regs["Si1132_REG_IRQMODE2"], 0) self.write_reg8(regs["Si1132_REG_INTCFG"], 0) self.write_reg8(regs["Si1132_REG_IRQSTAT"], 0xFF) self.write_reg8(regs["Si1132_REG_COMMAND"], cmds["Si1132_RESET"]) time.sleep(0.01) self.write_reg8(regs["Si1132_REG_HWKEY"], 0x17) time.sleep(0.01) def read_reg8(self, reg): return self.bus.read_byte_data(SI1132_I2C_ADDR, reg) def read_reg16(self, reg): return self.bus.read_word_data(SI1132_I2C_ADDR, reg) def write_reg8(self, reg, val): self.bus.write_byte_data(SI1132_I2C_ADDR, reg, val) def write_reg16(self, reg, val): self.bus.write_word_data(SI1132_I2C_ADDR, reg, val) def writeParam(self, param, val): self.write_reg8(regs["Si1132_REG_PARAMWR"], val) self.write_reg8(regs["Si1132_REG_COMMAND"], param | cmds["Si1132_PARAM_SET"]) def readVisible(self): time.sleep(0.01) return ((self.read_reg16(0x22) - 256) / 0.282) * 14.5 def readIR(self): time.sleep(0.01) return ((self.read_reg16(0x24) - 250) / 2.44) * 14.5 def readUV(self): time.sleep(0.01) return self.read_reg16(0x2C)