Hummingbird Flight Software
Flight software for the Hummingbird FCU quadcopter flight controller. Designed to run on the Teensy 4.1. Developed with VSCode+PlatformIO.
baro_altimeter.h
Go to the documentation of this file.
1 // ----------------------------------------------------------------------------
2 // BAROMETRIC ALTIMETER CLASS
3 //
4 // Code By: Michael Wrona
5 // Created: 5 Feb 2021
6 // ----------------------------------------------------------------------------
25 #ifndef BARO_ALTIMETER_H_
26 #define BARO_ALTIMETER_H_
27 
28 #define BARO_ALTIMETER_DEBUG
29 
30 
31 // Includes
32 #include <Wire.h>
33 #include <math.h>
34 #include "hummingbird_config.h"
35 #include "debugging.h"
36 #include "Adafruit_BMP3XX.h"
37 #include "filters/median_filter.h"
39 
40 
41 // Constants/config
42 constexpr float BARO_ALTIMETER_PRES_MAX = 108300.0f; // [Pa] Max. allowable atmos. pressure (~32inHg)
43 constexpr float BARO_ALTIMETER_PRES_MIN = 94800.0f; // [Pa] Min. allowable atmos. pressure (~28inHg)
44 constexpr float BARO_ALTIMETER_TEMP_MAX = 50.0f; // [C] Max. allowable atmos. temperature (122F)
45 constexpr float BARO_ALTIMETER_TEMP_MIN = -23.0f; // [C] Min. allowable atmos. temperature (-10F)
46 
47 
49 public Adafruit_BMP3XX
50 {
51  public:
52  BaroAltimeter();
53  bool ConnectToSensor(TwoWire *userWire = &Wire2);
55  uint8_t presOS = BMP3_NO_OVERSAMPLING, uint8_t tempOS = BMP3_NO_OVERSAMPLING,
56  uint8_t iirCoef = BMP3_IIR_FILTER_COEFF_3, uint8_t sensODR = BMP3_ODR_50_HZ);
57  bool Initialize();
58  bool SetMSLPres(float presMSL_Pa = 101325.0f);
59  // bool SetPresMedFiltWidth(uint8_t windowLen = 5);
60  // bool SetTempLPFFactor(float alpha = 0.60f);
61  // bool SetPresLPFFactor(float alpha = 0.985f);
62  bool ReadSensor();
63  float GetMSLPres();
64  float GetAltitudeMSL();
65  float GetAltitude();
66  float GetLaunchAltMSL();
67  float GetGroundPres();
68  float GetGroundTemp();
69  float GetPressure();
70  float GetTemp();
71  float GetVertSpeed();
72 
73  bool isMSLPSet; // True if MSL pressure is set, false if not
74  bool isConnected; // True if sensor connection began, false if not
75  bool isConfigured; // True if sensor params are set, false if not
76  bool isReady; // True if connected with ground-level pres and temp are set, false if not
77  // bool gotData; // True if a measurement was taken, false if not
78 
79  private:
80 
81  bool _ReadGroundPresTemp(uint8_t n, unsigned long measDelay);
82  bool _SetTakeoffAltitude();
83 
84  float _p; // [Pa] Current pressure (filtered)
85  float _pRaw; // [Pa] Unfiltered pressure
86  float _t; // [C] Current temperature (filtered)
87  float _tRaw; // [C] Unfiltered temperature
88  float _altMSL; // [m] Altitude above MSL
89  float _lastAltMSL; // [m] Previous altitude above MSL. Used to calculate vertical speed.
90  float _alt; // [m] Altitude above takeoff location
91  float _groundPres; // [Pa] Ground-level/takeoff altitude pressure
92  float _groundTemp; // [C] Ground-level/takeoff altitude temperature
93  float _groundAltMSL; // [m] Ground-level/takeoff altitude above sea level
94  float _mslPres; // [Pa] Pressure at MSL, typically obtained from airport METAR reports
95  float _vertSpeed; // [m/s] Vertical speed
96  unsigned long _lastMeasMillis; // [ms] Last measurement time, used to compute dt
97  unsigned long _currMeasMillis; // [ms] Current measurement time, used to compute dt
101 
102 };
103 
104 
105 
106 #endif // BARO_ALTIMETER_H_
constexpr float BARO_ALTIMETER_PRES_MIN
Definition: baro_altimeter.h:43
constexpr float BARO_ALTIMETER_PRES_MAX
Definition: baro_altimeter.h:42
constexpr float BARO_ALTIMETER_TEMP_MAX
Definition: baro_altimeter.h:44
constexpr float BARO_ALTIMETER_TEMP_MIN
Definition: baro_altimeter.h:45
Definition: baro_altimeter.h:50
float GetTemp()
Definition: baro_altimeter.cpp:316
bool SetMSLPres(float presMSL_Pa=101325.0f)
Definition: baro_altimeter.cpp:141
float GetLaunchAltMSL()
Definition: baro_altimeter.cpp:344
float GetGroundTemp()
Definition: baro_altimeter.cpp:337
bool ConnectToSensor(TwoWire *userWire=&Wire2)
Attempt to connect to the BMP388 pressure/temperature sensor by running Adafruit's BMP_3XX....
Definition: baro_altimeter.cpp:64
float _pRaw
Definition: baro_altimeter.h:85
bool ReadSensor()
Read raw pressure and temperature data from BMP388.
Definition: baro_altimeter.cpp:231
float _mslPres
Definition: baro_altimeter.h:94
MedianFilter _PresFastFilter
Definition: baro_altimeter.h:98
float GetAltitudeMSL()
Definition: baro_altimeter.cpp:365
float GetAltitude()
Definition: baro_altimeter.cpp:351
float _groundPres
Definition: baro_altimeter.h:91
BaroAltimeter()
This class encompasses all functions to create a barometric altimeter for the drone,...
Definition: baro_altimeter.cpp:26
bool isMSLPSet
Definition: baro_altimeter.h:73
float _lastAltMSL
Definition: baro_altimeter.h:89
unsigned long _lastMeasMillis
Definition: baro_altimeter.h:96
bool isConnected
Definition: baro_altimeter.h:74
bool ConfigureSensorParams(uint8_t presOS=BMP3_NO_OVERSAMPLING, uint8_t tempOS=BMP3_NO_OVERSAMPLING, uint8_t iirCoef=BMP3_IIR_FILTER_COEFF_3, uint8_t sensODR=BMP3_ODR_50_HZ)
Configure BMP388 oversampling, IIR filtering, and ODR.
Definition: baro_altimeter.cpp:95
float _vertSpeed
Definition: baro_altimeter.h:95
float _t
Definition: baro_altimeter.h:86
float _tRaw
Definition: baro_altimeter.h:87
LowPassFilter _PresSlowFilter
Definition: baro_altimeter.h:99
bool Initialize()
Initialize the altimeter class.
Definition: baro_altimeter.cpp:167
float _alt
Definition: baro_altimeter.h:90
bool _ReadGroundPresTemp(uint8_t n, unsigned long measDelay)
Measure the ground-level pressure and temperature by taking the average of a few readings.
Definition: baro_altimeter.cpp:405
float _altMSL
Definition: baro_altimeter.h:88
float _groundTemp
Definition: baro_altimeter.h:92
bool isReady
Definition: baro_altimeter.h:76
float GetMSLPres()
Definition: baro_altimeter.cpp:358
float GetVertSpeed()
Definition: baro_altimeter.cpp:323
float GetPressure()
Definition: baro_altimeter.cpp:309
bool _SetTakeoffAltitude()
Compute the altitude above MSL at the T/O location.
Definition: baro_altimeter.cpp:385
float _groundAltMSL
Definition: baro_altimeter.h:93
float _p
Definition: baro_altimeter.h:84
unsigned long _currMeasMillis
Definition: baro_altimeter.h:97
float GetGroundPres()
Definition: baro_altimeter.cpp:330
bool isConfigured
Definition: baro_altimeter.h:75
LowPassFilter _TempSlowFilter
Definition: baro_altimeter.h:100
This is a simple implementation of a discrete low pass filter to filter noisy signals.
Definition: low_pass_filter.h:25
Definition: median_filter.h:19