import machine import time import LCD from machine import Pin i2c = machine.I2C(0, scl=machine.Pin(1), sda=machine.Pin(0)) devices = i2c.scan() addr = devices[0] print('connected to deivce at' + str(hex(addr))) def reg_write(i2c, addr, reg, data): msg = bytearray() msg.append(data) i2c.writeto_mem(addr, reg, msg) def reg_read(i2c, addr, reg, nbytes): data = i2c.readfrom_mem(addr, reg, nbytes) return data # constants for temperature calibration x = reg_read(i2c, addr, 0x88, 2) T1 = x[1]*256 + x[0] x = reg_read(i2c, addr, 0x8A, 2) T2 = x[1]*256 + x[0] if(T2 > 0x8000): T2 = T2 - 0x10000 x = reg_read(i2c, addr, 0x8C, 2) T3 = x[1]*256 + x[0] if(T3 > 0x8000): T3 = T3 - 0x10000 x = reg_read(i2c, addr, 0x8e, 2) P1 = x[1]*256 + x[0] x = reg_read(i2c, addr, 0x90, 2) P2 = x[1]*256 + x[0] if(P2 > 0x8000): P2 = P2 - 0x10000 x = reg_read(i2c, addr, 0x92, 2) P3 = x[1]*256 + x[0] if(P3 > 0x8000): P3 = P3 - 0x10000 x = reg_read(i2c, addr, 0x94, 2) P4 = x[1]*256 + x[0] if(P4 > 0x8000): P4 = P4 - 0x10000 x = reg_read(i2c, addr, 0x96, 2) P5 = x[1]*256 + x[0] if(P5 > 0x8000): P5 = P5 - 0x10000 x = reg_read(i2c, addr, 0x98, 2) P6 = x[1]*256 + x[0] if(P6 > 0x8000): P6 = P6 - 0x10000 x = reg_read(i2c, addr, 0x9a, 2) P7 = x[1]*256 + x[0] if(P7 > 0x8000): P7 = P7 - 0x10000 x = reg_read(i2c, addr, 0x9c, 2) P8 = x[1]*256 + x[0] if(P8 > 0x8000): P8 = P8 - 0x10000 x = reg_read(i2c, addr, 0x9e, 2) P9 = x[1]*256 + x[0] if(P9 > 0x8000): P9 = P9 - 0x10000 def read_temp(): while(ord(reg_read(i2c, addr, 0xf3, 1)) & 0x08): pass x0 = ord(reg_read(i2c, addr, 0xFA, 1)) x1 = ord(reg_read(i2c, addr, 0xFA+1, 1)) x2 = ord(reg_read(i2c, addr, 0xFA+2, 1)) raw = ((x0 << 16) | (x1 << 8) | x2) >> 4 x = raw - (T1<<4) ax2 = (x*x*T3) >> 34 bx = x*T2 >> 14 T = (ax2 + bx) / 5120 return(T) def read_pres(T): x0 = ord(reg_read(i2c, addr, 0xF7, 1)) x1 = ord(reg_read(i2c, addr, 0xF7+1, 1)) x2 = ord(reg_read(i2c, addr, 0xF7+2, 1)) adc = ((x0 << 16) | (x1 << 8) | x2) >> 4 t_fine = round(T*25600/5) var1 = t_fine - 128000 var2 = var1 * var1 * P6 var2 = var2 + ((var1 * P5) << 17) var2 = var2 + (P4 << 35) var1 = (((var1 * var1 * P3) >> 8) + ((var1 * P2) >> 12)) var1 = (((1 << 47) + var1) * P1) >> 33 if var1 == 0: return 0 p = 1048576 - adc p = (((p << 31) - var2) * 3125) // var1 var1 = (P9 * (p >> 13) * (p >> 13)) >> 25 var2 = (P8 * p) >> 19 pressure = ((p + var1 + var2) >> 8) + (P7 << 4) pressure = pressure / 25600 return(pressure) # set filter order # filer = 16 # delay = 20ms reg_write(i2c, addr, 0xf5, 0xa4) # set oversampling to 16x reg_write(i2c, addr, 0xf4, 0xff) reg_write(i2c, addr, 0xf2, 0x07) Button14 = Pin(14, Pin.IN, Pin.PULL_UP) Button15 = Pin(15, Pin.IN, Pin.PULL_UP) Beeper = Pin(13, Pin.OUT) FileName = 'Stairs_hPa.txt' Error_Flag = 0 def Beep(): Beeper.value(1) time.sleep(0.1) Beeper.value(0) LCD.Init() Navy = LCD.RGB(0,0,5) White = LCD.RGB(250,250,250) Pink = LCD.RGB(250,150,150) LCD.Clear(Navy) LCD.Title(FileName,White, Navy) T = read_temp() P0 = read_pres(T) f = open(FileName, "a") Record_Flag = 0 while(1): T = read_temp() P = read_pres(T) if(Button15.value() == 0): P0 = P print('Saved current pressure') if(Button14.value() == 0): Record_Flag = not Record_Flag if(Record_Flag): Beep() f = open(FileName, "a") print('File Open') LCD.Text('Recording',5,5,Pink,Navy) else: Beep() time.sleep(0.1) Beep() f.close() print('File Closed') LCD.Text(' ',5,5,Pink,Navy) while(Button14.value() == 0): pass msg0 = str('{:10.4f}'.format(T) + ' C') msg1 = str('{:10.4f}'.format(P) + ' hPa') msg2 = str('{:10.4f}'.format(P-P0) + ' hPa') msg = msg0 + msg1 + msg2 print(msg) LCD.Text2(msg0, 100, 50, White, Navy) LCD.Text2(msg1, 100, 90, White, Navy) LCD.Text2(msg2, 100, 130, White, Navy) if(Record_Flag): f.write(msg + '\n') time.sleep(1)