Demo program for the MPL3115A2 library.

Dependencies:   MPL3115A2 mbed

Example program for MPL3115 sensor. Added code for data acquisition using Interrupt.

Committer:
clemente
Date:
Tue Sep 24 20:22:57 2013 +0000
Revision:
7:97f5edf7d270
Parent:
6:07f92b4716b6
Added an example to read delta values.

Who changed what in which revision?

UserRevisionLine numberNew 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 7:97f5edf7d270 27 #if 0
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 7:97f5edf7d270 100 #if 1
clemente 7:97f5edf7d270 101 // ***** Data acquisition using polling method and delta values
clemente 7:97f5edf7d270 102
clemente 7:97f5edf7d270 103 // Array for the dela values
clemente 7:97f5edf7d270 104 float delta[2];
clemente 7:97f5edf7d270 105
clemente 7:97f5edf7d270 106 // Set over sampling value (see MPL3115A2.h for details)
clemente 7:97f5edf7d270 107 wigo_sensor1.Oversample_Ratio( OVERSAMPLE_RATIO_128);
clemente 7:97f5edf7d270 108 // Configure the sensor as Barometer.
clemente 7:97f5edf7d270 109 wigo_sensor1.Barometric_Mode();
clemente 7:97f5edf7d270 110
clemente 7:97f5edf7d270 111 while(1) {
clemente 7:97f5edf7d270 112 //
clemente 7:97f5edf7d270 113 if ( wigo_sensor1.getAllData( &sensor_data[0], &delta[0])) {
clemente 7:97f5edf7d270 114 pc.printf("\tPressure: %f\tTemperature: %f\r\n", sensor_data[0], sensor_data[1]);
clemente 7:97f5edf7d270 115 pc.printf("\tDelatPress: %f\tDeltaTemp: %f\r\n", delta[0], delta[1]);
clemente 7:97f5edf7d270 116 }
clemente 7:97f5edf7d270 117 //
clemente 7:97f5edf7d270 118 wait( 1.0);
clemente 7:97f5edf7d270 119 }
clemente 7:97f5edf7d270 120 #endif
clemente 7:97f5edf7d270 121
clemente 6:07f92b4716b6 122 #if 0
clemente 3:e2a621ea6976 123 // ***** Data acquisition in RAW mode using polling method
clemente 3:e2a621ea6976 124
clemente 3:e2a621ea6976 125 // Create a buffer for raw data
clemente 3:e2a621ea6976 126 unsigned char raw_data[5];
clemente 3:e2a621ea6976 127 // Configure the sensor as Barometer.
clemente 3:e2a621ea6976 128 unsigned int mode=1;
clemente 3:e2a621ea6976 129
clemente 3:e2a621ea6976 130 // Set over sampling value (see MPL3115A2.h for details)
clemente 3:e2a621ea6976 131 wigo_sensor1.Oversample_Ratio( OVERSAMPLE_RATIO_64);
clemente 3:e2a621ea6976 132 // Configure the sensor as Barometer.
clemente 3:e2a621ea6976 133 wigo_sensor1.Barometric_Mode();
clemente 6:07f92b4716b6 134
clemente 3:e2a621ea6976 135 while(1) {
clemente 3:e2a621ea6976 136 //
clemente 4:bcf56c80dd2b 137 if ( wigo_sensor1.getAllDataRaw( &raw_data[0])) {
clemente 3:e2a621ea6976 138 if ( mode & 0x0001) {
clemente 3:e2a621ea6976 139 pc.printf("\tPressure: %f\tTemperature: %f\r\n", print_PressureValue( &raw_data[0]), print_TemperatureValue( &raw_data[3]));
clemente 3:e2a621ea6976 140 wigo_sensor1.Altimeter_Mode();
clemente 3:e2a621ea6976 141 } else {
clemente 3:e2a621ea6976 142 pc.printf("\tAltitude: %f\tTemperature: %f\r\n", print_AltimiterValue( &raw_data[0]), print_TemperatureValue( &raw_data[3]));
clemente 3:e2a621ea6976 143 wigo_sensor1.Barometric_Mode();
clemente 3:e2a621ea6976 144 }
clemente 3:e2a621ea6976 145 mode++;
clemente 3:e2a621ea6976 146 }
clemente 3:e2a621ea6976 147 //
clemente 3:e2a621ea6976 148 wait( 1.0);
clemente 3:e2a621ea6976 149 }
clemente 3:e2a621ea6976 150
clemente 3:e2a621ea6976 151 #endif
clemente 6:07f92b4716b6 152
clemente 0:5d92b48edaff 153 }
clemente 2:0b726b8c8ab9 154
clemente 2:0b726b8c8ab9 155 void dataready( void)
clemente 2:0b726b8c8ab9 156 {
clemente 2:0b726b8c8ab9 157 wigo_sensor1.getAllData( &sensor_data[0]);
clemente 2:0b726b8c8ab9 158 pc.printf("\tPressure: %f\tTemperature: %f\r\n", sensor_data[0], sensor_data[1]);
clemente 2:0b726b8c8ab9 159 }
clemente 3:e2a621ea6976 160
clemente 3:e2a621ea6976 161 float print_PressureValue( unsigned char *dt)
clemente 3:e2a621ea6976 162 {
clemente 3:e2a621ea6976 163 unsigned int prs;
clemente 3:e2a621ea6976 164 float fprs;
clemente 3:e2a621ea6976 165
clemente 3:e2a621ea6976 166 /*
clemente 3:e2a621ea6976 167 * dt[0] = Bits 12-19 of 20-bit real-time Pressure sample. (b7-b0)
clemente 3:e2a621ea6976 168 * dt[1] = Bits 4-11 of 20-bit real-time Pressure sample. (b7-b0)
clemente 3:e2a621ea6976 169 * dt[2] = Bits 0-3 of 20-bit real-time Pressure sample (b7-b4)
clemente 3:e2a621ea6976 170 */
clemente 3:e2a621ea6976 171 prs = (dt[0]<<10) | (dt[1]<<2) | (dt[2]>>6);
clemente 3:e2a621ea6976 172 //
clemente 3:e2a621ea6976 173 fprs = (float)prs * 1.0f;
clemente 3:e2a621ea6976 174
clemente 3:e2a621ea6976 175 if ( dt[2] & 0x20)
clemente 3:e2a621ea6976 176 fprs += 0.25f;
clemente 3:e2a621ea6976 177 if ( dt[2] & 0x10)
clemente 3:e2a621ea6976 178 fprs += 0.5f;
clemente 3:e2a621ea6976 179
clemente 3:e2a621ea6976 180 return fprs;
clemente 3:e2a621ea6976 181 }
clemente 3:e2a621ea6976 182
clemente 3:e2a621ea6976 183 float print_AltimiterValue( unsigned char *dt)
clemente 3:e2a621ea6976 184 {
clemente 3:e2a621ea6976 185 unsigned short altm;
clemente 3:e2a621ea6976 186 float faltm;
clemente 3:e2a621ea6976 187
clemente 3:e2a621ea6976 188 /*
clemente 3:e2a621ea6976 189 * dt[0] = Bits 12-19 of 20-bit real-time Altitude sample. (b7-b0)
clemente 3:e2a621ea6976 190 * dt[1] = Bits 4-11 of 20-bit real-time Altitude sample. (b7-b0)
clemente 3:e2a621ea6976 191 * dt[2] = Bits 0-3 of 20-bit real-time Altitude sample (b7-b4)
clemente 3:e2a621ea6976 192 */
clemente 3:e2a621ea6976 193 altm = (dt[0]<<8) | dt[1];
clemente 3:e2a621ea6976 194 //
clemente 3:e2a621ea6976 195 if ( dt[0] > 0x7F) {
clemente 3:e2a621ea6976 196 altm = ~altm + 1;
clemente 3:e2a621ea6976 197 faltm = (float)altm * -1.0f;
clemente 3:e2a621ea6976 198 } else {
clemente 3:e2a621ea6976 199 faltm = (float)altm * 1.0f;
clemente 3:e2a621ea6976 200 }
clemente 3:e2a621ea6976 201 //
clemente 3:e2a621ea6976 202 faltm = faltm+((float)(dt[2]>>4) * 0.0625f);
clemente 3:e2a621ea6976 203 return faltm;
clemente 3:e2a621ea6976 204 }
clemente 3:e2a621ea6976 205
clemente 3:e2a621ea6976 206 float print_TemperatureValue( unsigned char *dt)
clemente 3:e2a621ea6976 207 {
clemente 3:e2a621ea6976 208 unsigned short temp;
clemente 3:e2a621ea6976 209 float ftemp;
clemente 3:e2a621ea6976 210
clemente 3:e2a621ea6976 211 /*
clemente 3:e2a621ea6976 212 * dt[0] = Bits 4-11 of 16-bit real-time temperature sample. (b7-b0)
clemente 3:e2a621ea6976 213 * dt[1] = Bits 0-3 of 16-bit real-time temperature sample. (b7-b4)
clemente 3:e2a621ea6976 214 */
clemente 3:e2a621ea6976 215 temp = dt[0];
clemente 3:e2a621ea6976 216 //
clemente 3:e2a621ea6976 217 if ( dt[0] > 0x7F) {
clemente 3:e2a621ea6976 218 temp = ~temp + 1;
clemente 3:e2a621ea6976 219 ftemp = (float)temp * -1.0f;
clemente 3:e2a621ea6976 220 } else {
clemente 3:e2a621ea6976 221 ftemp = (float)temp * 1.0f;
clemente 3:e2a621ea6976 222 }
clemente 3:e2a621ea6976 223 //
clemente 3:e2a621ea6976 224 ftemp = ftemp+((float)(dt[1]>>4) * 0.0625f);
clemente 3:e2a621ea6976 225 return ftemp;
clemente 3:e2a621ea6976 226
clemente 3:e2a621ea6976 227 }
clemente 3:e2a621ea6976 228