Skip to content

Commit e7c9196

Browse files
committed
humidity working
1 parent 803b381 commit e7c9196

File tree

1 file changed

+58
-39
lines changed

1 file changed

+58
-39
lines changed

adafruit_ms8607.py

Lines changed: 58 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -16,28 +16,28 @@
1616
1717
**Hardware:**
1818
19-
* `Adafruit AS7341 Breakout <https://www.adafruit.com/products/45XX>`_
19+
* `Adafruit AS7341 Breakout <https:#www.adafruit.com/products/45XX>`_
2020
2121
**Software and Dependencies:**
2222
2323
* Adafruit CircuitPython firmware for the supported boards:
24-
https://github.com/adafruit/circuitpython/releases
24+
https:#github.com/adafruit/circuitpython/releases
2525
26-
* Adafruit's Bus Device library: https://github.com/adafruit/Adafruit_CircuitPython_BusDevice
27-
* Adafruit's Register library: https://github.com/adafruit/Adafruit_CircuitPython_Register
26+
* Adafruit's Bus Device library: https:#github.com/adafruit/Adafruit_CircuitPython_BusDevice
27+
* Adafruit's Register library: https:#github.com/adafruit/Adafruit_CircuitPython_Register
2828
2929
"""
3030

3131
__version__ = "0.0.0-auto.0"
32-
__repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_MS8607.git"
32+
__repo__ = "https:#github.com/adafruit/Adafruit_CircuitPython_MS8607.git"
3333

3434

3535
from struct import unpack_from
3636
from time import sleep
3737
from micropython import const
3838
import adafruit_bus_device.i2c_device as i2c_device
3939

40-
# // HSENSOR device commands
40+
# # HSENSOR device commands
4141
_MS8607_RESET_COMMAND = const(0xFE) #
4242
_MS8607_READ_HUMIDITY_W_HOLD_COMMAND = const(0xE5) #
4343
_MS8607_READ_HUMIDITY_WO_HOLD_COMMAND = const(0xF5) #
@@ -47,14 +47,16 @@
4747
_MS8607_READ_USER_REG_COMMAND = const(0xE7) #
4848

4949
_MS8607_HSENSOR_ADDR = const(0x40) #
50+
_MS8607_COEFF_MUL = const(125) #
51+
_MS8607_COEFF_ADD = const(-6) #
5052

5153
# enum MS8607_humidity_resolution
5254
# {
5355
# MS8607_humidity_resolution_12b = 0,
5456
# MS8607_humidity_resolution_8b,
5557
# MS8607_humidity_resolution_10b,
5658
# MS8607_humidity_resolution_11b
57-
# };]
59+
# }]
5860

5961

6062
class MS8607Humidity:
@@ -81,50 +83,67 @@ def relative_humidity(self):
8183
self._buffer[0] = _MS8607_READ_HUMIDITY_WO_HOLD_COMMAND
8284
with self.i2c_device as i2c:
8385
i2c.write(self._buffer, end=1)
84-
sleep(0.1) # _i2cPort->requestFrom((uint8_t)MS8607_HSENSOR_ADDR, 3U);
86+
sleep(0.1) # _i2cPort->requestFrom((uint8_t)MS8607_HSENSOR_ADDR, 3U)
8587

8688
with self.i2c_device as i2c:
8789
i2c.readinto(self._buffer, end=3)
8890

89-
# _adc = (buffer[0] << 8) | buffer[1];
90-
# crc = buffer[2];
91-
raw_humidity = unpack_from(">H", self._buffer)
91+
# _adc = (buffer[0] << 8) | buffer[1]
92+
# crc = buffer[2]
93+
raw_humidity = unpack_from(">H", self._buffer)[0]
94+
crc_value = unpack_from(">B", self._buffer, offset=2)[0]
95+
humidity = (raw_humidity * (_MS8607_COEFF_MUL / (1 << 16))) + _MS8607_COEFF_ADD
96+
if not self._check_humidity_crc(raw_humidity, crc_value):
97+
raise RuntimeError("CRC Error reading humidity data")
98+
return humidity
9299

93-
# *humidity =
94-
# adc * HUMIDITY_COEFF_MUL / (1UL << 16) + HUMIDITY_COEFF_ADD;
95-
return raw_humidity
96-
# // compute CRC
97-
# uint8_t crc;
98-
# status = hsensor_crc_check(_adc, crc);
99-
# if (status != MS8607_status_ok)
100-
# return status;
100+
# *adc = _adc
101101

102-
# *adc = _adc;
102+
# return status
103103

104-
# return status;
104+
@staticmethod
105+
def _check_humidity_crc(value, crc):
106+
polynom = 0x988000 # x^8 + x^5 + x^4 + 1
107+
msb = 0x800000
108+
mask = 0xFF8000
109+
result = value << 8 # Pad with zeros as specified in spec
110+
111+
while msb != 0x80:
112+
# Check if msb of current value is 1 and apply XOR mask
113+
if result & msb:
114+
result = ((result ^ polynom) & mask) | (result & ~mask)
115+
116+
# Shift by one
117+
msb >>= 1
118+
mask >>= 1
119+
polynom >>= 1
120+
121+
if result == crc:
122+
return True
123+
return False
105124

106125

107126
# read_temperature_pressure_humidity(float *t, float *p,
108127

109-
# set_humidity_resolution(enum MS8607_humidity_resolution res);
110-
# void set_humidity_i2c_master_mode(enum MS8607_humidity_i2c_master_mode mode);
128+
# set_humidity_resolution(enum MS8607_humidity_resolution res)
129+
# void set_humidity_i2c_master_mode(enum MS8607_humidity_i2c_master_mode mode)
111130

112-
# get_compensated_humidity(float temperature, float relative_humidity, float *compensated_humidity);
131+
# get_compensated_humidity(float temperature, float relative_humidity, float *compensated_humidity)
113132

114133
# /*
115134
# private:
116-
# bool hsensor_is_connected(void);
117-
# hsensor_reset(void);
118-
# hsensor_crc_check(uint16_t value, uint8_t crc);
119-
# hsensor_read_user_register(uint8_t *value);
120-
# hsensor_write_user_register(uint8_t value);
121-
# enum MS8607_humidity_i2c_master_mode hsensor_i2c_master_mode;
122-
# hsensor_humidity_conversion_and_read_adc(uint16_t *adc);
123-
# hsensor_read_relative_humidity(float *humidity);
124-
# int err = set_humidity_resolution(MS8607_humidity_resolution_12b); // 12 bits
125-
# hsensor_conversion_time = HSENSOR_CONVERSION_TIME_12b;
126-
# hsensor_i2c_master_mode = MS8607_i2c_no_hold;
127-
# float humidity = getHumidity();
128-
# float temperature = getTemperature();
129-
# float compensated_RH= get_compensated_humidity(temperature, humidity, &compensated_RH);
130-
# float dew_point = get_dew_point(temperature, humidity, &dew_point);
135+
# bool hsensor_is_connected(void)
136+
# hsensor_reset(void)
137+
# hsensor_crc_check(uint16_t value, uint8_t crc)
138+
# hsensor_read_user_register(uint8_t *value)
139+
# hsensor_write_user_register(uint8_t value)
140+
# enum MS8607_humidity_i2c_master_mode hsensor_i2c_master_mode
141+
# hsensor_humidity_conversion_and_read_adc(uint16_t *adc)
142+
# hsensor_read_relative_humidity(float *humidity)
143+
# int err = set_humidity_resolution(MS8607_humidity_resolution_12b) # 12 bits
144+
# hsensor_conversion_time = HSENSOR_CONVERSION_TIME_12b
145+
# hsensor_i2c_master_mode = MS8607_i2c_no_hold
146+
# float humidity = getHumidity()
147+
# float temperature = getTemperature()
148+
# float compensated_RH= get_compensated_humidity(temperature, humidity, &compensated_RH)
149+
# float dew_point = get_dew_point(temperature, humidity, &dew_point)

0 commit comments

Comments
 (0)