Demo program for the MPL3115A2 library.
Example program for MPL3115 sensor. Added code for data acquisition using Interrupt.
main.cpp@6:07f92b4716b6, 2013-09-22 (annotated)
- Committer:
- clemente
- Date:
- Sun Sep 22 11:18:08 2013 +0000
- Revision:
- 6:07f92b4716b6
- Parent:
- 4:bcf56c80dd2b
- Child:
- 7:97f5edf7d270
Added an exmple to read the maximum and minimum value using the new functions.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
clemente | 0:5d92b48edaff | 1 | #include "mbed.h" |
clemente | 0:5d92b48edaff | 2 | #include "MPL3115A2.h" |
clemente | 0:5d92b48edaff | 3 | |
clemente | 0:5d92b48edaff | 4 | #define MPL3115A2_I2C_ADDRESS (0x60<<1) |
clemente | 0:5d92b48edaff | 5 | |
clemente | 0:5d92b48edaff | 6 | DigitalOut myled(LED1); |
clemente | 0:5d92b48edaff | 7 | MPL3115A2 wigo_sensor1( PTE0, PTE1, MPL3115A2_I2C_ADDRESS); |
clemente | 0:5d92b48edaff | 8 | Serial pc(USBTX, USBRX); |
clemente | 0:5d92b48edaff | 9 | |
clemente | 0:5d92b48edaff | 10 | /* pos [0] = altimeter or pressure value */ |
clemente | 0:5d92b48edaff | 11 | /* pos [1] = temperature value */ |
clemente | 0:5d92b48edaff | 12 | float sensor_data[2]; |
clemente | 0:5d92b48edaff | 13 | |
clemente | 2:0b726b8c8ab9 | 14 | void dataready( void); // callback function for data streaming using Interrupt |
clemente | 2:0b726b8c8ab9 | 15 | void alttrigger( void); |
clemente | 2:0b726b8c8ab9 | 16 | |
clemente | 3:e2a621ea6976 | 17 | /* Helper functions to print out as float the raw data */ |
clemente | 3:e2a621ea6976 | 18 | float print_PressureValue( unsigned char *dt); |
clemente | 3:e2a621ea6976 | 19 | float print_AltimiterValue( unsigned char *dt); |
clemente | 3:e2a621ea6976 | 20 | float print_TemperatureValue( unsigned char *dt); |
clemente | 3:e2a621ea6976 | 21 | |
clemente | 0:5d92b48edaff | 22 | int main() { |
clemente | 0:5d92b48edaff | 23 | |
clemente | 0:5d92b48edaff | 24 | pc.baud( 230400); |
clemente | 2:0b726b8c8ab9 | 25 | pc.printf("MPL3115A2 Sensor. [%X]\r\n", wigo_sensor1.getDeviceID()); |
clemente | 2:0b726b8c8ab9 | 26 | |
clemente | 6:07f92b4716b6 | 27 | #if 1 |
clemente | 2:0b726b8c8ab9 | 28 | // ***** Data acquisition using Interrupt |
clemente | 0:5d92b48edaff | 29 | |
clemente | 2:0b726b8c8ab9 | 30 | // Configure the sensor as Barometer. |
clemente | 0:5d92b48edaff | 31 | wigo_sensor1.Barometric_Mode(); |
clemente | 2:0b726b8c8ab9 | 32 | // Set callback function and over sampling value (see MPL3115A2.h for details) |
clemente | 2:0b726b8c8ab9 | 33 | wigo_sensor1.DataReady( &dataready, OVERSAMPLE_RATIO_64); |
clemente | 2:0b726b8c8ab9 | 34 | // just loop... |
clemente | 2:0b726b8c8ab9 | 35 | while( 1) |
clemente | 2:0b726b8c8ab9 | 36 | { |
clemente | 2:0b726b8c8ab9 | 37 | wait( 1.0); |
clemente | 2:0b726b8c8ab9 | 38 | pc.printf("."); |
clemente | 2:0b726b8c8ab9 | 39 | } |
clemente | 6:07f92b4716b6 | 40 | #endif |
clemente | 6:07f92b4716b6 | 41 | |
clemente | 3:e2a621ea6976 | 42 | #if 0 |
clemente | 2:0b726b8c8ab9 | 43 | // ***** Data acquisition using polling method |
clemente | 0:5d92b48edaff | 44 | |
clemente | 2:0b726b8c8ab9 | 45 | // Configure the sensor as Barometer. |
clemente | 2:0b726b8c8ab9 | 46 | unsigned int mode=1; |
clemente | 2:0b726b8c8ab9 | 47 | |
clemente | 2:0b726b8c8ab9 | 48 | // Set over sampling value (see MPL3115A2.h for details) |
clemente | 2:0b726b8c8ab9 | 49 | wigo_sensor1.Oversample_Ratio( OVERSAMPLE_RATIO_64); |
clemente | 2:0b726b8c8ab9 | 50 | // Configure the sensor as Barometer. |
clemente | 2:0b726b8c8ab9 | 51 | wigo_sensor1.Barometric_Mode(); |
clemente | 2:0b726b8c8ab9 | 52 | |
clemente | 0:5d92b48edaff | 53 | while(1) { |
clemente | 0:5d92b48edaff | 54 | // |
clemente | 4:bcf56c80dd2b | 55 | if ( wigo_sensor1.getAllData( &sensor_data[0])) { |
clemente | 0:5d92b48edaff | 56 | if ( mode & 0x0001) { |
clemente | 0:5d92b48edaff | 57 | pc.printf("\tPressure: %f\tTemperature: %f\r\n", sensor_data[0], sensor_data[1]); |
clemente | 0:5d92b48edaff | 58 | wigo_sensor1.Altimeter_Mode(); |
clemente | 0:5d92b48edaff | 59 | } else { |
clemente | 1:5ea71ebc0d82 | 60 | pc.printf("\tAltitude: %f\tTemperature: %f\r\n", sensor_data[0], sensor_data[1]); |
clemente | 0:5d92b48edaff | 61 | wigo_sensor1.Barometric_Mode(); |
clemente | 0:5d92b48edaff | 62 | } |
clemente | 0:5d92b48edaff | 63 | mode++; |
clemente | 0:5d92b48edaff | 64 | } |
clemente | 0:5d92b48edaff | 65 | // |
clemente | 3:e2a621ea6976 | 66 | wait( 1.0); |
clemente | 0:5d92b48edaff | 67 | } |
clemente | 6:07f92b4716b6 | 68 | #endif |
clemente | 6:07f92b4716b6 | 69 | |
clemente | 6:07f92b4716b6 | 70 | #if 0 |
clemente | 6:07f92b4716b6 | 71 | // ***** Data acquisition using polling method with Max and Min values visualization |
clemente | 6:07f92b4716b6 | 72 | |
clemente | 6:07f92b4716b6 | 73 | // Configure the sensor as Barometer. |
clemente | 6:07f92b4716b6 | 74 | unsigned int mode=1; |
clemente | 6:07f92b4716b6 | 75 | |
clemente | 6:07f92b4716b6 | 76 | // Set over sampling value (see MPL3115A2.h for details) |
clemente | 6:07f92b4716b6 | 77 | wigo_sensor1.Oversample_Ratio( OVERSAMPLE_RATIO_64); |
clemente | 6:07f92b4716b6 | 78 | // Configure the sensor as Barometer. |
clemente | 6:07f92b4716b6 | 79 | wigo_sensor1.Barometric_Mode(); |
clemente | 6:07f92b4716b6 | 80 | |
clemente | 6:07f92b4716b6 | 81 | while(1) { |
clemente | 6:07f92b4716b6 | 82 | // |
clemente | 6:07f92b4716b6 | 83 | if ( wigo_sensor1.getAllData( &sensor_data[0])) { |
clemente | 6:07f92b4716b6 | 84 | pc.printf("\tPressure: %f\tTemperature: %f\r\n", sensor_data[0], sensor_data[1]); |
clemente | 6:07f92b4716b6 | 85 | if ( (mode % 20)==0) { |
clemente | 6:07f92b4716b6 | 86 | sensor_data[0] = sensor_data[1] = 0.0; |
clemente | 6:07f92b4716b6 | 87 | wigo_sensor1.getAllMaximumData( &sensor_data[0]); |
clemente | 6:07f92b4716b6 | 88 | pc.printf("\tMaxPress: %f\tMaxTemp: %f\r\n", sensor_data[0], sensor_data[1]); |
clemente | 6:07f92b4716b6 | 89 | sensor_data[0] = sensor_data[1] = 0.0; |
clemente | 6:07f92b4716b6 | 90 | wigo_sensor1.getAllMinimumData( &sensor_data[0]); |
clemente | 6:07f92b4716b6 | 91 | pc.printf("\tMinPress: %f\tMinTemp: %f\r\n", sensor_data[0], sensor_data[1]); |
clemente | 6:07f92b4716b6 | 92 | } |
clemente | 6:07f92b4716b6 | 93 | mode++; |
clemente | 6:07f92b4716b6 | 94 | } |
clemente | 6:07f92b4716b6 | 95 | // |
clemente | 6:07f92b4716b6 | 96 | wait( 1.0); |
clemente | 6:07f92b4716b6 | 97 | } |
clemente | 6:07f92b4716b6 | 98 | #endif |
clemente | 6:07f92b4716b6 | 99 | |
clemente | 6:07f92b4716b6 | 100 | #if 0 |
clemente | 3:e2a621ea6976 | 101 | // ***** Data acquisition in RAW mode using polling method |
clemente | 3:e2a621ea6976 | 102 | |
clemente | 3:e2a621ea6976 | 103 | // Create a buffer for raw data |
clemente | 3:e2a621ea6976 | 104 | unsigned char raw_data[5]; |
clemente | 3:e2a621ea6976 | 105 | // Configure the sensor as Barometer. |
clemente | 3:e2a621ea6976 | 106 | unsigned int mode=1; |
clemente | 3:e2a621ea6976 | 107 | |
clemente | 3:e2a621ea6976 | 108 | // Set over sampling value (see MPL3115A2.h for details) |
clemente | 3:e2a621ea6976 | 109 | wigo_sensor1.Oversample_Ratio( OVERSAMPLE_RATIO_64); |
clemente | 3:e2a621ea6976 | 110 | // Configure the sensor as Barometer. |
clemente | 3:e2a621ea6976 | 111 | wigo_sensor1.Barometric_Mode(); |
clemente | 6:07f92b4716b6 | 112 | |
clemente | 3:e2a621ea6976 | 113 | while(1) { |
clemente | 3:e2a621ea6976 | 114 | // |
clemente | 4:bcf56c80dd2b | 115 | if ( wigo_sensor1.getAllDataRaw( &raw_data[0])) { |
clemente | 3:e2a621ea6976 | 116 | if ( mode & 0x0001) { |
clemente | 3:e2a621ea6976 | 117 | pc.printf("\tPressure: %f\tTemperature: %f\r\n", print_PressureValue( &raw_data[0]), print_TemperatureValue( &raw_data[3])); |
clemente | 3:e2a621ea6976 | 118 | wigo_sensor1.Altimeter_Mode(); |
clemente | 3:e2a621ea6976 | 119 | } else { |
clemente | 3:e2a621ea6976 | 120 | pc.printf("\tAltitude: %f\tTemperature: %f\r\n", print_AltimiterValue( &raw_data[0]), print_TemperatureValue( &raw_data[3])); |
clemente | 3:e2a621ea6976 | 121 | wigo_sensor1.Barometric_Mode(); |
clemente | 3:e2a621ea6976 | 122 | } |
clemente | 3:e2a621ea6976 | 123 | mode++; |
clemente | 3:e2a621ea6976 | 124 | } |
clemente | 3:e2a621ea6976 | 125 | // |
clemente | 3:e2a621ea6976 | 126 | wait( 1.0); |
clemente | 3:e2a621ea6976 | 127 | } |
clemente | 3:e2a621ea6976 | 128 | |
clemente | 3:e2a621ea6976 | 129 | #endif |
clemente | 6:07f92b4716b6 | 130 | |
clemente | 0:5d92b48edaff | 131 | } |
clemente | 2:0b726b8c8ab9 | 132 | |
clemente | 2:0b726b8c8ab9 | 133 | void dataready( void) |
clemente | 2:0b726b8c8ab9 | 134 | { |
clemente | 2:0b726b8c8ab9 | 135 | wigo_sensor1.getAllData( &sensor_data[0]); |
clemente | 2:0b726b8c8ab9 | 136 | pc.printf("\tPressure: %f\tTemperature: %f\r\n", sensor_data[0], sensor_data[1]); |
clemente | 2:0b726b8c8ab9 | 137 | } |
clemente | 3:e2a621ea6976 | 138 | |
clemente | 3:e2a621ea6976 | 139 | float print_PressureValue( unsigned char *dt) |
clemente | 3:e2a621ea6976 | 140 | { |
clemente | 3:e2a621ea6976 | 141 | unsigned int prs; |
clemente | 3:e2a621ea6976 | 142 | float fprs; |
clemente | 3:e2a621ea6976 | 143 | |
clemente | 3:e2a621ea6976 | 144 | /* |
clemente | 3:e2a621ea6976 | 145 | * dt[0] = Bits 12-19 of 20-bit real-time Pressure sample. (b7-b0) |
clemente | 3:e2a621ea6976 | 146 | * dt[1] = Bits 4-11 of 20-bit real-time Pressure sample. (b7-b0) |
clemente | 3:e2a621ea6976 | 147 | * dt[2] = Bits 0-3 of 20-bit real-time Pressure sample (b7-b4) |
clemente | 3:e2a621ea6976 | 148 | */ |
clemente | 3:e2a621ea6976 | 149 | prs = (dt[0]<<10) | (dt[1]<<2) | (dt[2]>>6); |
clemente | 3:e2a621ea6976 | 150 | // |
clemente | 3:e2a621ea6976 | 151 | fprs = (float)prs * 1.0f; |
clemente | 3:e2a621ea6976 | 152 | |
clemente | 3:e2a621ea6976 | 153 | if ( dt[2] & 0x20) |
clemente | 3:e2a621ea6976 | 154 | fprs += 0.25f; |
clemente | 3:e2a621ea6976 | 155 | if ( dt[2] & 0x10) |
clemente | 3:e2a621ea6976 | 156 | fprs += 0.5f; |
clemente | 3:e2a621ea6976 | 157 | |
clemente | 3:e2a621ea6976 | 158 | return fprs; |
clemente | 3:e2a621ea6976 | 159 | } |
clemente | 3:e2a621ea6976 | 160 | |
clemente | 3:e2a621ea6976 | 161 | float print_AltimiterValue( unsigned char *dt) |
clemente | 3:e2a621ea6976 | 162 | { |
clemente | 3:e2a621ea6976 | 163 | unsigned short altm; |
clemente | 3:e2a621ea6976 | 164 | float faltm; |
clemente | 3:e2a621ea6976 | 165 | |
clemente | 3:e2a621ea6976 | 166 | /* |
clemente | 3:e2a621ea6976 | 167 | * dt[0] = Bits 12-19 of 20-bit real-time Altitude sample. (b7-b0) |
clemente | 3:e2a621ea6976 | 168 | * dt[1] = Bits 4-11 of 20-bit real-time Altitude sample. (b7-b0) |
clemente | 3:e2a621ea6976 | 169 | * dt[2] = Bits 0-3 of 20-bit real-time Altitude sample (b7-b4) |
clemente | 3:e2a621ea6976 | 170 | */ |
clemente | 3:e2a621ea6976 | 171 | altm = (dt[0]<<8) | dt[1]; |
clemente | 3:e2a621ea6976 | 172 | // |
clemente | 3:e2a621ea6976 | 173 | if ( dt[0] > 0x7F) { |
clemente | 3:e2a621ea6976 | 174 | altm = ~altm + 1; |
clemente | 3:e2a621ea6976 | 175 | faltm = (float)altm * -1.0f; |
clemente | 3:e2a621ea6976 | 176 | } else { |
clemente | 3:e2a621ea6976 | 177 | faltm = (float)altm * 1.0f; |
clemente | 3:e2a621ea6976 | 178 | } |
clemente | 3:e2a621ea6976 | 179 | // |
clemente | 3:e2a621ea6976 | 180 | faltm = faltm+((float)(dt[2]>>4) * 0.0625f); |
clemente | 3:e2a621ea6976 | 181 | return faltm; |
clemente | 3:e2a621ea6976 | 182 | } |
clemente | 3:e2a621ea6976 | 183 | |
clemente | 3:e2a621ea6976 | 184 | float print_TemperatureValue( unsigned char *dt) |
clemente | 3:e2a621ea6976 | 185 | { |
clemente | 3:e2a621ea6976 | 186 | unsigned short temp; |
clemente | 3:e2a621ea6976 | 187 | float ftemp; |
clemente | 3:e2a621ea6976 | 188 | |
clemente | 3:e2a621ea6976 | 189 | /* |
clemente | 3:e2a621ea6976 | 190 | * dt[0] = Bits 4-11 of 16-bit real-time temperature sample. (b7-b0) |
clemente | 3:e2a621ea6976 | 191 | * dt[1] = Bits 0-3 of 16-bit real-time temperature sample. (b7-b4) |
clemente | 3:e2a621ea6976 | 192 | */ |
clemente | 3:e2a621ea6976 | 193 | temp = dt[0]; |
clemente | 3:e2a621ea6976 | 194 | // |
clemente | 3:e2a621ea6976 | 195 | if ( dt[0] > 0x7F) { |
clemente | 3:e2a621ea6976 | 196 | temp = ~temp + 1; |
clemente | 3:e2a621ea6976 | 197 | ftemp = (float)temp * -1.0f; |
clemente | 3:e2a621ea6976 | 198 | } else { |
clemente | 3:e2a621ea6976 | 199 | ftemp = (float)temp * 1.0f; |
clemente | 3:e2a621ea6976 | 200 | } |
clemente | 3:e2a621ea6976 | 201 | // |
clemente | 3:e2a621ea6976 | 202 | ftemp = ftemp+((float)(dt[1]>>4) * 0.0625f); |
clemente | 3:e2a621ea6976 | 203 | return ftemp; |
clemente | 3:e2a621ea6976 | 204 | |
clemente | 3:e2a621ea6976 | 205 | } |
clemente | 3:e2a621ea6976 | 206 |