Demo program for the MPL3115A2 library.

Dependencies:   FOCOMETROPRESION mbed

Fork of WIGO_MPL3115A2 by clemente di caprio

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?

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 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