Skip to content

Commit 482fe85

Browse files
committed
pressure resolution property
1 parent 5cf75d8 commit 482fe85

File tree

2 files changed

+161
-9
lines changed

2 files changed

+161
-9
lines changed

adafruit_ms8607.py

Lines changed: 159 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,56 @@
6767
# ]
6868

6969

70-
class MS8607Humidity:
71-
"""Library for the MS8607 Humidity Sensor
70+
class CV:
71+
"""struct helper"""
72+
73+
@classmethod
74+
def add_values(cls, value_tuples):
75+
"""Add CV values to the class"""
76+
cls.string = {}
77+
cls.lsb = {}
78+
79+
for value_tuple in value_tuples:
80+
name, value, string, lsb = value_tuple
81+
setattr(cls, name, value)
82+
cls.string[value] = string
83+
cls.lsb[value] = lsb
84+
85+
@classmethod
86+
def is_valid(cls, value):
87+
"""Validate that a given value is a member"""
88+
return value in cls.string
89+
90+
91+
# class Flicker(CV):
92+
# """Options for ``flicker_detection_type``"""
93+
94+
# pass # pylint: disable=unnecessary-pass
95+
96+
97+
# Flicker.add_values((("FLICKER_100HZ", 0, 100, None), ("FLICKER_1000HZ", 1, 1000, None)))
98+
99+
100+
class PressureResolution(CV):
101+
"""Options for `pressure_resolution`"""
102+
103+
pass # pylint: disable=unnecessary-pass
104+
105+
106+
PressureResolution.add_values(
107+
(
108+
("OSR_256", 0, 256, 0.001),
109+
("OSR_512", 1, 512, 0.002),
110+
("OSR_1024", 2, 1024, 0.003),
111+
("OSR_2048", 3, 2048, 0.005),
112+
("OSR_4096", 4, 4096, 0.009),
113+
("OSR_8192", 5, 8192, 0.019),
114+
)
115+
)
116+
117+
118+
class MS8607:
119+
"""Library for the MS8607 Pressure Temperature and Humidity Sensor
72120
73121
74122
:param ~busio.I2C i2c_bus: The I2C bus the MS8607 is connected to.
@@ -82,7 +130,9 @@ def __init__(self, i2c_bus):
82130
self._buffer = bytearray(4)
83131
self.reset()
84132
self.initialize()
85-
self._psensor_resolution_osr = 5
133+
self.pressure_resolution = (
134+
PressureResolution.OSR_8192 # pylint:disable=no-member
135+
)
86136
self._pressure = None
87137
self._temperature = None
88138

@@ -141,6 +191,21 @@ def _scale_temp_pressure(self, raw_temperature, raw_pressure):
141191

142192
self._pressure = ((((raw_pressure * sensitivity) >> 21) - offset) >> 15) / 100
143193

194+
@property
195+
def pressure_resolution(self):
196+
"""The measurement resolution used for the pressure and temperature sensor"""
197+
198+
return self._psensor_resolution_osr
199+
200+
@pressure_resolution.setter
201+
def pressure_resolution(self, resolution):
202+
if not PressureResolution.is_valid(resolution):
203+
raise AttributeError(
204+
"pressure_resolution must be an `adafruit_ms8607.PressureResolution`"
205+
)
206+
207+
self._psensor_resolution_osr = resolution
208+
144209
@staticmethod
145210
def _corrections(initial_temp, delta_temp):
146211
# # Second order temperature compensation
@@ -177,14 +242,15 @@ def _pressure_offset(self, delta_temp):
177242
def _read_temp_pressure(self):
178243

179244
# First read temperature
245+
180246
cmd = self._psensor_resolution_osr * 2
181247
cmd |= _MS8607_PT_CMD_TEMP_START
182248
self._buffer[0] = cmd
183249
with self.pressure_i2c_device as i2c:
184250
i2c.write(self._buffer, end=1)
185-
186-
sleep(0.018)
187-
251+
# re-purposing lsb for integration time
252+
integration_time = PressureResolution.lsb[self._psensor_resolution_osr]
253+
sleep(integration_time)
188254
self._buffer[0] = _MS8607_PT_CMD_READ_ADC
189255
with self.pressure_i2c_device as i2c:
190256
i2c.write_then_readinto(
@@ -202,7 +268,7 @@ def _read_temp_pressure(self):
202268
with self.pressure_i2c_device as i2c:
203269
i2c.write(self._buffer, end=1)
204270

205-
sleep(0.18)
271+
sleep(integration_time)
206272

207273
self._buffer[0] = _MS8607_PT_CMD_READ_ADC
208274
with self.pressure_i2c_device as i2c:
@@ -256,6 +322,48 @@ def relative_humidity(self):
256322

257323
# return status
258324

325+
# MS8607::set_humidity_resolution(enum MS8607_humidity_resolution res)
326+
# {
327+
# enum MS8607_status status;
328+
# uint8_t reg_value, tmp = 0;
329+
# uint32_t conversion_time = HSENSOR_CONVERSION_TIME_12b;
330+
331+
# if (res == MS8607_humidity_resolution_12b)
332+
# {
333+
# tmp = HSENSOR_USER_REG_RESOLUTION_12b;
334+
# conversion_time = HSENSOR_CONVERSION_TIME_12b;
335+
# }
336+
# else if (res == MS8607_humidity_resolution_10b)
337+
# {
338+
# tmp = HSENSOR_USER_REG_RESOLUTION_10b;
339+
# conversion_time = HSENSOR_CONVERSION_TIME_10b;
340+
# }
341+
# else if (res == MS8607_humidity_resolution_8b)
342+
# {
343+
# tmp = HSENSOR_USER_REG_RESOLUTION_8b;
344+
# conversion_time = HSENSOR_CONVERSION_TIME_8b;
345+
# }
346+
# else if (res == MS8607_humidity_resolution_11b)
347+
# {
348+
# tmp = HSENSOR_USER_REG_RESOLUTION_11b;
349+
# conversion_time = HSENSOR_CONVERSION_TIME_11b;
350+
# }
351+
352+
# status = hsensor_read_user_register(&reg_value);
353+
# if (status != MS8607_status_ok)
354+
# return status;
355+
356+
# // Clear the resolution bits
357+
# reg_value &= ~HSENSOR_USER_REG_RESOLUTION_MASK;
358+
# reg_value |= tmp & HSENSOR_USER_REG_RESOLUTION_MASK;
359+
360+
# hsensor_conversion_time = conversion_time;
361+
362+
# status = hsensor_write_user_register(reg_value);
363+
364+
# return status;
365+
# }
366+
259367
@staticmethod
260368
def _check_humidity_crc(value, crc):
261369
polynom = 0x988000 # x^8 + x^5 + x^4 + 1
@@ -331,3 +439,47 @@ def _check_press_calibration_crc(calibration_int16s, crc):
331439
# float temperature = getTemperature()
332440
# float compensated_RH= get_compensated_humidity(temperature, humidity, &compensated_RH)
333441
# float dew_point = get_dew_point(temperature, humidity, &dew_point)
442+
443+
# bool begin(TwoWire &wirePort = Wire);
444+
# bool hsensor_heater_on;
445+
# bool hsensor_is_connected(void);
446+
# bool isConnected(void);
447+
# bool psensor_crc_check(uint16_t *n_prom, uint8_t crc);
448+
# bool psensor_is_connected(void);
449+
# boolean humidityHasBeenRead = true;
450+
# boolean pressureHasBeenRead = true;
451+
# boolean temperatureHasBeenRead = true;
452+
# double adjustToSeaLevel(double absolutePressure, double actualAltitude);
453+
# double altitudeChange(double currentPressure, double baselinePressure);
454+
# enum MS8607_humidity_i2c_master_mode hsensor_i2c_master_mode;
455+
# enum MS8607_status
456+
# enum MS8607_status disable_heater(void);
457+
# enum MS8607_status enable_heater(void);
458+
# enum MS8607_status get_battery_status(enum MS8607_battery_status *bat);
459+
# enum MS8607_status get_compensated_humidity(float temperature,
460+
# enum MS8607_status get_dew_point(float temperature, float relative_humidity,
461+
# enum MS8607_status get_heater_status(enum MS8607_heater_status *heater);
462+
# enum MS8607_status hsensor_crc_check(uint16_t value, uint8_t crc);
463+
# enum MS8607_status hsensor_humidity_conversion_and_read_adc(uint16_t *adc);
464+
# enum MS8607_status hsensor_read_relative_humidity(float *humidity);
465+
# enum MS8607_status hsensor_read_user_register(uint8_t *value);
466+
# enum MS8607_status hsensor_reset(void);
467+
# enum MS8607_status hsensor_write_user_register(uint8_t value);
468+
# enum MS8607_status psensor_conversion_and_read_adc(uint8_t cmd,
469+
# enum MS8607_status psensor_read_eeprom(void);
470+
# enum MS8607_status psensor_read_eeprom_coeff(uint8_t command,
471+
# enum MS8607_status psensor_read_pressure_and_temperature(float *temperature,
472+
# enum MS8607_status psensor_reset(void);
473+
# enum MS8607_status read_temperature_pressure_humidity(float *t, float *p,
474+
# enum MS8607_status reset(void);
475+
# float getHumidity(); //Returns the latest humidity measurement
476+
# float getPressure(); //Returns the latest pressure measurement
477+
# float getTemperature(); //Returns the latest temperature measurement
478+
# float globalHumidity;
479+
# float globalPressure;
480+
# float globalTemperature;
481+
# uint32_t hsensor_conversion_time;
482+
# uint32_t psensor_conversion_time[6];
483+
# void set_humidity_i2c_master_mode(enum MS8607_humidity_i2c_master_mode mode);
484+
# void set_pressure_resolution(enum MS8607_pressure_resolution res);
485+
# set_humidity_resolution(enum MS8607_humidity_resolution res);

examples/ms8607_simpletest.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@
33
from time import sleep
44
import board
55
import busio
6-
from adafruit_ms8607 import MS8607Humidity
6+
from adafruit_ms8607 import MS8607
77

88
i2c = busio.I2C(board.SCL, board.SDA)
9-
sensor = MS8607Humidity(i2c)
9+
sensor = MS8607(i2c)
1010

1111
while True:
1212

0 commit comments

Comments
 (0)