Standalone Arduino Altimeter

15,404

33

31

Here is a standalone altimeter working with Arduino that you can use in RC project, hiking, cars... where you want :)

It shows on first screen the altittude, the temperature & the air pressure, and in the second, the minimum / maximum altitude reached.

Parts needed: (~12$)

  • An arduino board like a nano, pro mini or even AtTiny85 (depends on what you want, pro mini is lighter than nano and can works with an input voltage of 3.3v to 12v, perfect for light weight RC) 3.29$ on ebay
  • BMP280 chip temperature & barometric pressure sensor 1.84$ on ebay
  • An OLED display (0.96" I2C IIC Série 128X64) 5.32$ on ebay
  • Iron solder, tin and wires
  • A plastic case to put all in 1.50$ on ebay

Teacher Notes

Teachers! Did you use this instructable in your classroom?
Add a Teacher Note to share how you incorporated it into your lesson.

Step 1: The Wiring

The wiring is simple, the most "complicated" is to find the SCL and SDA pin on your arduino.

On the nano as on the photo, pin A4 is SDA and pin A5 is SCL.

On the Pro Mini, take a look at the picture, SDA is upside right to pin A2, and SCL upside right to pin A3.

Once your wiring is done, lets upload the sketch to the Arduino !

Step 2: The Program

Code explanations (full code below):

#include "U8glib.h"
#include "BMP280.h"

They are the 2 libraries you have to put inside Documents\Arduino\libraries\

#define P0 1021.97

This is where you calibrate the altimeter, changing this value. Once it's done, it's pretty accurate !

(by default it was 1013.25, i had to up it to 1021.97 to have the right altitude in my town)

U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NO_ACK);

Here you define the Oled screen type (128x64 etc...)

  u8g.drawStr( 5, 10, "Temp: ");
u8g.drawStr( 5, 30, "Bar : "); u8g.drawStr( 5, 50, "Alt : "); u8g.drawStr( 50, 10, sT); u8g.drawStr( 50, 30, sP); u8g.drawStr( 50, 50, sA);

Here the informations you want to display on first screen and their position ( Y, X, VALUE)

  dtostrf(A_MIN, 4, 2, sA_MIN);
dtostrf(A_MAX, 4, 2, sA_MAX); u8g.drawStr( 5, 20, "A Min: "); u8g.drawStr( 60, 20, sA_MIN); u8g.drawStr( 5, 45, "A Max: "); u8g.drawStr( 60, 45, sA_MAX);

Same for second screen

      if ( A > A_MAX) {
A_MAX = A; }
      if ( A < A_MIN || A_MIN == 0) {
        A_MIN = A;
      }

Here we update the minimum and maximun altitude stored

      do {
draw(T, P, A); } while ( u8g.nextPage() ); u8g.firstPage(); delay(1000);

Here, with the delay value (1000 in this case), you will stay 1 second on the first screen before switching to the second one. So change that if you want to customize display time :)

      do {
draw2(A_MIN, A_MAX); } while ( u8g.nextPage() ); u8g.firstPage(); delay(1000);

Same for second screen !

Hope it's clear, feel free to post a question in comments if needed !

Here is the full code:

#include "U8glib.h"
#include "BMP280.h" #include "Wire.h" #define P0 1021.97 //1013.25 BMP280 bmp; // OLED Type U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NO_ACK); char sT[20]; char sP[9]; char sA[9]; char sA_MIN[9]; char sA_MAX[9]; double A_MIN = 0; double A_MAX = 0; void draw(double T, double P, double A) { u8g.setFont(u8g_font_unifont); dtostrf(T, 4, 2, sT); dtostrf(P, 4, 2, sP); dtostrf(A, 4, 2, sA); u8g.drawStr( 5, 10, "Temp: "); u8g.drawStr( 5, 30, "Bar : "); u8g.drawStr( 5, 50, "Alt : "); u8g.drawStr( 50, 10, sT); u8g.drawStr( 50, 30, sP); u8g.drawStr( 50, 50, sA); } void draw2(double A_MIN, double A_MAX) { u8g.setFont(u8g_font_unifont); dtostrf(A_MIN, 4, 2, sA_MIN); dtostrf(A_MAX, 4, 2, sA_MAX); u8g.drawStr( 5, 20, "A Min: "); u8g.drawStr( 60, 20, sA_MIN); u8g.drawStr( 5, 45, "A Max: "); u8g.drawStr( 60, 45, sA_MAX); } void setup() { Serial.begin(9600); if (!bmp.begin()) { Serial.println("BMP init failed!"); while (1); } else Serial.println("BMP init success!"); bmp.setOversampling(4); u8g.setColorIndex(1); u8g.setFont(u8g_font_unifont); } void loop(void) { double T, P; char result = bmp.startMeasurment(); if (result != 0) { delay(result); result = bmp.getTemperatureAndPressure(T, P); if (result != 0) { double A = bmp.altitude(P, P0); if ( A > A_MAX) { A_MAX = A; } if ( A < A_MIN || A_MIN == 0) { A_MIN = A; } // Serial.print("T = \t"); Serial.print(T, 2); Serial.print(" degC\t"); // Serial.print("P = \t"); Serial.print(P, 2); Serial.print(" mBar\t"); // Serial.print("A = \t"); Serial.print(A, 2); Serial.println(" m"); u8g.firstPage(); do { draw(T, P, A); } while ( u8g.nextPage() ); u8g.firstPage(); delay(1000); do { draw2(A_MIN, A_MAX); } while ( u8g.nextPage() ); u8g.firstPage(); delay(1000); } else { Serial.println("Error."); } } else { Serial.println("Error."); } delay(100); }

Step 3: Now It's Up to You !

You can move form the breadboard to the plastic case with soldering all.

Then, put it on RC plane, RC quadcopter, RC helicopter..... or a water rocket !

Hope it was helpful and that you will send me a pic once it's done =)

Make It Fly Contest 2016

Participated in the
Make It Fly Contest 2016

Sensors Contest 2016

Participated in the
Sensors Contest 2016

3 People Made This Project!

Recommendations

  • Made with Math Contest

    Made with Math Contest
  • Multi-Discipline Contest

    Multi-Discipline Contest
  • Robotics Contest

    Robotics Contest

31 Discussions

None
steveflora

Question 3 months ago on Step 3

Question about the barometric pressure.

I'm assuming the 1013.25 is the nominal pressure at sea level. I live at 2800 feet. Is there a table or something you reference to get the nominal pressure for where I live?

Also

I'm interested in the feed back you go how the whole thing was mounted. My plan is to make a couple of these to mount in my land cruiser and 73 chevy pickup. I'm looking for what is available off the shelf that could mount nicely in both vehicles

Steve Flora
Middleton, Idaho (USA)

1 answer
None
arooster1steveflora

Answer 3 months ago

the local pressure readings will change over time due to weather fluxuaitons (high pressure systems, low pressure systems, etc.). You can get updated settings for your area from weather reports or search for the local airport's "METAR" (it's a condensed weather report for pilots). All aircraft set their alitimeters using the local pressure reading for the airport that they're taking off from or landing at.

None
Wookie01

Question 10 months ago

Hi, I am really keen to complete this project but I am very new to Arduino and C++.

No doubt this is something that experienced coders see every day, and I am sorry if it is frustrating that newbies don't understand it. :(
I have researched for days trying to solve this without reaching out, but it has defeated me.

I have downloaded the .ino file and libraries, and imported the libraries into my Arduino system.

When I try to compile the sketch I get the following error messages and I cannot determine where or why they are being generated?

In function 'void setup()':
standalone_altimeter.ino:56:7: error: 'class BMP280' has no member named 'setOversampling'
bmp.setOversampling(4);

In function 'void loop()':
standalone_altimeter.ino:65:21: error: 'class BMP280' has no member named 'startMeasurment'
char result = bmp.startMeasurment();

In the loop section I also have similar errors for
'getTemperatureAndPressure' and
'altitude'

If anyone is able to advise how to fix these errors I would be extremely grateful.

Thanks,
Graham

1 answer
None
Wookie01Wookie01

Answer 10 months ago

I have solved this, the problem was that the system was not loading the libraries supplied above, but was drawing them from the arduino stock library.

I was able to force the correct libraries and now it is completing verification.

Next step is to source an I2C OLED to complete the hardware setup, then it should be up and running hopefully

None
D6equj5

10 months ago on Step 3

For use in a bottle rocket, it would need to keep and hold the altitude reading at apogee to be read at recovery time.
Pseudo code:
Read alt every 1 millisecond
If alt is greater than last reading
Then drop last reading and keep this
reading
If alt is less than last reading
Then keep last reading for 5 minutes
Or until reset.

None
ku sungJ

Question 10 months ago

Hi, I want to use a BME sensor, insted of BMP180. What I need to change in the code ?
I want to graph the number of the front power
Thank you !

20181125_205622.jpg
None
gtavares21

1 year ago

Hi, I want to use a BME sensor, insted of BMP280. What I need to change in the code ? Thank you !

1 reply
None
Shoyungtavares21

Reply 1 year ago

Hi, didn't play with the BME280 but as i can see, not the same wiring, I2C instead. Should not be complicated, search in google how to wire the BME and which library it works with.

Then just update the code with the good library (and syntax function if there is changes) and it should work :)

None
x100iv5

2 years ago

Bit of delay but great project.

I am wondering though why my alt is showing -132.3.

I am around 36feet /8.59m above sea level = 1012.21hPa.

I took this hPa and changed the line

#define P0 1021.97 //1013.25 to #define P0 1012.21 //1013.25

uploaded and restarted and getting a negative alt number.

What have I done wrong, and no doubt I have. Thanks :)

1 reply
None
Shoyunx100iv5

Reply 2 years ago

Hi !

Try changing the #define P0 1021.97 //1013.25 untill you get the right alt, even if the value is quite silly.Maybe it's a silly sensor too ^^

None
PaulSkydive

2 years ago

Hi everyone, I'm trying to run this but I can't even get past the verification of the code. I'm very new to this and I must be doing something stupid, any ideas?

The error is

error: 'bmp' was not declared in this scope

if (!bmp.begin()) {

^

The first occurrence of the error is at line 4: BMP280 bmp;

but it continues anywhere "bmp" is mentioned.

Many thanks in advance, Paul

3 replies
None
ShoyunPaulSkydive

Reply 2 years ago

Hi Paul, you have this error because there is a problem with the "BMP280.h" library, verify that you have put the 2 libraries inside Documents\Arduino\libraries\ as in the Step 2: The program

None
PaulSkydiveShoyun

Reply 2 years ago

Thank you so much Shoyun! :-)

I was being stupid!

Thanks again

None
Shoyunalainn

Reply 2 years ago

Hi alainn, to calibrate the altimeter (if i understand you well) you have to play with the P0 value in the begining of the code: #define P0 1021.97

Change the 1021.97 value to match your real altitude, then it's calibrated and acurate :)

None
alainnShoyun

Reply 2 years ago

Hi Shoyun
you need a computer to do that
not very convenient
this one use a tactil switch
http://electro.olganet.com/2014/03/29/tiny-altimeter-oled/
but not convenient also
an encoder should be nice to set the QNH or QNE
so you should use your device as a true altimeter in a plane

None
Shoyunalainn

Reply 2 years ago

Hi ! You are right, you need a computer but once the setting is done if you stay at the same place it will be ok :)

For my purposes it was enough, maybe you need the ability to set up on the go, it may be possible to add it.

None
tmercados

3 years ago

Nice project

How could I change the delay to put a button?

1 reply
None
Shoyuntmercados

Reply 3 years ago

Hi, i don't undersand what you really want to do, sorry.