43
43
_MS8607_READ_HUMIDITY_WO_HOLD_COMMAND = const (0xF5 ) #
44
44
_MS8607_READ_SERIAL_FIRST_8BYTES_COMMAND = const (0xFA0F ) #
45
45
_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
49
46
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 )
50
54
51
55
_MS8607_PTSENSOR_ADDR = const (0x76 ) #
52
56
_MS8607_HSENSOR_ADDR = const (0x40 ) #
57
+
53
58
_MS8607_COEFF_MUL = const (125 ) #
54
59
_MS8607_COEFF_ADD = const (- 6 ) #
55
60
58
63
_MS8607_PT_CMD_PRESS_START = const (0x40 ) # Command to start pressure ADC measurement
59
64
_MS8607_PT_CMD_TEMP_START = const (0x50 ) # Command to start temperature ADC measurement
60
65
_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
- # ]
68
66
69
67
70
68
class CV :
@@ -88,13 +86,20 @@ def is_valid(cls, value):
88
86
return value in cls .string
89
87
90
88
91
- # class Flicker (CV):
92
- # """Options for ``flicker_detection_type` `"""
89
+ class HumidityResolution (CV ):
90
+ """Options for `pressure_resolution `"""
93
91
94
- # pass # pylint: disable=unnecessary-pass
92
+ pass # pylint: disable=unnecessary-pass
95
93
96
94
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
+ )
98
103
99
104
100
105
class PressureResolution (CV ):
@@ -133,6 +138,9 @@ def __init__(self, i2c_bus):
133
138
self .pressure_resolution = (
134
139
PressureResolution .OSR_8192 # pylint:disable=no-member
135
140
)
141
+ self .humidity_resolution = (
142
+ HumidityResolution .OSR_4096 # pylint:disable=no-member
143
+ )
136
144
self ._pressure = None
137
145
self ._temperature = None
138
146
@@ -147,7 +155,7 @@ def initialize(self):
147
155
148
156
for i in range (7 ):
149
157
offset = 2 * i
150
- self ._buffer [0 ] = _MS8607_PRESSURE_CALIB_ROM_ADDR + offset
158
+ self ._buffer [0 ] = _MS8607_PT_CALIB_ROM_ADDR + offset
151
159
with self .pressure_i2c_device as i2c :
152
160
i2c .write_then_readinto (
153
161
self ._buffer ,
@@ -304,65 +312,54 @@ def relative_humidity(self):
304
312
self ._buffer [0 ] = _MS8607_READ_HUMIDITY_WO_HOLD_COMMAND
305
313
with self .humidity_i2c_device as i2c :
306
314
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)
308
316
309
317
with self .humidity_i2c_device as i2c :
310
318
i2c .readinto (self ._buffer , end = 3 )
311
319
312
- # _adc = (buffer[0] << 8) | buffer[1]
313
- # crc = buffer[2]
314
320
raw_humidity = unpack_from (">H" , self ._buffer )[0 ]
315
321
crc_value = unpack_from (">B" , self ._buffer , offset = 2 )[0 ]
316
322
humidity = (raw_humidity * (_MS8607_COEFF_MUL / (1 << 16 ))) + _MS8607_COEFF_ADD
317
323
if not self ._check_humidity_crc (raw_humidity , crc_value ):
318
324
raise RuntimeError ("CRC Error reading humidity data" )
319
325
return humidity
320
326
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(®_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 )
366
363
367
364
@staticmethod
368
365
def _check_humidity_crc (value , crc ):
@@ -415,71 +412,10 @@ def _check_press_calibration_crc(calibration_int16s, crc):
415
412
return n_rem == crc
416
413
417
414
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)
428
416
# 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,
0 commit comments