67
67
# ]
68
68
69
69
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
72
120
73
121
74
122
:param ~busio.I2C i2c_bus: The I2C bus the MS8607 is connected to.
@@ -82,7 +130,9 @@ def __init__(self, i2c_bus):
82
130
self ._buffer = bytearray (4 )
83
131
self .reset ()
84
132
self .initialize ()
85
- self ._psensor_resolution_osr = 5
133
+ self .pressure_resolution = (
134
+ PressureResolution .OSR_8192 # pylint:disable=no-member
135
+ )
86
136
self ._pressure = None
87
137
self ._temperature = None
88
138
@@ -141,6 +191,21 @@ def _scale_temp_pressure(self, raw_temperature, raw_pressure):
141
191
142
192
self ._pressure = ((((raw_pressure * sensitivity ) >> 21 ) - offset ) >> 15 ) / 100
143
193
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
+
144
209
@staticmethod
145
210
def _corrections (initial_temp , delta_temp ):
146
211
# # Second order temperature compensation
@@ -177,14 +242,15 @@ def _pressure_offset(self, delta_temp):
177
242
def _read_temp_pressure (self ):
178
243
179
244
# First read temperature
245
+
180
246
cmd = self ._psensor_resolution_osr * 2
181
247
cmd |= _MS8607_PT_CMD_TEMP_START
182
248
self ._buffer [0 ] = cmd
183
249
with self .pressure_i2c_device as i2c :
184
250
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 )
188
254
self ._buffer [0 ] = _MS8607_PT_CMD_READ_ADC
189
255
with self .pressure_i2c_device as i2c :
190
256
i2c .write_then_readinto (
@@ -202,7 +268,7 @@ def _read_temp_pressure(self):
202
268
with self .pressure_i2c_device as i2c :
203
269
i2c .write (self ._buffer , end = 1 )
204
270
205
- sleep (0.18 )
271
+ sleep (integration_time )
206
272
207
273
self ._buffer [0 ] = _MS8607_PT_CMD_READ_ADC
208
274
with self .pressure_i2c_device as i2c :
@@ -256,6 +322,48 @@ def relative_humidity(self):
256
322
257
323
# return status
258
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(®_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
+
259
367
@staticmethod
260
368
def _check_humidity_crc (value , crc ):
261
369
polynom = 0x988000 # x^8 + x^5 + x^4 + 1
@@ -331,3 +439,47 @@ def _check_press_calibration_crc(calibration_int16s, crc):
331
439
# float temperature = getTemperature()
332
440
# float compensated_RH= get_compensated_humidity(temperature, humidity, &compensated_RH)
333
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);
0 commit comments