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.
main.cpp@0:06dc60296e6e, 2014-07-03 (annotated)
- Committer:
- onehorse
- Date:
- Thu Jul 03 20:05:55 2014 +0000
- Revision:
- 0:06dc60296e6e
Initial commit
Who changed what in which revision?
User | Revision | Line number | New 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 |