Skip to content

Commit 9e588e6

Browse files
committed
added humidity resolution setter
1 parent 482fe85 commit 9e588e6

File tree

3 files changed

+78
-140
lines changed

3 files changed

+78
-140
lines changed

README.rst

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -60,20 +60,21 @@ Usage Example
6060

6161
.. code-block:: python3
6262
63-
import time
64-
import busio
63+
from time import sleep
6564
import board
66-
import adafruit_shtc3
65+
import busio
66+
from adafruit_ms8607 import MS8607
6767
6868
i2c = busio.I2C(board.SCL, board.SDA)
69-
sht = adafruit_shtc3.SHTC3(i2c)
69+
sensor = MS8607(i2c)
7070
7171
while True:
72-
temperature, relative_humidity = sht.measurements
73-
print("Temperature: %0.1f C" % temperature)
74-
print("Humidity: %0.1f %%" % relative_humidity)
75-
print("")
76-
time.sleep(1)
72+
73+
print("Pressure: %.2f hPa" % sensor.pressure)
74+
print("Temperature: %.2f C" % sensor.temperature)
75+
print("Humidity: %.2f %% rH" % sensor.relative_humidity)
76+
sleep(1)
77+
7778
7879
7980
Contributing

adafruit_ms8607.py

Lines changed: 66 additions & 130 deletions
Original file line numberDiff line numberDiff line change
@@ -43,13 +43,18 @@
4343
_MS8607_READ_HUMIDITY_WO_HOLD_COMMAND = const(0xF5) #
4444
_MS8607_READ_SERIAL_FIRST_8BYTES_COMMAND = const(0xFA0F) #
4545
_MS8607_READ_SERIAL_LAST_6BYTES_COMMAND = const(0xFCC9) #
46-
_MS8607_WRITE_USER_REG_COMMAND = const(0xE6) #
47-
_MS8607_READ_USER_REG_COMMAND = const(0xE7) #
48-
_MS8607_PRESSURE_CALIB_ROM_ADDR = const(0xA0) # 16-bit registers through 0xAE
4946

47+
_MS8607_HUM_CMD_READ_USR = const(0xE7)
48+
_MS8607_HUM_CMD_WRITE_USR = const(0xE6)
49+
50+
_MS8607_HUM_CMD_ENABLE_ONCHIP_HEATER_MASK = const(0x4)
51+
_MS8607_PT_CALIB_ROM_ADDR = const(0xA0) # 16-bit registers through 0xAE
52+
53+
_MS8607_HUM_USR_RESOLUTION_MASK = const(0x81)
5054

5155
_MS8607_PTSENSOR_ADDR = const(0x76) #
5256
_MS8607_HSENSOR_ADDR = const(0x40) #
57+
5358
_MS8607_COEFF_MUL = const(125) #
5459
_MS8607_COEFF_ADD = const(-6) #
5560

@@ -58,13 +63,6 @@
5863
_MS8607_PT_CMD_PRESS_START = const(0x40) # Command to start pressure ADC measurement
5964
_MS8607_PT_CMD_TEMP_START = const(0x50) # Command to start temperature ADC measurement
6065
_MS8607_PT_CMD_READ_ADC = const(0x00) # Temp and pressure ADC read command
61-
# enum MS8607_humidity_resolution
62-
#:
63-
# MS8607_humidity_resolution_12b = 0,
64-
# MS8607_humidity_resolution_8b,
65-
# MS8607_humidity_resolution_10b,
66-
# MS8607_humidity_resolution_11b
67-
# ]
6866

6967

7068
class CV:
@@ -88,13 +86,20 @@ def is_valid(cls, value):
8886
return value in cls.string
8987

9088

91-
# class Flicker(CV):
92-
# """Options for ``flicker_detection_type``"""
89+
class HumidityResolution(CV):
90+
"""Options for `pressure_resolution`"""
9391

94-
# pass # pylint: disable=unnecessary-pass
92+
pass # pylint: disable=unnecessary-pass
9593

9694

97-
# Flicker.add_values((("FLICKER_100HZ", 0, 100, None), ("FLICKER_1000HZ", 1, 1000, None)))
95+
HumidityResolution.add_values(
96+
(
97+
("OSR_256", 0x01, 8, 0.003),
98+
("OSR_1024", 0x80, 10, 0.005),
99+
("OSR_2048", 0x81, 11, 0.009),
100+
("OSR_4096", 0x00, 12, 0.016),
101+
)
102+
)
98103

99104

100105
class PressureResolution(CV):
@@ -133,6 +138,9 @@ def __init__(self, i2c_bus):
133138
self.pressure_resolution = (
134139
PressureResolution.OSR_8192 # pylint:disable=no-member
135140
)
141+
self.humidity_resolution = (
142+
HumidityResolution.OSR_4096 # pylint:disable=no-member
143+
)
136144
self._pressure = None
137145
self._temperature = None
138146

@@ -147,7 +155,7 @@ def initialize(self):
147155

148156
for i in range(7):
149157
offset = 2 * i
150-
self._buffer[0] = _MS8607_PRESSURE_CALIB_ROM_ADDR + offset
158+
self._buffer[0] = _MS8607_PT_CALIB_ROM_ADDR + offset
151159
with self.pressure_i2c_device as i2c:
152160
i2c.write_then_readinto(
153161
self._buffer,
@@ -304,65 +312,54 @@ def relative_humidity(self):
304312
self._buffer[0] = _MS8607_READ_HUMIDITY_WO_HOLD_COMMAND
305313
with self.humidity_i2c_device as i2c:
306314
i2c.write(self._buffer, end=1)
307-
sleep(0.1) # _i2cPort->requestFrom((uint8_t)MS8607_HSENSOR_ADDR, 3U)
315+
sleep(0.016) # _i2cPort->requestFrom((uint8_t)MS8607_HSENSOR_ADDR, 3U)
308316

309317
with self.humidity_i2c_device as i2c:
310318
i2c.readinto(self._buffer, end=3)
311319

312-
# _adc = (buffer[0] << 8) | buffer[1]
313-
# crc = buffer[2]
314320
raw_humidity = unpack_from(">H", self._buffer)[0]
315321
crc_value = unpack_from(">B", self._buffer, offset=2)[0]
316322
humidity = (raw_humidity * (_MS8607_COEFF_MUL / (1 << 16))) + _MS8607_COEFF_ADD
317323
if not self._check_humidity_crc(raw_humidity, crc_value):
318324
raise RuntimeError("CRC Error reading humidity data")
319325
return humidity
320326

321-
# *adc = _adc
322-
323-
# return status
324-
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-
# }
327+
@property
328+
def humidity_resolution(self):
329+
"""The humidity sensor's measurement resolution"""
330+
return self._humidity_resolution
331+
332+
@humidity_resolution.setter
333+
def humidity_resolution(self, resolution):
334+
if not HumidityResolution.is_valid(resolution):
335+
raise AttributeError("humidity_resolution must be a Humidity Resolution")
336+
337+
self._humidity_resolution = resolution
338+
reg_value = self._read_hum_user_register()
339+
340+
# Clear the resolution bits
341+
reg_value &= ~_MS8607_HUM_USR_RESOLUTION_MASK
342+
# and then set them to the new value
343+
reg_value |= resolution & _MS8607_HUM_USR_RESOLUTION_MASK
344+
345+
self._set_hum_user_register(reg_value)
346+
347+
def _read_hum_user_register(self):
348+
349+
self._buffer[0] = _MS8607_HUM_CMD_READ_USR
350+
with self.humidity_i2c_device as i2c:
351+
i2c.write(self._buffer, end=1)
352+
353+
with self.humidity_i2c_device as i2c:
354+
i2c.readinto(self._buffer, end=1)
355+
356+
return self._buffer[0]
357+
358+
def _set_hum_user_register(self, register_value):
359+
self._buffer[0] = _MS8607_HUM_CMD_WRITE_USR
360+
self._buffer[1] = register_value
361+
with self.humidity_i2c_device as i2c:
362+
i2c.write(self._buffer, end=1)
366363

367364
@staticmethod
368365
def _check_humidity_crc(value, crc):
@@ -415,71 +412,10 @@ def _check_press_calibration_crc(calibration_int16s, crc):
415412
return n_rem == crc
416413

417414

418-
# read_temperature_pressure_humidity(float *t, float *p,
419-
420-
# set_humidity_resolution(enum MS8607_humidity_resolution res)
421-
# void set_humidity_i2c_master_mode(enum MS8607_humidity_i2c_master_mode mode)
422-
423-
# get_compensated_humidity(float temperature, float relative_humidity, float *compensated_humidity)
424-
425-
# /*
426-
# private:
427-
# bool hsensor_is_connected(void)
415+
# psensor_reset(void)
428416
# hsensor_reset(void)
429-
# hsensor_crc_check(uint16_t value, uint8_t crc)
430-
# hsensor_read_user_register(uint8_t *value)
431-
# hsensor_write_user_register(uint8_t value)
432-
# enum MS8607_humidity_i2c_master_mode hsensor_i2c_master_mode
433-
# hsensor_humidity_conversion_and_read_adc(uint16_t *adc)
434-
# hsensor_read_relative_humidity(float *humidity)
435-
# int err = set_humidity_resolution(MS8607_humidity_resolution_12b) # 12 bits
436-
# hsensor_conversion_time = HSENSOR_CONVERSION_TIME_12b
437-
# hsensor_i2c_master_mode = MS8607_i2c_no_hold
438-
# float humidity = getHumidity()
439-
# float temperature = getTemperature()
440-
# float compensated_RH= get_compensated_humidity(temperature, humidity, &compensated_RH)
441-
# 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);
417+
# void set_humidity_i2c_master_mode(enum MS8607_humidity_i2c_master_mode mode)
418+
# disable_heater(void)
419+
# enable_heater(void)
420+
# get_heater_status(enum MS8607_heater_status *heater)
421+
# get_dew_point(float temperature, float relative_humidity,

docs/conf.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@
2525
# Uncomment the below if you use native CircuitPython modules such as
2626
# digitalio, micropython and busio. List the modules you use. Without it, the
2727
# autodoc module docs will fail to generate with a warning.
28-
# autodoc_mock_imports = ["digitalio", "busio"]
28+
29+
autodoc_mock_imports = ["adafruit_bus_device"]
2930

3031

3132
intersphinx_mapping = {

0 commit comments

Comments
 (0)