Basic program to read temperature and pressure data from BMP-180 altimeter, convert the temperature into Centigrade and Fahrenheit, and average pressure for highest precision. Use pressure to obtain altitude in meters and feet. Display all to four 4-digit eight-segment bubble displays.

Dependencies:   mbed

Dependents:   GloboMet

Committer:
onehorse
Date:
Thu Jul 03 20:05:55 2014 +0000
Revision:
0:06dc60296e6e
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
onehorse 0:06dc60296e6e 1 #include "mbed.h"
onehorse 0:06dc60296e6e 2 #include "BMP180.h"
onehorse 0:06dc60296e6e 3 #include "HT16K33.h"
onehorse 0:06dc60296e6e 4
onehorse 0:06dc60296e6e 5 #define BMP180_ADDRESS 0x77<<1
onehorse 0:06dc60296e6e 6
onehorse 0:06dc60296e6e 7 uint32_t delt_t, count, tempcount;
onehorse 0:06dc60296e6e 8 float temperature, pressure, temppress, altitude;
onehorse 0:06dc60296e6e 9
onehorse 0:06dc60296e6e 10 DigitalOut myled(LED1);
onehorse 0:06dc60296e6e 11
onehorse 0:06dc60296e6e 12 BMP180 bmp180; // initialize BMP-180 altimeter
onehorse 0:06dc60296e6e 13
onehorse 0:06dc60296e6e 14 HT16K33 led; // initialize bubble display
onehorse 0:06dc60296e6e 15
onehorse 0:06dc60296e6e 16 Timer t;
onehorse 0:06dc60296e6e 17
onehorse 0:06dc60296e6e 18 Serial pc(USBTX, USBRX); // tx, rx
onehorse 0:06dc60296e6e 19
onehorse 0:06dc60296e6e 20 int main() {
onehorse 0:06dc60296e6e 21
onehorse 0:06dc60296e6e 22 t.start();
onehorse 0:06dc60296e6e 23
onehorse 0:06dc60296e6e 24 led.initHT16K33(); // initialize bubble display
onehorse 0:06dc60296e6e 25 led.clearDsplay(display1); // clear bubble display1
onehorse 0:06dc60296e6e 26 led.clearDsplay(display2); // clear bubble display2
onehorse 0:06dc60296e6e 27 led.clearDsplay(display3); // clear bubble display1
onehorse 0:06dc60296e6e 28 led.clearDsplay(display4); // clear bubble display2
onehorse 0:06dc60296e6e 29
onehorse 0:06dc60296e6e 30 // Read the WHO_AM_I register of the BMP-180, this is a good test of communication
onehorse 0:06dc60296e6e 31 uint8_t c = bmp180.readByte(BMP180_ADDRESS, BMP180_WHO_AM_I);
onehorse 0:06dc60296e6e 32 if(c == 0x55) {
onehorse 0:06dc60296e6e 33
onehorse 0:06dc60296e6e 34 pc.printf("BMP-180 is 0x%x\n\r", c);
onehorse 0:06dc60296e6e 35 pc.printf("BMP-180 should be 0x55\n\r");
onehorse 0:06dc60296e6e 36 pc.printf("BMP-180 online...\n\r");
onehorse 0:06dc60296e6e 37
onehorse 0:06dc60296e6e 38 bmp180.BMP180Calibration();
onehorse 0:06dc60296e6e 39 pc.printf("BMP-180 calibration complete...\n\r");
onehorse 0:06dc60296e6e 40 }
onehorse 0:06dc60296e6e 41 else
onehorse 0:06dc60296e6e 42 {
onehorse 0:06dc60296e6e 43 pc.printf("BMP-180 is 0x%x\n\r", c);
onehorse 0:06dc60296e6e 44 pc.printf("BMP-180 should be 0x55\n\r");
onehorse 0:06dc60296e6e 45 while(1); // idle here forever
onehorse 0:06dc60296e6e 46 }
onehorse 0:06dc60296e6e 47
onehorse 0:06dc60296e6e 48 /////////////////////////////////////////////////
onehorse 0:06dc60296e6e 49 // main
onehorse 0:06dc60296e6e 50 /////////////////////////////////////////////////
onehorse 0:06dc60296e6e 51
onehorse 0:06dc60296e6e 52 while (1) {
onehorse 0:06dc60296e6e 53
onehorse 0:06dc60296e6e 54 // Average over the display duty cycle to get the best pressure and altitude resolution
onehorse 0:06dc60296e6e 55 // The sample read time is on the order of 30 ms at the highest resolution using OSS = 3
onehorse 0:06dc60296e6e 56 // Averaging over the display duty cycle is equivalent to averaging about 500/30 ~ 16 times
onehorse 0:06dc60296e6e 57 // per display output. If this is too much averaging, one can always reduce the display duty cycle
onehorse 0:06dc60296e6e 58
onehorse 0:06dc60296e6e 59 temperature = (float)bmp180.BMP180GetTemperature()/10.0f; // Get temperature from BMP-180 in degrees C
onehorse 0:06dc60296e6e 60 temppress += (float)bmp180.BMP180GetPressure(); // Get pressure from BMP-180 in Pa
onehorse 0:06dc60296e6e 61 tempcount++;
onehorse 0:06dc60296e6e 62
onehorse 0:06dc60296e6e 63 // Serial print and/or display at 0.5 s rate independent of data rates
onehorse 0:06dc60296e6e 64 delt_t = t.read_ms() - count;
onehorse 0:06dc60296e6e 65 if (delt_t > 500) { // update LCD once per half-second independent of read rate
onehorse 0:06dc60296e6e 66
onehorse 0:06dc60296e6e 67 myled=!myled;
onehorse 0:06dc60296e6e 68
onehorse 0:06dc60296e6e 69 pressure = temppress/tempcount; // use average pressure for reading to get ultra-high resolution
onehorse 0:06dc60296e6e 70 temperature = temperature*9.0f/5.0f + 32.0f; // convert to Fahrenheit
onehorse 0:06dc60296e6e 71 altitude = 44330.0f*( 1.0f - pow((pressure/101325.0f), (1.0f/5.255f))); // Calculate altitude in meters
onehorse 0:06dc60296e6e 72
onehorse 0:06dc60296e6e 73 led.writeFloat(display1, temperature, 1); // display temperature in degrees Fahrenheit to bubble display
onehorse 0:06dc60296e6e 74 led.writeFloat(display2, pressure/1000, 2); // display pressure in mPa to bubble display
onehorse 0:06dc60296e6e 75 led.writeFloat(display3, altitude, 1); // display altitude in meters to bubble display
onehorse 0:06dc60296e6e 76 led.writeFloat(display4, altitude*3.281f, 1); // display altitude in feet to bubble display
onehorse 0:06dc60296e6e 77
onehorse 0:06dc60296e6e 78 pc.printf("Temperature is %.1f C\n\r", temperature);
onehorse 0:06dc60296e6e 79 pc.printf("Pressure is %.3f mPa\n\r", pressure/1000.0f);
onehorse 0:06dc60296e6e 80 pc.printf("Altitude is %.1f m\n\r", altitude);
onehorse 0:06dc60296e6e 81 pc.printf("Altitude is %.1f ft\n\r", altitude*3.2810f);
onehorse 0:06dc60296e6e 82 pc.printf("\n\r");
onehorse 0:06dc60296e6e 83
onehorse 0:06dc60296e6e 84
onehorse 0:06dc60296e6e 85 count = t.read_ms();
onehorse 0:06dc60296e6e 86 temppress = 0;
onehorse 0:06dc60296e6e 87 tempcount = 0;
onehorse 0:06dc60296e6e 88 }
onehorse 0:06dc60296e6e 89 }
onehorse 0:06dc60296e6e 90 }
onehorse 0:06dc60296e6e 91