Demo program for the MPL3115A2 library.

Dependencies:   MPL3115A2 mbed

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

Committer:
clemente
Date:
Thu Aug 22 12:03:47 2013 +0000
Revision:
3:e2a621ea6976
Parent:
2:0b726b8c8ab9
Child:
4:bcf56c80dd2b
Added example about how to use raw mode function.

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 3:e2a621ea6976 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 2:0b726b8c8ab9 40 #else
clemente 3:e2a621ea6976 41 #if 0
clemente 2:0b726b8c8ab9 42 // ***** Data acquisition using polling method
clemente 0:5d92b48edaff 43
clemente 2:0b726b8c8ab9 44 // Configure the sensor as Barometer.
clemente 2:0b726b8c8ab9 45 unsigned int mode=1;
clemente 2:0b726b8c8ab9 46
clemente 2:0b726b8c8ab9 47 // Set over sampling value (see MPL3115A2.h for details)
clemente 2:0b726b8c8ab9 48 wigo_sensor1.Oversample_Ratio( OVERSAMPLE_RATIO_64);
clemente 2:0b726b8c8ab9 49 // Configure the sensor as Barometer.
clemente 2:0b726b8c8ab9 50 wigo_sensor1.Barometric_Mode();
clemente 2:0b726b8c8ab9 51
clemente 0:5d92b48edaff 52 while(1) {
clemente 0:5d92b48edaff 53 //
clemente 0:5d92b48edaff 54 if ( wigo_sensor1.isDataAvailable()) {
clemente 0:5d92b48edaff 55 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 3:e2a621ea6976 68 #else
clemente 3:e2a621ea6976 69 // ***** Data acquisition in RAW mode using polling method
clemente 3:e2a621ea6976 70
clemente 3:e2a621ea6976 71 // Create a buffer for raw data
clemente 3:e2a621ea6976 72 unsigned char raw_data[5];
clemente 3:e2a621ea6976 73 // Configure the sensor as Barometer.
clemente 3:e2a621ea6976 74 unsigned int mode=1;
clemente 3:e2a621ea6976 75
clemente 3:e2a621ea6976 76 // Set over sampling value (see MPL3115A2.h for details)
clemente 3:e2a621ea6976 77 wigo_sensor1.Oversample_Ratio( OVERSAMPLE_RATIO_64);
clemente 3:e2a621ea6976 78 // Configure the sensor as Barometer.
clemente 3:e2a621ea6976 79 wigo_sensor1.Barometric_Mode();
clemente 3:e2a621ea6976 80
clemente 3:e2a621ea6976 81 while(1) {
clemente 3:e2a621ea6976 82 //
clemente 3:e2a621ea6976 83 if ( wigo_sensor1.isDataAvailable()) {
clemente 3:e2a621ea6976 84 wigo_sensor1.getAllDataRaw( &raw_data[0]);
clemente 3:e2a621ea6976 85 if ( mode & 0x0001) {
clemente 3:e2a621ea6976 86 pc.printf("\tPressure: %f\tTemperature: %f\r\n", print_PressureValue( &raw_data[0]), print_TemperatureValue( &raw_data[3]));
clemente 3:e2a621ea6976 87 wigo_sensor1.Altimeter_Mode();
clemente 3:e2a621ea6976 88 } else {
clemente 3:e2a621ea6976 89 pc.printf("\tAltitude: %f\tTemperature: %f\r\n", print_AltimiterValue( &raw_data[0]), print_TemperatureValue( &raw_data[3]));
clemente 3:e2a621ea6976 90 wigo_sensor1.Barometric_Mode();
clemente 3:e2a621ea6976 91 }
clemente 3:e2a621ea6976 92 mode++;
clemente 3:e2a621ea6976 93 }
clemente 3:e2a621ea6976 94 //
clemente 3:e2a621ea6976 95 wait( 1.0);
clemente 3:e2a621ea6976 96 }
clemente 3:e2a621ea6976 97
clemente 3:e2a621ea6976 98 #endif
clemente 2:0b726b8c8ab9 99 #endif
clemente 0:5d92b48edaff 100 }
clemente 2:0b726b8c8ab9 101
clemente 2:0b726b8c8ab9 102 void dataready( void)
clemente 2:0b726b8c8ab9 103 {
clemente 2:0b726b8c8ab9 104 wigo_sensor1.getAllData( &sensor_data[0]);
clemente 2:0b726b8c8ab9 105 pc.printf("\tPressure: %f\tTemperature: %f\r\n", sensor_data[0], sensor_data[1]);
clemente 2:0b726b8c8ab9 106 }
clemente 3:e2a621ea6976 107
clemente 3:e2a621ea6976 108 float print_PressureValue( unsigned char *dt)
clemente 3:e2a621ea6976 109 {
clemente 3:e2a621ea6976 110 unsigned int prs;
clemente 3:e2a621ea6976 111 float fprs;
clemente 3:e2a621ea6976 112
clemente 3:e2a621ea6976 113 /*
clemente 3:e2a621ea6976 114 * dt[0] = Bits 12-19 of 20-bit real-time Pressure sample. (b7-b0)
clemente 3:e2a621ea6976 115 * dt[1] = Bits 4-11 of 20-bit real-time Pressure sample. (b7-b0)
clemente 3:e2a621ea6976 116 * dt[2] = Bits 0-3 of 20-bit real-time Pressure sample (b7-b4)
clemente 3:e2a621ea6976 117 */
clemente 3:e2a621ea6976 118 prs = (dt[0]<<10) | (dt[1]<<2) | (dt[2]>>6);
clemente 3:e2a621ea6976 119 //
clemente 3:e2a621ea6976 120 fprs = (float)prs * 1.0f;
clemente 3:e2a621ea6976 121
clemente 3:e2a621ea6976 122 if ( dt[2] & 0x20)
clemente 3:e2a621ea6976 123 fprs += 0.25f;
clemente 3:e2a621ea6976 124 if ( dt[2] & 0x10)
clemente 3:e2a621ea6976 125 fprs += 0.5f;
clemente 3:e2a621ea6976 126
clemente 3:e2a621ea6976 127 return fprs;
clemente 3:e2a621ea6976 128 }
clemente 3:e2a621ea6976 129
clemente 3:e2a621ea6976 130 float print_AltimiterValue( unsigned char *dt)
clemente 3:e2a621ea6976 131 {
clemente 3:e2a621ea6976 132 unsigned short altm;
clemente 3:e2a621ea6976 133 float faltm;
clemente 3:e2a621ea6976 134
clemente 3:e2a621ea6976 135 /*
clemente 3:e2a621ea6976 136 * dt[0] = Bits 12-19 of 20-bit real-time Altitude sample. (b7-b0)
clemente 3:e2a621ea6976 137 * dt[1] = Bits 4-11 of 20-bit real-time Altitude sample. (b7-b0)
clemente 3:e2a621ea6976 138 * dt[2] = Bits 0-3 of 20-bit real-time Altitude sample (b7-b4)
clemente 3:e2a621ea6976 139 */
clemente 3:e2a621ea6976 140 altm = (dt[0]<<8) | dt[1];
clemente 3:e2a621ea6976 141 //
clemente 3:e2a621ea6976 142 if ( dt[0] > 0x7F) {
clemente 3:e2a621ea6976 143 altm = ~altm + 1;
clemente 3:e2a621ea6976 144 faltm = (float)altm * -1.0f;
clemente 3:e2a621ea6976 145 } else {
clemente 3:e2a621ea6976 146 faltm = (float)altm * 1.0f;
clemente 3:e2a621ea6976 147 }
clemente 3:e2a621ea6976 148 //
clemente 3:e2a621ea6976 149 faltm = faltm+((float)(dt[2]>>4) * 0.0625f);
clemente 3:e2a621ea6976 150 return faltm;
clemente 3:e2a621ea6976 151 }
clemente 3:e2a621ea6976 152
clemente 3:e2a621ea6976 153 float print_TemperatureValue( unsigned char *dt)
clemente 3:e2a621ea6976 154 {
clemente 3:e2a621ea6976 155 unsigned short temp;
clemente 3:e2a621ea6976 156 float ftemp;
clemente 3:e2a621ea6976 157
clemente 3:e2a621ea6976 158 /*
clemente 3:e2a621ea6976 159 * dt[0] = Bits 4-11 of 16-bit real-time temperature sample. (b7-b0)
clemente 3:e2a621ea6976 160 * dt[1] = Bits 0-3 of 16-bit real-time temperature sample. (b7-b4)
clemente 3:e2a621ea6976 161 */
clemente 3:e2a621ea6976 162 temp = dt[0];
clemente 3:e2a621ea6976 163 //
clemente 3:e2a621ea6976 164 if ( dt[0] > 0x7F) {
clemente 3:e2a621ea6976 165 temp = ~temp + 1;
clemente 3:e2a621ea6976 166 ftemp = (float)temp * -1.0f;
clemente 3:e2a621ea6976 167 } else {
clemente 3:e2a621ea6976 168 ftemp = (float)temp * 1.0f;
clemente 3:e2a621ea6976 169 }
clemente 3:e2a621ea6976 170 //
clemente 3:e2a621ea6976 171 ftemp = ftemp+((float)(dt[1]>>4) * 0.0625f);
clemente 3:e2a621ea6976 172 return ftemp;
clemente 3:e2a621ea6976 173
clemente 3:e2a621ea6976 174 }
clemente 3:e2a621ea6976 175