one single compensation function

pull/1/head
Peter Dahlberg 2016-05-21 17:29:05 +02:00
rodzic 354f53f1dc
commit d0264138fe
1 zmienionych plików z 25 dodań i 52 usunięć

Wyświetl plik

@ -119,53 +119,24 @@ class BME280:
return (raw_temp, raw_press, raw_hum) return (raw_temp, raw_press, raw_hum)
def read_raw_temp(self): def read_compensated_data(self):
"""Reads the raw (uncompensated) temperature from the sensor.""" """ Reads the data from the sensor and returns the compensated data.
meas = self._mode
self._device.write8(BME280_REGISTER_CONTROL_HUM, meas)
meas = self._mode << 5 | self._mode << 2 | 1
self._device.write8(BME280_REGISTER_CONTROL, meas)
sleep_time = 1250 + 2300 * (1 << self._mode)
sleep_time = sleep_time + 2300 * (1 << self._mode) + 575
sleep_time = sleep_time + 2300 * (1 << self._mode) + 575
time.sleep_us(sleep_time) # Wait the required time
msb = self._device.readU8(BME280_REGISTER_TEMP_DATA)
lsb = self._device.readU8(BME280_REGISTER_TEMP_DATA + 1)
xlsb = self._device.readU8(BME280_REGISTER_TEMP_DATA + 2)
raw = ((msb << 16) | (lsb << 8) | xlsb) >> 4
return raw
def read_raw_pressure(self): Returns:
"""Reads the raw (uncompensated) pressure level from the sensor.""" tuple with temperature, pressure, humidity
"""Assumes that the temperature has already been read """ """
"""i.e. that enough delay has been provided""" raw_temp, raw_press, raw_hum = self.read_raw_data()
msb = self._device.readU8(BME280_REGISTER_PRESSURE_DATA)
lsb = self._device.readU8(BME280_REGISTER_PRESSURE_DATA + 1)
xlsb = self._device.readU8(BME280_REGISTER_PRESSURE_DATA + 2)
raw = ((msb << 16) | (lsb << 8) | xlsb) >> 4
return raw
def read_raw_humidity(self): #temperature
"""Assumes that the temperature has already been read """ var1 = ((raw_temp >> 3) - (self.dig_T1 << 1)) * (self.dig_T2 >> 11)
"""i.e. that enough delay has been provided"""
msb = self._device.readU8(BME280_REGISTER_HUMIDITY_DATA)
lsb = self._device.readU8(BME280_REGISTER_HUMIDITY_DATA + 1)
raw = (msb << 8) | lsb
return raw
def read_temperature(self):
"""Get the compensated temperature in 0.01 of a degree celsius."""
adc = self.read_raw_temp()
var1 = ((adc >> 3) - (self.dig_T1 << 1)) * (self.dig_T2 >> 11)
var2 = (( var2 = ((
(((adc >> 4) - self.dig_T1) * ((adc >> 4) - self.dig_T1)) >> 12) * (((raw_temp >> 4) - self.dig_T1) *
((raw_temp >> 4) - self.dig_T1)) >> 12) *
self.dig_T3) >> 14 self.dig_T3) >> 14
self.t_fine = var1 + var2 self.t_fine = var1 + var2
return (self.t_fine * 5 + 128) >> 8 temp = (self.t_fine * 5 + 128) >> 8
def read_pressure(self): # pressure
"""Gets the compensated pressure in Pascals."""
adc = self.read_raw_pressure()
var1 = self.t_fine - 128000 var1 = self.t_fine - 128000
var2 = var1 * var1 * self.dig_P6 var2 = var1 * var1 * self.dig_P6
var2 = var2 + ((var1 * self.dig_P5) << 17) var2 = var2 + ((var1 * self.dig_P5) << 17)
@ -174,30 +145,32 @@ class BME280:
((var1 * self.dig_P2) >> 12)) ((var1 * self.dig_P2) >> 12))
var1 = (((1 << 47) + var1) * self.dig_P1) >> 33 var1 = (((1 << 47) + var1) * self.dig_P1) >> 33
if var1 == 0: if var1 == 0:
return 0 pressure = 0
p = 1048576 - adc else:
p = (((p << 31) - var2) * 3125) // var1 p = 1048576 - raw_press
var1 = (self.dig_P9 * (p >> 13) * (p >> 13)) >> 25 p = (((p << 31) - var2) * 3125) // var1
var2 = (self.dig_P8 * p) >> 19 var1 = (self.dig_P9 * (p >> 13) * (p >> 13)) >> 25
return ((p + var1 + var2) >> 8) + (self.dig_P7 << 4) var2 = (self.dig_P8 * p) >> 19
pressure = ((p + var1 + var2) >> 8) + (self.dig_P7 << 4)
def read_humidity(self): #humidity
adc = self.read_raw_humidity()
# print 'Raw humidity = {0:d}'.format (adc)
h = self.t_fine - 76800 h = self.t_fine - 76800
h = (((((adc << 14) - (self.dig_H4 << 20) - (self.dig_H5 * h)) + h = (((((raw_hum << 14) - (self.dig_H4 << 20) - (self.dig_H5 * h)) +
16384) >> 15) * (((((((h * self.dig_H6) >> 10) * (((h * 16384) >> 15) * (((((((h * self.dig_H6) >> 10) * (((h *
self.dig_H3) >> 11) + 32768)) >> 10) + 2097152) * self.dig_H3) >> 11) + 32768)) >> 10) + 2097152) *
self.dig_H2 + 8192) >> 14)) self.dig_H2 + 8192) >> 14))
h = h - (((((h >> 15) * (h >> 15)) >> 7) * self.dig_H1) >> 4) h = h - (((((h >> 15) * (h >> 15)) >> 7) * self.dig_H1) >> 4)
h = 0 if h < 0 else h h = 0 if h < 0 else h
h = 419430400 if h > 419430400 else h h = 419430400 if h > 419430400 else h
return h >> 12 humidity = h >> 12
return (temp, pressure, humidity)
@property @property
def values(self): def values(self):
""" human readable values """ """ human readable values """
t = self.read_temperature() t = self.read_temperature()
ti = t // 100 ti = t // 100
td = t - ti * 100 td = t - ti * 100