Demo program for the MPL3115A2 library.

Dependencies:   FOCOMETROPRESION mbed

Fork of WIGO_MPL3115A2 by clemente di caprio

Committer:
clemente
Date:
Thu Aug 22 14:53:21 2013 +0000
Revision:
4:bcf56c80dd2b
Parent:
3:e2a621ea6976
Child:
6:07f92b4716b6
Modified polling code for new function with check of data available.

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