Adafruit MS8607 Library
Adafruit_MS8607.h
Go to the documentation of this file.
1 
79 #ifndef __MS8607_H__
80 #define __MS8607_H__
81 
82 #include "Arduino.h"
83 #include <Adafruit_BusIO_Register.h>
84 #include <Adafruit_I2CDevice.h>
85 #include <Adafruit_Sensor.h>
86 #include <Wire.h>
87 
91 #define MS8607_PT_ADDRESS \
92  0x76
93 #define MS8607_HUM_ADDRESS \
94  0x40
95 
96 // HSENSOR device commands
97 #define HSENSOR_RESET_COMMAND 0xFE
98 #define HSENSOR_READ_HUMIDITY_W_HOLD_COMMAND \
99  0xE5
100 #define HSENSOR_READ_HUMIDITY_WO_HOLD_COMMAND \
101  0xF5
102 #define HSENSOR_READ_SERIAL_FIRST_8BYTES_COMMAND \
103  0xFA0F
104 #define HSENSOR_READ_SERIAL_LAST_6BYTES_COMMAND \
105  0xFCC9
106 #define HSENSOR_WRITE_USER_REG_COMMAND 0xE6
107 #define HSENSOR_READ_USER_REG_COMMAND 0xE7
108 
109 // Processing constants
110 #define HSENSOR_TEMPERATURE_COEFFICIENT \
111  (float)(-0.15)
112 #define HSENSOR_CONSTANT_A (float)(8.1332)
113 #define HSENSOR_CONSTANT_B (float)(1762.39)
114 #define HSENSOR_CONSTANT_C (float)(235.66)
115 
116 // Coefficients for temperature computation
117 #define TEMPERATURE_COEFF_MUL (175.72)
118 #define TEMPERATURE_COEFF_ADD (-46.85)
119 
120 // Coefficients for relative humidity computation
121 #define HUMIDITY_COEFF_MUL (125)
122 #define HUMIDITY_COEFF_ADD (-6)
123 
124 // Conversion timings
125 #define HSENSOR_CONVERSION_TIME_12b 16
126 #define HSENSOR_CONVERSION_TIME_10b 5
127 #define HSENSOR_CONVERSION_TIME_8b 3
128 #define HSENSOR_CONVERSION_TIME_11b 9
129 
130 // HSENSOR User Register masks and bit position
131 #define HSENSOR_USER_REG_RESOLUTION_MASK 0x81
132 #define HSENSOR_USER_REG_END_OF_BATTERY_MASK \
133  0x40
134 #define HSENSOR_USER_REG_ENABLE_ONCHIP_HEATER_MASK \
135  0x4
136 #define HSENSOR_USER_REG_DISABLE_OTP_RELOAD_MASK \
137  0x2
138 
139 #define MS8607_RH_ADDRESS (0x40)
140 #define MS8607_RH_LSB \
141  0.0019073486328125;
142 // PSENSOR commands
144 #define PROM_ADDRESS_READ_ADDRESS_0 0xA0
145 
146 /* Pressure & Temperature commands */
147 #define P_T_RESET 0x1E
148 #define CONVERT_D1_OSR_256 0x40
149 #define CONVERT_D1_OSR_512 0x42
150 #define CONVERT_D1_OSR_1024 0x44
151 #define CONVERT_D1_OSR_2048 0x46
152 #define CONVERT_D1_OSR_4096 0x48
153 #define CONVERT_D1_OSR_8192 0x4A
154 #define CONVERT_D2_OSR_256 0x50
155 #define CONVERT_D2_OSR_512 0x52
156 #define CONVERT_D2_OSR_1024 0x54
157 #define CONVERT_D2_OSR_2048 0x56
158 #define CONVERT_D2_OSR_4096 0x58
159 #define CONVERT_D2_OSR_8192 0x5A
160 #define ADC_READ 0x00
161 /* PROM READ P&T is from 0xA0 to 0xAE. Not sure whether or not to add */
162 
163 /* Commands for relative humidity */
164 #define HUM_RESET 0xFE
165 #define HUM_WRITE_REGISTER 0xE6
166 #define HUM_READ_REGISTER 0xE7
167 #define HUM_MEASURE_RH_HOLD \
168  0xE5
169 #define HUM_MEASURE_RH_NO_HOLD \
170  0xF5
171 /* PROM READ RH is from 0xA0 to 0xAE. Not sure whether or not to add */
172 
173 #define PSENSOR_RESET_COMMAND 0x1E
174 #define PSENSOR_START_PRESSURE_ADC_CONVERSION \
175  0x40
176 #define PSENSOR_START_TEMPERATURE_ADC_CONVERSION \
177  0x50
178 #define PSENSOR_READ_ADC 0x00
179 
180 
184 typedef enum {
192 
197 typedef enum {
198  MS8607_HUMIDITY_RESOLUTION_OSR_12b = 0x00,
199  MS8607_HUMIDITY_RESOLUTION_OSR_11b = 0x81,
200  MS8607_HUMIDITY_RESOLUTION_OSR_10b = 0x80,
201  MS8607_HUMIDITY_RESOLUTION_OSR_8b = 0x01,
203 
208 typedef enum {
209  MS8607_I2C_HOLD = 0xE5,
210  MS8607_I2C_NO_HOLD = 0xF5,
212 
213 class Adafruit_MS8607;
214 
215 #define HSENSOR_READ_HUMIDITY_W_HOLD_COMMAND \
216  0xE5
217 #define HSENSOR_READ_HUMIDITY_WO_HOLD_COMMAND \
218  0xF5
219 
224 class Adafruit_MS8607_Temp : public Adafruit_Sensor {
225 public:
229  Adafruit_MS8607_Temp(Adafruit_MS8607 *parent) { _theMS8607 = parent; }
230 
231  bool getEvent(sensors_event_t *);
232  void getSensor(sensor_t *);
233 
234 private:
235  int _sensorID = 0x8600;
236  Adafruit_MS8607 *_theMS8607 = NULL;
237 };
243 class Adafruit_MS8607_Pressure : public Adafruit_Sensor {
244 public:
247  Adafruit_MS8607_Pressure(Adafruit_MS8607 *parent) { _theMS8607 = parent; }
248 
249  bool getEvent(sensors_event_t *);
250  void getSensor(sensor_t *);
251 
252 private:
253  int _sensorID = 0x8601;
254  Adafruit_MS8607 *_theMS8607 = NULL;
255 };
256 
262 class Adafruit_MS8607_Humidity : public Adafruit_Sensor {
263 public:
266  Adafruit_MS8607_Humidity(Adafruit_MS8607 *parent) { _theMS8607 = parent; }
267 
268  bool getEvent(sensors_event_t *);
269  void getSensor(sensor_t *);
270 
271 private:
272  int _sensorID = 0x8602;
273  Adafruit_MS8607 *_theMS8607 = NULL;
274 };
275 
280 public:
281  Adafruit_MS8607(void);
282  ~Adafruit_MS8607(void);
283 
284  bool begin(TwoWire *wire = &Wire, int32_t sensor_id = 0);
285  bool init(int32_t sensor_id);
286 
287  bool reset(void);
288 
289  ms8607_humidity_resolution_t getHumidityResolution(void);
290  bool setHumidityResolution(ms8607_humidity_resolution_t res);
291 
292  ms8607_pressure_resolution_t getPressureResolution(void);
293  bool setPressureResolution(ms8607_pressure_resolution_t res);
294 
295  bool enableHumidityClockStretching(bool enable_stretching);
296 
297  bool getEvent(sensors_event_t *pressure, sensors_event_t *temp,
298  sensors_event_t *humidity);
299  Adafruit_Sensor *getTemperatureSensor(void);
300  Adafruit_Sensor *getPressureSensor(void);
301  Adafruit_Sensor *getHumiditySensor(void);
302 
303 protected:
304  // uint16_t _sensorid_presure; ///< ID number for pressure
305  uint16_t _sensorid_temp;
308 
309  Adafruit_I2CDevice *pt_i2c_dev = NULL;
310  Adafruit_I2CDevice *hum_i2c_dev =
312  NULL;
313 
314  Adafruit_MS8607_Temp *temp_sensor = NULL;
315  Adafruit_MS8607_Pressure *pressure_sensor =
316  NULL;
317  Adafruit_MS8607_Humidity *humidity_sensor =
318  NULL;
319 
320 private:
321  bool _read(void);
322  bool _read_humidity(void);
323  bool _psensor_crc_check(uint16_t *n_prom, uint8_t crc);
324  bool _hsensor_crc_check(uint16_t value, uint8_t crc);
325 
326  bool _fetch_temp_calibration_values(void);
327  uint8_t _read_humidity_user_register(void);
328  bool _write_humidity_user_register(uint8_t new_reg_value);
329 
330  friend class Adafruit_MS8607_Temp;
331  friend class Adafruit_MS8607_Pressure;
333  friend class Adafruit_MS8607_Humidity;
335 
337  void fillTempEvent(sensors_event_t *temp, uint32_t timestamp);
338  void fillPressureEvent(sensors_event_t *temp, uint32_t timestamp);
339  void fillHumidityEvent(sensors_event_t *humidity, uint32_t timestamp);
340 
341  void _applyTemperatureCorrection(void);
342  bool _applyPTCorrections(int32_t raw_temp, int32_t raw_pressure);
343 
344  float _pressure,
345  _temperature,
346  _humidity;
347  ms8607_pressure_resolution_t psensor_resolution_osr;
348  uint16_t press_sens, press_offset, press_sens_temp_coeff,
349  press_offset_temp_coeff, ref_temp,
350  temp_temp_coeff;
352  _hum_sensor_i2c_read_mode;
353 };
355 #endif
356 /*
357  boolean humidityHasBeenRead = true;
358  boolean pressureHasBeenRead = true;
359  boolean temperatureHasBeenRead = true;
360  bool hsensor_read_user_register(uint8_t *value);
361  bool hsensor_write_user_register(uint8_t value);
362  bool hsensor_reset(void);
363  bool psensor_reset(void);
364 
365 */
bool getEvent(sensors_event_t *)
Gets the pressure as a standard sensor event.
Definition: Adafruit_MS8607.cpp:366
Definition: Adafruit_MS8607.h:279
Adafruit_MS8607_Humidity(Adafruit_MS8607 *parent)
Create an Adafruit_Sensor compatible object for the Humidity sensor.
Definition: Adafruit_MS8607.h:266
Adafruit Unified Sensor interface for the temperature sensor component of the MS8607.
Definition: Adafruit_MS8607.h:224
bool getEvent(sensors_event_t *pressure, sensors_event_t *temp, sensors_event_t *humidity)
Gets the humidity sensor and temperature values as sensor events.
Definition: Adafruit_MS8607.cpp:272
2
Definition: Adafruit_MS8607.h:187
Adafruit_MS8607_Pressure(Adafruit_MS8607 *parent)
Create an Adafruit_Sensor compatible object for the Pressure sensor.
Definition: Adafruit_MS8607.h:247
Adafruit_MS8607_Temp(Adafruit_MS8607 *parent)
Create an Adafruit_Sensor compatible object for the temperature sensor.
Definition: Adafruit_MS8607.h:229
ms8607_humidity_resolution_t
Options for setHumidityResolution.
Definition: Adafruit_MS8607.h:197
3
Definition: Adafruit_MS8607.h:188
5
Definition: Adafruit_MS8607.h:190
1
Definition: Adafruit_MS8607.h:186
Adafruit Unified Sensor interface for the pressure sensor component of the MS8607.
Definition: Adafruit_MS8607.h:243
void getSensor(sensor_t *)
Gets the sensor_t object describing the MS8607&#39;s pressure sensor.
Definition: Adafruit_MS8607.cpp:315
uint16_t _sensorid_humidity
ID number for humidity.
Definition: Adafruit_MS8607.h:307
uint16_t _sensorid_temp
ID number for temperature.
Definition: Adafruit_MS8607.h:305
4
Definition: Adafruit_MS8607.h:189
0
Definition: Adafruit_MS8607.h:185
Adafruit Unified Sensor interface for the pressure sensor component of the MS8607.
Definition: Adafruit_MS8607.h:262
uint16_t _sensorid_pressure
ID number for pressure.
Definition: Adafruit_MS8607.h:306
ms8607_hum_clock_stretch_t
Options for I2C clock stretch for humidity readings.
Definition: Adafruit_MS8607.h:208
ms8607_pressure_resolution_t
Pressure sensor resolution options.
Definition: Adafruit_MS8607.h:184