In this video lesson we create a portable altimeter that measures altitude above a base reference location. The device uses an arduino uno R4 Wifi, a BMP180 pressure sensor which is on the GY-87 module. For your convenience, we present the circuit diagram used below:

When using the breadvolt, or any battery power supply on a breadboard project, do not turn the power supply on while the Arduino is connected to USB, as you could generate voltage conflicts. It is an either or. If the USB is connected, the power supply should be OFF. Or if you are going to connect the USB, first turn off the power supply.
This is the code for this project, for your convenience.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 |
// ==================================================================== // DISCLAIMER: // This code is provided as-is for educational and experimental // purposes only. The author makes no representations or warranties of // any kind concerning the safety, suitability, or accuracy of this // code. Use at your own risk. The author assumes no liability for any // damages, system failures, security breaches, or network issues // resulting from the use or implementation of this script. // ==================================================================== #include <SPI.h> #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #include <Adafruit_BMP085.h> Adafruit_BMP085 BP; bool BMPconnected; bool haveBase = false; int butPin = 2; int butVal = 1; int butValOld = 1; float basePressure; float Height = 0; float HeightNow = 0; int feet; int inches; int screenWidth = 128; int screenHeight = 64; int oledReset = -1; #define SCREEN_ADDRESS 0x3C Adafruit_SSD1306 oled(screenWidth, screenHeight, &Wire, oledReset); void setup() { // put your setup code here, to run once: Serial.begin(9600); pinMode(butPin, INPUT_PULLUP); delay(250); BMPconnected = BP.begin(); if (BMPconnected == true) { Serial.println("BMP180 Found and Connected."); } if (BMPconnected == false) { Serial.println("BMP180 Not Found! Check Connections."); } oled.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS); oled.clearDisplay(); oled.setCursor(0, 12); oled.setTextColor(WHITE); oled.setTextSize(1); oled.println("Place the Deluxe "); oled.println("HeightOmatic at"); oled.println("Base Location, and"); oled.println("Press Go!"); oled.display(); } void loop() { // put your main code here, to run repeatedly: butVal = digitalRead(butPin); if (butVal == 1 && butValOld == 0) { basePressure=0; oled.clearDisplay(); oled.setCursor(0,12); oled.setTextSize(1); oled.setTextColor(WHITE); oled.println("WAIT . . ."); oled.display(); for (int i=1;i<=100;i=i+1){ basePressure=basePressure + BP.readPressure(); } basePressure = basePressure/100; haveBase = true; } butValOld = butVal; if (haveBase == true) { HeightNow = findHeight(basePressure); Height = .95 * Height + .05 * HeightNow; feet = Height; inches = (Height - feet) * 12; oled.clearDisplay(); oled.setCursor(0, 12); oled.setTextColor(WHITE); oled.setTextSize(1); oled.print(feet); oled.print(" Ft "); oled.print(inches); oled.println(" In"); oled.setTextSize(1); oled.println("Place the Deluxe "); oled.println("HeightOmatic at"); oled.println("Base Location, and"); oled.println("Press Go!"); oled.display(); delay(10); } } float findHeight(float p0) { float d; float T0 = 288.15; float L = .0065; float R = 8.3144598; float M = .0289644; float g = 9.8; float pH; pH = BP.readPressure(); float c = R * L / (M * g); d = T0 / L * (1 - pow((pH / p0), c)); d = d * 3.28084; return d; } |