11//
22// FILE: MS5611_SPI.cpp
33// AUTHOR: Rob Tillaart
4- // VERSION: 0.3.1
5- // PURPOSE: MS5611 (SPI) Temperature & Pressure library for Arduino
4+ // VERSION: 0.4.0
5+ // PURPOSE: Arduino library for MS5611 (SPI) temperature and pressure sensor
66// URL: https://github.com/RobTillaart/MS5611_SPI
7- //
8- // HISTORY: see changelog.md
97
108
119#include " MS5611_SPI.h"
@@ -96,7 +94,7 @@ bool MS5611_SPI::begin()
9694 digitalWrite (_clock, LOW);
9795 }
9896
99- return reset ();
97+ return reset (0 ); // MS5611 has mathMode 0, see datasheet + initConstants.
10098}
10199
102100
@@ -111,8 +109,9 @@ bool MS5611_SPI::reset(uint8_t mathMode)
111109{
112110 command (MS5611_CMD_RESET);
113111 uint32_t start = micros ();
112+
114113 // while loop prevents blocking RTOS
115- while (micros () - start < 3000 ) // increased as first ROM values were missed.
114+ while (micros () - start < 3000 ) // increased as first ROM values were missed.
116115 {
117116 yield ();
118117 delayMicroseconds (10 );
@@ -130,7 +129,7 @@ bool MS5611_SPI::reset(uint8_t mathMode)
130129 // C[7] == CRC - skipped.
131130 uint16_t tmp = readProm (reg);
132131 C[reg] *= tmp;
133- // _deviceID is a simple SHIFT XOR merge of PROM data
132+ // _deviceID is a SHIFT XOR merge of 7 PROM registers, reasonable unique
134133 _deviceID <<= 4 ;
135134 _deviceID ^= tmp;
136135 // Serial.println(readProm(reg));
@@ -147,16 +146,22 @@ int MS5611_SPI::read(uint8_t bits)
147146{
148147 // VARIABLES NAMES BASED ON DATASHEET
149148 // ALL MAGIC NUMBERS ARE FROM DATASHEET
149+
150150 convert (MS5611_CMD_CONVERT_D1, bits);
151+ if (_result) return _result;
151152 // NOTE: D1 and D2 seem reserved in MBED (NANO BLE)
152153 uint32_t _D1 = readADC ();
154+ if (_result) return _result;
155+
153156 convert (MS5611_CMD_CONVERT_D2, bits);
157+ if (_result) return _result;
154158 uint32_t _D2 = readADC ();
159+ if (_result) return _result;
155160
156161 // Serial.println(_D1);
157162 // Serial.println(_D2);
158163
159- // TEST VALUES - comment lines above
164+ // TEST VALUES - comment lines above
160165 // uint32_t _D1 = 9085466;
161166 // uint32_t _D2 = 8569150;
162167
@@ -218,13 +223,21 @@ float MS5611_SPI::getTemperature() const
218223}
219224
220225
226+ // milliBar
221227float MS5611_SPI::getPressure () const
222228{
223229 if (_pressureOffset == 0 ) return _pressure * 0.01 ;
224230 return _pressure * 0.01 + _pressureOffset;
225231}
226232
227233
234+ // Pascal SI-unit.
235+ float MS5611_SPI::getPressurePascal () const
236+ {
237+ if (_pressureOffset == 0 ) return _pressure;
238+ return _pressure + _pressureOffset * 100.0 ;
239+ }
240+
228241void MS5611_SPI::setPressureOffset (float offset)
229242{
230243 _pressureOffset = offset;
@@ -249,6 +262,25 @@ float MS5611_SPI::getTemperatureOffset()
249262}
250263
251264
265+ // (from MS5837)
266+ // https://www.mide.com/air-pressure-at-altitude-calculator
267+ // https://community.bosch-sensortec.com/t5/Question-and-answers/How-to-calculate-the-altitude-from-the-pressure-sensor-data/qaq-p/5702 (stale link).
268+ // https://en.wikipedia.org/wiki/Pressure_altitude
269+ float MS5611_SPI::getAltitude (float airPressure)
270+ {
271+ // _pressure is in Pascal (#44) and airPressure in mBar.
272+ float ratio = _pressure * 0.01 / airPressure;
273+ return 44307.694 * (1 - pow (ratio, 0.190284 ));
274+ }
275+
276+
277+ float MS5611_SPI::getAltitudeFeet (float airPressure)
278+ {
279+ float ratio = _pressure * 0.01 / airPressure;
280+ return 145366.45 * (1 - pow (ratio, 0.190284 ));
281+ }
282+
283+
252284int MS5611_SPI::getLastResult () const
253285{
254286 return _result;
@@ -291,6 +323,18 @@ uint16_t MS5611_SPI::getSerialCode()
291323 return readProm (7 ) >> 4 ;
292324}
293325
326+ // DEVELOP
327+ uint16_t MS5611_SPI::getProm (uint8_t index)
328+ {
329+ return readProm (index);
330+ }
331+
332+ // DEVELOP
333+ uint16_t MS5611_SPI::getCRC ()
334+ {
335+ return readProm (7 ) & 0x0F ;
336+ }
337+
294338
295339void MS5611_SPI::setSPIspeed (uint32_t speed)
296340{
@@ -311,23 +355,22 @@ bool MS5611_SPI::usesHWSPI()
311355}
312356
313357
314-
315358// ///////////////////////////////////////////////////
316359//
317- // PRIVATE
360+ // PROTECTED
318361//
319362void MS5611_SPI::convert (const uint8_t addr, uint8_t bits)
320363{
321- // values from page 3 datasheet - MAX column (rounded up)
322- uint16_t del[5 ] = {600 , 1200 , 2300 , 4600 , 9100 };
323-
324364 uint8_t index = bits;
325365 if (index < 8 ) index = 8 ;
326366 else if (index > 12 ) index = 12 ;
327367 index -= 8 ;
328368 uint8_t offset = index * 2 ;
329369 command (addr + offset);
330370
371+ // values from page 3 datasheet - MAX column (rounded up)
372+ uint16_t del[5 ] = {600 , 1200 , 2300 , 4600 , 9100 };
373+
331374 uint16_t waitTime = del[index];
332375 uint32_t start = micros ();
333376 // while loop prevents blocking RTOS
@@ -467,5 +510,12 @@ void MS5611_SPI::initConstants(uint8_t mathMode)
467510}
468511
469512
513+ // /////////////////////////////////////////////////////////////////
514+ //
515+ // DERIVED CLASSES
516+ //
517+ // TODO ?
518+
519+
470520// -- END OF FILE --
471521
0 commit comments