mirror of
https://github.com/openmv/openmv.git
synced 2025-11-04 14:49:50 +08:00
88 lines
2.6 KiB
Python
88 lines
2.6 KiB
Python
# LPS22HB/HH pressure seneor micropython drive
|
|
# ver: 2.0
|
|
# License: MIT
|
|
# Author: shaoziyang (shaoziyang@micropython.org.cn)
|
|
# v1.0 2016.4
|
|
# v2.0 2019.7
|
|
|
|
class LPS22H():
|
|
LPS22_CTRL_REG1 = const(0x10)
|
|
LPS22_CTRL_REG2 = const(0x11)
|
|
LPS22_STATUS = const(0x27)
|
|
LPS22_TEMP_OUT_L = const(0x2B)
|
|
LPS22_PRESS_OUT_XL = const(0x28)
|
|
LPS22_PRESS_OUT_L = const(0x29)
|
|
|
|
def __init__(self, i2c, addr = 0x5C):
|
|
self.i2c = i2c
|
|
self.addr = addr
|
|
self.tb = bytearray(1)
|
|
self.rb = bytearray(1)
|
|
self.oneshot = False
|
|
self.irq_v = [0, 0]
|
|
# ODR=1 EN_LPFP=1 BDU=1
|
|
self.setreg(LPS22_CTRL_REG1, 0x1A)
|
|
self.oneshot_mode(False)
|
|
|
|
def oneshot_mode(self, oneshot=None):
|
|
if oneshot is None:
|
|
return self.oneshot
|
|
else:
|
|
self.getreg(LPS22_CTRL_REG1)
|
|
self.oneshot = oneshot
|
|
if oneshot: self.rb[0] &= 0x0F
|
|
else: self.rb[0] |= 0x10
|
|
self.setreg(LPS22_CTRL_REG1, self.rb[0])
|
|
|
|
def int16(self, d):
|
|
return d if d < 0x8000 else d - 0x10000
|
|
|
|
def setreg(self, reg, dat):
|
|
self.tb[0] = dat
|
|
self.i2c.writeto_mem(self.addr, reg, self.tb)
|
|
|
|
def getreg(self, reg):
|
|
self.i2c.readfrom_mem_into(self.addr, reg, self.rb)
|
|
return self.rb[0]
|
|
|
|
def get2reg(self, reg):
|
|
return self.getreg(reg) + self.getreg(reg+1) * 256
|
|
|
|
def ONE_SHOT(self, b):
|
|
if self.oneshot:
|
|
self.setreg(LPS22_CTRL_REG2, self.getreg(LPS22_CTRL_REG2) | 0x01)
|
|
self.getreg(0x28 + b*2)
|
|
while 1:
|
|
if self.getreg(LPS22_STATUS) & b:
|
|
return
|
|
|
|
def temperature(self):
|
|
self.ONE_SHOT(2)
|
|
try:
|
|
return self.int16(self.get2reg(LPS22_TEMP_OUT_L))/100
|
|
except MemoryError:
|
|
return self.temperature_irq()
|
|
|
|
def pressure(self):
|
|
self.ONE_SHOT(1)
|
|
try:
|
|
return (self.getreg(LPS22_PRESS_OUT_XL) + self.get2reg(LPS22_PRESS_OUT_L) * 256)/4096
|
|
except MemoryError:
|
|
return self.pressure_irq()
|
|
|
|
def altitude(self):
|
|
return (((1013.25 / self.pressure())**(1/5.257)) - 1.0) * (self.temperature() + 273.15) / 0.0065
|
|
|
|
def temperature_irq(self):
|
|
self.ONE_SHOT(2)
|
|
return self.int16(self.get2reg(LPS22_TEMP_OUT_L))//100
|
|
|
|
def pressure_irq(self):
|
|
self.ONE_SHOT(1)
|
|
return self.get2reg(LPS22_PRESS_OUT_L) >> 4
|
|
|
|
def get_irq(self):
|
|
self.irq_v[0] = self.temperature_irq()
|
|
self.irq_v[1] = self.pressure_irq()
|
|
return self.irq_v
|