#!/usr/bin/python3 #coding: utf-8 from smbus2 import SMBus import time bus_number = 1 bus = SMBus(bus_number) digT = [] digP = [] temperature = 0.0 pressure = 0.0 def writeReg(i2c_addr, reg_address, data): bus.write_byte_data(i2c_addr, reg_address, data) time.sleep(0.01) def setup(i2c_address): osrs_t = 1 #Temperature oversampling x 1 osrs_p = 1 #Pressure oversampling x 1 # osrs_h = 1 #Humidity oversampling x 1 osrs_h = 0 #Humidity oversampling x 1 # mode = 3 #Normal mode mode = 1 #Forced mode # t_sb = 5 #Tstandby 1000ms t_sb = 0 #Tstandby 0ms filter = 0 #Filter off spi3w_en = 0 #3-wire SPI Disable ctrl_meas_reg = (osrs_t << 5) | (osrs_p << 2) | mode config_reg = (t_sb << 5) | (filter << 2) | spi3w_en ctrl_hum_reg = osrs_h writeReg(i2c_address, 0xF2, ctrl_hum_reg) writeReg(i2c_address, 0xF4, ctrl_meas_reg) writeReg(i2c_address, 0xF5, config_reg) calib = [] for i in range (0x88, 0x88+24): calib.append(bus.read_byte_data(i2c_address, i)) # calib.append(bus.read_byte_data(i2c_address,0xA1)) # for i in range (0xE1, 0xE1+7): # calib.append(bus.read_byte_data(i2c_address, i)) digT.clear() digP.clear() digT.append((calib[1] << 8) | calib[0]) digT.append((calib[3] << 8) | calib[2]) digT.append((calib[5] << 8) | calib[4]) digP.append((calib[7] << 8) | calib[6]) digP.append((calib[9] << 8) | calib[8]) digP.append((calib[11]<< 8) | calib[10]) digP.append((calib[13]<< 8) | calib[12]) digP.append((calib[15]<< 8) | calib[14]) digP.append((calib[17]<< 8) | calib[16]) digP.append((calib[19]<< 8) | calib[18]) digP.append((calib[21]<< 8) | calib[20]) digP.append((calib[23]<< 8) | calib[22]) for i in range(1, 2): if digT[i] & 0x8000: digT[i] = (-digT[i] ^ 0xFFFF) + 1 for i in range(1, 8): if digP[i] & 0x8000: digP[i] = (-digP[i] ^ 0xFFFF) + 1 def measure(i2c_address): setup(i2c_address) data = [] global temperature global pressure for i in range (0xF7, 0xF7+6): data.append(bus.read_byte_data(i2c_address, i)) pres_raw = (data[0] << 12) | (data[1] << 4) | (data[2] >> 4) & 0xf temp_raw = (data[3] << 12) | (data[4] << 4) | (data[5] >> 4) & 0xf var1 = ((((temp_raw>>3) - (digT[0]<<1))) * (digT[1])) >> 11 var2 = (((((temp_raw>>4) - (digT[0])) * ((temp_raw>>4) - (digT[0]))) >> 12) * (digT[2])) >> 14 t_fine = var1 + var2 - 25574 #5C:=25574.4 T = (t_fine * 5 + 128) >> 8 temperature = T / 100.0 var1 = (t_fine) - 128000 var2 = var1 * var1 * digP[5] var2 = var2 + ((var1*digP[4])<<17) var2 = var2 + ((digP[3])<<35) var1 = ((var1 * var1 * digP[2])>>8) + ((var1 * digP[1])<<12) var1 = ((((1)<<47)+var1))*digP[0]>>33 if var1 == 0: return p = 1048576 - pres_raw p = (((p<<31) - var2)*3125) / var1 # var1 = ((digP[8]) * (p>>13) * (p>>13)) >> 25 var1 = ((digP[8]) * (p/8192) * (p/8192)) / 33554432 # var2 = ((digP[7]) * p) >> 19 var2 = ((digP[7]) * p) / 524288 p = ((p + var1 + var2) / 256) + ((digP[6])<<4) pressure = p / 25600.0 def read_temp(): t1 = 0 t2 = 0 try: measure(0x76) t1 = round(temperature, 1) measure(0x77) t2 = round(temperature, 1) return t1, t2 except: return t1, t2 if __name__ == '__main__': try: measure(0x76) print("pressure1 : %7.2f hPa" % (pressure)) print("temp1 : %-6.2f C" % (temperature)) measure(0x77) print("pressure2 : %7.2f hPa" % (pressure)) print("temp2 : %-6.2f C" % (temperature)) except: pass