Use BLE enabled Arduinos to collect Angle of Attack (AoA) information and display

Public Chat
Similar projects worth following
Using differential pressure develop a system to collect and display Angle of Attack (AoA) information in a light GA experimental aircraft. Research revealed that prior work has been performed by FAA and Embry Riddle, see FAA report DOT/FAA/TC-18/7.

Here is a good explanation of using Angle of Attack in backcounty flying from prolific YouTuber and aviator Backcountry 182.  See this section for demonstration of the standardized LED lighting scheme.


FAA Embry Riddle Study on Low cost AoA probe

Adobe Portable Document Format - 6.90 MB - 11/04/2023 at 14:36



2.0 x 1.5 in solder breadboard

Portable Network Graphics (PNG) - 411.01 kB - 11/11/2023 at 20:57



Neopixel Stick Mechanical Drawing

Portable Network Graphics (PNG) - 77.98 kB - 11/11/2023 at 13:08



Slide switch Mechanical Drawing

Adobe Portable Document Format - 34.42 kB - 11/11/2023 at 13:08



Garmin Calibration Notes

Adobe Portable Document Format - 281.44 kB - 11/04/2023 at 22:15


View all 7 files

  • 2 × Adafruit ESP32 Feather V2 - 8MB Flash + 2 MB PSRAM - STEMMA QT
  • 1 × NeoPixel Stick - 8 x 5050 RGBW LEDs - Cool White - ~6000K
  • 2 × MPX10DP Board Mount Pressure Sensors PRES SEN UNCOMP 10KPA Sensors / Pressure, Force
  • 1 × Adafruit FeatherWing OLED - 128x32 OLED
  • 1 × 2.0 x 1.5 in Solderable Breadboard

  • Pressure Sensor Concerns

    tklenke11/25/2023 at 23:03 0 comments

    The MPX10DP I purchased has an overpressure limit of 75 kPA, with an operation range of 0 to 10 kPA.  10 KPA = 1.45 PSI.  This is equivalent to 248 knots at standard atmosphere.  This seems fine, but I am concerned that the gauge reads in milliVolts with a range of 20 to 54.  I think the ESP A/D converter only reads in increments of 1 milliVolt.  This would mean that we would not have very good resolution.  

    If this is true, we'll need to consider maybe amplifying the voltage output so we can get a range more like 1000 to 2500 milliVolts, or 50x the output voltage.

    Ok...a little digging.  There seems to be a method to change the AtoD attenuation in the ESP32 chip.  But not clear if this will be easily done.  Will need to dig into the drivers for the ESP32 and look for variable ADC_ATTEN_11 for a start.

    Ok...github is awesome.  Found the header file arduino-esp32/cores/esp32/esp32-hal-adc.h

    and tried to compile my project with the following worked.


     So now need to carefully try this out with a low voltage signal and different attenuations. Humans can produce about 2.8 psi by blowing, or 19 kPa.  So we should be able to blow on the input and max out the pressure without overpressuring the sensor.

    typedef enum {
    } adc_attenuation_t;
     * Set the attenuation for all channels
     * Default is 11db
     * */
    void analogSetAttenuation(adc_attenuation_t attenuation);
     * Set the attenuation for particular pin
     * Default is 11db
     * */
    void analogSetPinAttenuation(uint8_t pin, adc_attenuation_t attenuation);

  • Preliminary Calculations

    tklenke11/25/2023 at 20:40 0 comments

    Intention is to set up entire system sending dummy data to get base programming completed prior to any functional testing.  Researched existing documents to get a reasonable base line for initial calculations and expected sensor readings.

    • alpha = f(Pfwd/P45)
      • See FAA TC18-7 Fig 33 to get following formula.  Going to set up for a quadratic formula in the future even though this one is linear.
        fRatio = fPfwd/fP45;
        #define A 0.0
        #define B -16.908083
        #define C 42.415008
        fAlpha = A*fRatio*fRatio + B*fRatio + C 
    • Output voltage vs Pressure from MPX10 documentation graph below.  Using linear fit at +25C gives following equation
    #define A .0419
    #define B -0.8279
    fPSI = A*fVolts + B

  • LED Strip Testing

    tklenke11/24/2023 at 16:47 0 comments

    See sketch Strip_Test.ino for testing performed.  I found that the brightness control on this strip is non-linear.  Brightness is a unit8, but at value over 70 a fully blue LED will start to decrease in brightness and at above 100 goes completely dark.

    For five levels of brightness the following seems to be a reasonable choice.

    uint8_t auBrightness[] = {1,3,5,8,25};

    And for colors I phoned a friend and got the following values for the ROYGBIV colors

    #define RED 255, 0, 0
    #define ORANGE 255, 80, 0
    #define YELLOW 255, 255, 0
    #define GREEN 0, 255, 0
    #define BLUE 0, 0, 255
    #define INDIGO 75, 0, 130
    #define VIOLET 148, 0, 211
    #define WHITE 255,255,255
    #define TRUE_WHITE 0, 0, 0, 255
    #define OFF   0, 0, 0, 0

    Here is the display at a brightness of 8 with the LEDs set to my initial AoA scheme [Red, Red, Orange, Blue, Yellow, Yellow, Green, Green]

  • Airfoil Research

    tklenke11/24/2023 at 16:01 0 comments

    Ideally we will collect data from the unit and calculate our cruise AoA, landing AoA (1.3 Vso) and stall speed Vso from empirical data.  But to get started I looked into the theoretical AoA information for the PA-18 Supercub, our intended test bed. 

    Found The Incomplete Guide to Airfoil Usage to determine the airfoil in use on a PA-18, which is the USA 35B.  Found NACA Report 233 on the airfoil as well as listing in Airfoil Tools

    Reynold's number

    Been a hot minute since I calculated Reynold's number, so asked to phone a friend.  Need to vet this but here's a start.  

    Certainly! Let's calculate the Reynolds numbers for the given velocities:

    1. At 35 mph (15.65 m/s): Re=(1.225 kg/m3)⋅(15.65 m/s)⋅(1.6 m)(1.81×10−5 Pa\cdotps)Re=(1.81×105 Pa\cdotps)(1.225 kg/m3)(15.65 m/s)(1.6 m)  Re≈1.76×106 Re1.76×10^6
    2. At 50 mph (22.35 m/s): Re=(1.225 kg/m3)⋅(22.35 m/s)⋅(1.6 m)(1.81×10−5 Pa\cdotps)Re=(1.81×105 Pa\cdotps)(1.225 kg/m3)(22.35 m/s)(1.6 m) Re≈2.51×106 Re2.51×10^6
    3. At 70 mph (31.29 m/s): Re=(1.225 kg/m3)⋅(31.29 m/s)⋅(1.6 m)(1.81×10−5 Pa\cdotps)Re=(1.81×105 Pa\cdotps)(1.225 kg/m3)(31.29 m/s)(1.6 m) Re≈3.51×106 Re3.51×10^
    4. At 110 mph (49.16 m/s): Re=(1.225 kg/m3)⋅(49.16 m/s)⋅(1.6 m)(1.81×10−5 Pa\cdotps)Re=(1.81×105 Pa\cdotps)(1.225 kg/m3)(49.16 m/s)(1.6 m) Re≈5.50×106 Re5.50×10^6

    So something like 2,000,000 to 6,000,000

    Airfoil Tools gives us the following plots for Re 500,000 and 1,000,000

  • OLED Display Layout Testing

    tklenke11/23/2023 at 15:07 0 comments

    OLED Testing available in the Sketch display_testing.ino

    Version 1 of the screen layout

    Splash Screen

    Font testing

    Line Spacing testing

  • Soldering Notes and OLED Wiring Mystery

    tklenke11/20/2023 at 16:12 0 comments

    Follow steps to solder connections:

    • Attached OLED wing to Feather using soldering notes provided by Adafruit.  Really needed a third hand.  My result is that the wing is slightly off parallel.  The side away from USB is slightly closer to the Feather.  This became beneficial as the 2mm screws available where only 6mm long.  This is not long enough to reach through both boards and into the enclosure if the board are parallel as they should be.
    • Soldered wires for LED strip and environmental board after the Wing and Feather connection was completed.  This was tricky to thread them between the two boards and up into the correct connections in the Feather board, but doable.  Used solid core 22 awg, With stranded wire it would have been a major pain.  Next time would recommend trying 24 awg.  22 awg seems like over kill.

    After making all connections, I was not able to successfully use the LED strip.  After some head scratching, I realized that I had connected the digital signal line to A4 on the Feather.  Turns out this is an INPUT only pin.  Duh.  So removed and soldered into A5.  Ops Chk OK!

  • Display Enclosure V1 Assembly

    tklenke11/20/2023 at 15:59 0 comments

    Following changes required to version 1 of the Display enclosure.

    • minimize standoff height
    • make walls to extend to the LED strip and OLED display
    • reduce wall thickness on LED strip standoffs on board side for clearance
    • move USB hole away from face
    • redesign the buttons
    • reduce OLED hole in width and height

    Holes in standoff etc work well for 2mm and at least a few turns of 2.3mm

    Used 2x5mm for LED to enclosure and 2.3 x 10mm for two holes of the Feather/Wing to the enclosure.  Really need longer 12mm or 14mm.

    Enclosure is serviceable as is.  See photos.  (Note: I did not yet install the side switch for power)

  • Gas Sensor Screw Up

    tklenke11/13/2023 at 22:41 0 comments

    I wanted to add CO monitoring to the display, as it should be very easy and would be another way to track CO.  I originally bought the Adafruit MiCS5524 CO, Alcohol and VOC Gas Sensor.  Turns out that chip is 5V and I don't have 5V available.  I could use USB voltage, which would require plugging in which I'd like to avoid.  Or I could get a voltage booster, like the PowerBoost 500 Basic - 5V USB Boost @ 500mA from 1.8V+.  Then I would have to do a voltage divider to ensure the output was within what the Feather can handle.  Doable.  But at that point, I could really just get a 3v VOC sensor.  

    3V compatible VOC sensor options:

    Adafruit sells the Bosch BME688 which also senses temperature, pressure and humidity.  Temperature and pressure would be nice.   Uses I2C.  Current consumption (peak) 3mA

    Another alternative is the Adafruit SGP40 Air Quality Sensor Breakout - VOC Index for $15.  I2C interface.  Current consumption 2.6mA.

    So, we need to make provisions to solder the gas sensor into the I2C connections that will be shared with the OLED display.

  • 3d Printing Notes

    tklenke11/11/2023 at 13:18 0 comments

    • 1.5mm = .060 in  min wall thickness
    • .6mm = .024 in  absolute min wall thickness
    • .3mm = .012 in  gap for loose fit
    • .15mm = .006 in  gap for tight fit
    • When 3D printing parts that will fit together, a clearance of about 0.3 mm for a loose fit and about 0.15 mm for a tight fit is recommended. The required clearance may vary slightly depending on the material and geometry.
    • A good minimum wall thickness for 3D printing PLA is 1.5 mm. The absolute minimum wall thickness a 3D printer can print is 0.6 mm.

  • Adafruit Notes

    tklenke11/09/2023 at 20:38 0 comments

View all 12 project logs

  • 1
    Construction of Probe

    Cut 2.0 x 1.5 breadboard lengthwise such that one piece had the center screw holes intact.  

    P1 is pressure side of pressure sensors.  P1 is port closest to Pin 4.  Pin 1 is the notched pin.  Solder pressure sensors to breadboard such that the P1 ports are towards the back of the enclosure so that the tubing has the greatest bend radius available.  This will mean that the sensors are soldered with pin one facing the front of the enclosure (front being the side with the pitot probe)

    Probe.ino has Pitot Pressure (Pfwd) voltage on Pin A2 and Angled Probe Pressure (P45) voltage on pin A3.

    Pressure Sensors current draw is 6 mAdc at 3v.  The Feather board voltage regulator can produce an excess 250mA after powering the ESP chip, enabling the Feather board to supply the 12 mA for the pressure sensors.

    This leaves us with the following connections.

    • Feather
      • Gnd - Pfwd and P45 pin 1
      • 3v - Pfwd and P45 pin 3
      • A2 - Pfwd Pin 2
      • A3 - P45 Pin 2
    • Pfwd
      • P1 connected to Pitot Tube barb with 4mm ID tubing
      • P2 left open to inside of enclosure
      • Pin 1,2,3 see above
      • Pin 4 - NC
    • P45
      • P1 connected to Angled plenum barb with 4mm ID tubing
      • P2 left open to inside of enclosure
      • Pin 1,2,3 see above
      • Pin 4 - NC
  • 2
    Construction of Display
    • Solder headers to OLED Wing.  Do not solder Wing to Feather yet
    • Make connections from NeoPixel Strip and Gas Sensor to OLED Wing
      • Wing to Feather
        • GND and 3V
        • SCL and SDA to connect I2C bus  
        • Buttons: 
          • Button A - A8 
          • Button B - A7 
          • Button C - A6
      • NeoPixel to Wing/Feather (note: solder to inside row of holes on the Wing)
        • Gnd - Gnd
        • Power - VBat
        • Data - A5
      • Gas Sensor to WIng/Feather (note: solder to inside row of holes on the Wing)
        • Gnd - Gnd
        • Vin to Feather 3V or Bat (if using BME633 breakout board)
        • SCK to Wing SCL
        • SDI to Wing SDA
    • Screw NeoPixel Strip, OLED Wing and Gas Sensor to enclosure
      • Test OLED Wing Buttons with Enclosure buttons.  Ensure that they are not pre-depressed or cannot be engaged.  Will not be able to make adjustments easily after the Feather is soldered to the WIng as the screws will be difficult to reach.  Longer screws may also be used if available, in which case you can solder the Feather to the Wing prior to screwing to the enclosure
    • Place Feather on OLED Wing (which has been attached to enclosure) and solder.

View all instructions

Enjoy this project?



Similar Projects

Does this project spark your interest?

Become a member to follow this project and never miss any updates