22// FILE: MS5611.cpp
33// AUTHOR: Rob Tillaart
44// Erni - testing/fixes
5- // VERSION: 0.4.2
6- // PURPOSE: Arduino library for MS5611 temperature and pressure sensor
5+ // VERSION: 0.5.0
6+ // PURPOSE: Arduino library for MS5611 (I2C) temperature and pressure sensor
77// URL: https://github.com/RobTillaart/MS5611
88
99
@@ -64,7 +64,7 @@ bool MS5611::reset(uint8_t mathMode)
6464 uint32_t start = micros ();
6565
6666 // while loop prevents blocking RTOS
67- while (micros () - start < 2800 )
67+ while (micros () - start < 3000 ) // increased as first ROM values were missed.
6868 {
6969 yield ();
7070 delayMicroseconds (10 );
@@ -163,6 +163,12 @@ void MS5611::setOversampling(osr_t samplingRate)
163163}
164164
165165
166+ osr_t MS5611::getOversampling () const
167+ {
168+ return (osr_t ) _samplingRate;
169+ }
170+
171+
166172float MS5611::getTemperature () const
167173{
168174 if (_temperatureOffset == 0 ) return _temperature * 0.01 ;
@@ -185,18 +191,79 @@ float MS5611::getPressurePascal() const
185191 return _pressure + _pressureOffset * 100.0 ;
186192}
187193
194+ void MS5611::setPressureOffset (float offset)
195+ {
196+ _pressureOffset = offset;
197+ }
198+
199+
200+ float MS5611::getPressureOffset ()
201+ {
202+ return _pressureOffset;
203+ }
204+
205+
206+ void MS5611::setTemperatureOffset (float offset)
207+ {
208+ _temperatureOffset = offset;
209+ }
210+
211+
212+ float MS5611::getTemperatureOffset ()
213+ {
214+ return _temperatureOffset;
215+ }
216+
188217
189218// (from MS5837)
190219// https://www.mide.com/air-pressure-at-altitude-calculator
191220// https://community.bosch-sensortec.com/t5/Question-and-answers/How-to-calculate-the-altitude-from-the-pressure-sensor-data/qaq-p/5702 (stale link).
192221// https://en.wikipedia.org/wiki/Pressure_altitude
193222float MS5611::getAltitude (float airPressure)
194223{
195- float ratio = _pressure / airPressure;
224+ // _pressure is in Pascal (#44) and airPressure in mBar.
225+ float ratio = _pressure * 0.01 / airPressure;
196226 return 44307.694 * (1 - pow (ratio, 0.190284 ));
197227}
198228
199229
230+ float MS5611::getAltitudeFeet (float airPressure)
231+ {
232+ float ratio = _pressure * 0.01 / airPressure;
233+ return 145366.45 * (1 - pow (ratio, 0.190284 ));
234+ }
235+
236+
237+ int MS5611::getLastResult () const
238+ {
239+ return _result;
240+ }
241+
242+
243+ uint32_t MS5611::lastRead () const
244+ {
245+ return _lastRead;
246+ }
247+
248+
249+ uint32_t MS5611::getDeviceID () const
250+ {
251+ return _deviceID;
252+ }
253+
254+
255+ void MS5611::setCompensation (bool flag)
256+ {
257+ _compensation = flag;
258+ }
259+
260+
261+ bool MS5611::getCompensation ()
262+ {
263+ return _compensation;
264+ }
265+
266+
200267// EXPERIMENTAL
201268uint16_t MS5611::getManufacturer ()
202269{
@@ -215,6 +282,7 @@ uint16_t MS5611::getProm(uint8_t index)
215282 return readProm (index);
216283}
217284
285+ // DEVELOP
218286uint16_t MS5611::getCRC ()
219287{
220288 return readProm (7 ) & 0x0F ;
@@ -227,16 +295,16 @@ uint16_t MS5611::getCRC()
227295//
228296void MS5611::convert (const uint8_t addr, uint8_t bits)
229297{
230- // values from page 3 datasheet - MAX column (rounded up)
231- uint16_t del[5 ] = {600 , 1200 , 2300 , 4600 , 9100 };
232-
233298 uint8_t index = bits;
234299 if (index < 8 ) index = 8 ;
235300 else if (index > 12 ) index = 12 ;
236301 index -= 8 ;
237302 uint8_t offset = index * 2 ;
238303 command (addr + offset);
239304
305+ // values from page 3 datasheet - MAX column (rounded up)
306+ uint16_t del[5 ] = {600 , 1200 , 2300 , 4600 , 9100 };
307+
240308 uint16_t waitTime = del[index];
241309 uint32_t start = micros ();
242310 // while loop prevents blocking RTOS
@@ -317,12 +385,12 @@ void MS5611::initConstants(uint8_t mathMode)
317385 C[5 ] = 256 ; // Tref = C[5] * 2^8 | * 2^8
318386 C[6 ] = 1.1920928955E-7 ; // TEMPSENS = C[6] / 2^23 | / 2^23
319387
320- if (mathMode == 1 ) // Appnote version for pressure.
388+ if (mathMode == 1 ) // Appnote version for pressure.
321389 {
322- C[1 ] = 65536L ; // SENSt1
323- C[2 ] = 131072L ; // OFFt1
324- C[3 ] = 7.8125E-3 ; // TCS
325- C[4 ] = 1.5625e-2 ; // TCO
390+ C[1 ] = 65536L ; // SENSt1
391+ C[2 ] = 131072L ; // OFFt1
392+ C[3 ] = 7.8125E-3 ; // TCS
393+ C[4 ] = 1.5625e-2 ; // TCO
326394 }
327395}
328396
@@ -334,7 +402,7 @@ void MS5611::initConstants(uint8_t mathMode)
334402MS5607::MS5607 (uint8_t deviceAddress, TwoWire *wire)
335403 : MS5611(deviceAddress, wire)
336404{
337- };
405+ }
338406
339407
340408bool MS5607::begin ()
@@ -343,7 +411,8 @@ bool MS5607::begin()
343411 if (! isConnected ()) return false ;
344412
345413 return reset (1 ); // MS5607 has mathMode 1, see datasheet + initConstants.
346- };
414+ }
415+
347416
348417// -- END OF FILE --
349418
0 commit comments