82 lines
2.3 KiB
Python
82 lines
2.3 KiB
Python
import utime
|
|
from micropython import const
|
|
|
|
_MS5611_ADDR = const(0x77)
|
|
_CMD_ADC_READ = const(0x00)
|
|
_CMD_RESET = const(0x1E)
|
|
_CMD_CONVERT_D1 = const(0x40)
|
|
_CMD_CONVERT_D2 = const(0x50)
|
|
_CAL_DATA_C1 = const(0xA2)
|
|
_CAL_DATA_C2 = const(0xA4)
|
|
_CAL_DATA_C3 = const(0xA6)
|
|
_CAL_DATA_C4 = const(0xA8)
|
|
_CAL_DATA_C5 = const(0xAA)
|
|
_CAL_DATA_C6 = const(0xAC)
|
|
|
|
# Oversampling settings
|
|
OSR={"OSR_256":0, "OSR_512":2, "OSR_1024":4, "OSR_2048":6, "OSR_4096":8}
|
|
|
|
class MS5611:
|
|
def __init__(self, i2c_bus, addr=_MS5611_ADDR, osr='OSR_4096'):
|
|
self._device = i2c_bus
|
|
self._address = addr
|
|
self._wreg(_CMD_RESET)
|
|
utime.sleep_ms(50)
|
|
|
|
self.c1 = self._rreg(_CAL_DATA_C1, 2)
|
|
self.c2 = self._rreg(_CAL_DATA_C2, 2)
|
|
self.c3 = self._rreg(_CAL_DATA_C3, 2)
|
|
self.c4 = self._rreg(_CAL_DATA_C4, 2)
|
|
self.c5 = self._rreg(_CAL_DATA_C5, 2)
|
|
self.c6 = self._rreg(_CAL_DATA_C6, 2)
|
|
self.pressure_cmd_rate = _CMD_CONVERT_D1 + OSR[osr]
|
|
self.temp_cmd_rate = _CMD_CONVERT_D2 + OSR[osr]
|
|
|
|
def _wreg(self, val):
|
|
'''Write memory address'''
|
|
self._device.writeto(self._address, bytes([val]))
|
|
|
|
def _rreg(self, reg, nbytes=1):
|
|
'''Read memory address'''
|
|
return int.from_bytes(self._device.readfrom_mem(self._address, reg, nbytes), 'big')
|
|
|
|
@property
|
|
def getdata(self):
|
|
'''处理获取数据'''
|
|
self._wreg(self.pressure_cmd_rate)
|
|
utime.sleep_ms(15)
|
|
D1 = self._rreg(_CMD_ADC_READ, 3)
|
|
|
|
self._wreg(self.temp_cmd_rate)
|
|
utime.sleep_ms(15)
|
|
D2 = self._rreg(_CMD_ADC_READ, 3)
|
|
|
|
dT = D2 - self.c5 * 2 ** 8
|
|
TEMP = 2000 + dT * self.c6 / 2 ** 23
|
|
OFF = self.c2 * 2 ** 16 + dT * self.c4 / 2 ** 7
|
|
SENS = self.c1 * 2 ** 15 + dT * self.c3 / 2 ** 8
|
|
|
|
if TEMP < 2000:
|
|
T2 = dT * dT / 2 ** 31
|
|
OFF2 = 5 * (TEMP - 2000) ** 2 / 2
|
|
SENS2 = 5 * (TEMP - 2000) ** 2 / 4
|
|
if TEMP < -1500:
|
|
OFF2 = OFF2 + 7 * (TEMP + 1500) ** 2
|
|
SENS2 = SENS2 + 11 * (TEMP + 1500) ** 2 / 2
|
|
TEMP = TEMP - T2
|
|
OFF = OFF - OFF2
|
|
SENS = SENS - SENS2
|
|
|
|
P = (D1 * SENS / 2 ** 21 - OFF) / 2 ** 15
|
|
H = (1 - (P / 101325) ** (1 / 5.255)) * 44330
|
|
return round(P / 100, 2), round(TEMP / 100, 2), round(H, 2)
|
|
|
|
def pressure(self):
|
|
return self.getdata[0]
|
|
|
|
def temperature(self):
|
|
return self.getdata[1]
|
|
|
|
def altitude(self, reference=1013.25):
|
|
return (pow((reference / 33.8639), 0.190255) - pow((self.getdata[0] / 33.8639), 0.190255)) / 0.000013125214
|