Used for testing battery sense circuit, looking for max and min levels. Allow for finding true empty, half and full values for driving LEDs for example

Dependencies:   mbed MPL3115A2 TSI WiGo_BattCharger

Committer:
monpjc
Date:
Tue Sep 03 08:59:49 2013 +0000
Revision:
5:4438d5665b4f
Parent:
3:3b88d6ae24f2
WIP

Who changed what in which revision?

UserRevisionLine numberNew contents of line
monpjc 0:17ad5a30ff25 1 #include "mbed.h"
monpjc 1:b1921e153d21 2 #include "WiGo_BattCharger.h"
monpjc 3:3b88d6ae24f2 3 #include "TSISensor.h"
monpjc 3:3b88d6ae24f2 4 #include "math.h"
monpjc 3:3b88d6ae24f2 5 #include "MPL3115A2.h"
monpjc 5:4438d5665b4f 6 #include "main.h"
monpjc 3:3b88d6ae24f2 7
monpjc 5:4438d5665b4f 8 MPL3115A2 wigo_sensor1(PTE0, PTE1, MPL3115A2_I2C_ADDRESS);
monpjc 0:17ad5a30ff25 9
monpjc 3:3b88d6ae24f2 10 // Some LEDs for showing status
monpjc 3:3b88d6ae24f2 11 DigitalOut redLed(LED_RED);
monpjc 3:3b88d6ae24f2 12 DigitalOut greenLed(LED_GREEN);
monpjc 3:3b88d6ae24f2 13 DigitalOut blueLed(LED_BLUE);
monpjc 3:3b88d6ae24f2 14
monpjc 5:4438d5665b4f 15 // test analog input pin
monpjc 5:4438d5665b4f 16 AnalogIn NTC(PTE20);
monpjc 5:4438d5665b4f 17 AnalogIn testPin1(PTE30);
monpjc 5:4438d5665b4f 18 AnalogIn testPin2(PTE22);
monpjc 5:4438d5665b4f 19 AnalogIn testPin3(PTC0);
monpjc 5:4438d5665b4f 20 AnalogIn testPin4(PTE29);
monpjc 5:4438d5665b4f 21 AnalogIn testPin5(PTD1);
monpjc 5:4438d5665b4f 22
monpjc 3:3b88d6ae24f2 23 // Slide sensor acts as a button
monpjc 3:3b88d6ae24f2 24 TSISensor tsi;
monpjc 3:3b88d6ae24f2 25
monpjc 3:3b88d6ae24f2 26 // I2C used to communicate with sensor
monpjc 3:3b88d6ae24f2 27 I2C i2c(PTE0, PTE1);
monpjc 3:3b88d6ae24f2 28
monpjc 3:3b88d6ae24f2 29 int avgX, avgY, newX, tempXmin, tempXmax, newY, tempYmin, tempYmax;
monpjc 3:3b88d6ae24f2 30 // Ideally these would be saved in eeprom/flash
monpjc 3:3b88d6ae24f2 31 struct settings_t {
monpjc 3:3b88d6ae24f2 32 long maxX, minX, maxY, minY;
monpjc 3:3b88d6ae24f2 33 }
monpjc 3:3b88d6ae24f2 34 settings;
monpjc 3:3b88d6ae24f2 35
monpjc 3:3b88d6ae24f2 36 const int addr = MAG_ADDR;
monpjc 0:17ad5a30ff25 37
monpjc 0:17ad5a30ff25 38 Serial pc(USBTX, USBRX);
monpjc 0:17ad5a30ff25 39
monpjc 1:b1921e153d21 40 WiGo_BattCharger Batt( BATT_LOW, BATT_MED, BATT_FULL, CHRG_EN1, CHRG_EN2, CHRG_SNS_EN, CHRG_SNS, CHRG_POK, CHRG_CHG);
monpjc 0:17ad5a30ff25 41
monpjc 3:3b88d6ae24f2 42 // Read a single byte form 8 bit register, return as int
monpjc 3:3b88d6ae24f2 43 int readReg(char regAddr)
monpjc 3:3b88d6ae24f2 44 {
monpjc 3:3b88d6ae24f2 45 char cmd[1];
monpjc 3:3b88d6ae24f2 46
monpjc 3:3b88d6ae24f2 47 cmd[0] = regAddr;
monpjc 3:3b88d6ae24f2 48 i2c.write(addr, cmd, 1);
monpjc 3:3b88d6ae24f2 49
monpjc 3:3b88d6ae24f2 50 cmd[0] = 0x00;
monpjc 3:3b88d6ae24f2 51 i2c.read(addr, cmd, 1);
monpjc 3:3b88d6ae24f2 52 return (int)( cmd[0]);
monpjc 3:3b88d6ae24f2 53 }
monpjc 3:3b88d6ae24f2 54
monpjc 3:3b88d6ae24f2 55 // read a register per, pass first reg value, reading 2 bytes increments register
monpjc 3:3b88d6ae24f2 56 // Reads MSB first then LSB
monpjc 3:3b88d6ae24f2 57 int readVal(char regAddr)
monpjc 3:3b88d6ae24f2 58 {
monpjc 3:3b88d6ae24f2 59 char cmd[2];
monpjc 3:3b88d6ae24f2 60
monpjc 3:3b88d6ae24f2 61 cmd[0] = regAddr;
monpjc 3:3b88d6ae24f2 62 i2c.write(addr, cmd, 1);
monpjc 3:3b88d6ae24f2 63
monpjc 3:3b88d6ae24f2 64 cmd[0] = 0x00;
monpjc 3:3b88d6ae24f2 65 cmd[1] = 0x00;
monpjc 3:3b88d6ae24f2 66 i2c.read(addr, cmd, 2);
monpjc 3:3b88d6ae24f2 67 return (int)( (cmd[1]|(cmd[0] << 8))); //concatenate the MSB and LSB
monpjc 3:3b88d6ae24f2 68 }
monpjc 3:3b88d6ae24f2 69
monpjc 3:3b88d6ae24f2 70 void initMag() {
monpjc 3:3b88d6ae24f2 71 char cmd[2];
monpjc 3:3b88d6ae24f2 72
monpjc 3:3b88d6ae24f2 73 cmd[0] = MAG_CTRL_REG2;
monpjc 3:3b88d6ae24f2 74 cmd[1] = 0x80;
monpjc 3:3b88d6ae24f2 75 i2c.write(addr, cmd, 2);
monpjc 3:3b88d6ae24f2 76
monpjc 3:3b88d6ae24f2 77 cmd[0] = MAG_CTRL_REG1;
monpjc 3:3b88d6ae24f2 78 cmd[1] = MAG_3110_SAMPLE80+MAG_3110_OVERSAMPLE2+MAG_3110_ACTIVE; // 0x91;
monpjc 3:3b88d6ae24f2 79 i2c.write(addr, cmd, 2);
monpjc 3:3b88d6ae24f2 80 }
monpjc 3:3b88d6ae24f2 81
monpjc 3:3b88d6ae24f2 82 void calXY() //magnetometer calibration: finding max and min of X, Y axis
monpjc 3:3b88d6ae24f2 83 {
monpjc 3:3b88d6ae24f2 84 int tempXmax, tempXmin, tempYmax, tempYmin, newX, newY;
monpjc 3:3b88d6ae24f2 85 redLed = ON;
monpjc 3:3b88d6ae24f2 86
monpjc 3:3b88d6ae24f2 87 printf("Waiting for initial press\n");
monpjc 3:3b88d6ae24f2 88 // Wait for slider to be pressed
monpjc 3:3b88d6ae24f2 89 while( tsi.readDistance() == 0 ) {
monpjc 3:3b88d6ae24f2 90 redLed = ON;
monpjc 3:3b88d6ae24f2 91 wait(0.2);
monpjc 3:3b88d6ae24f2 92 redLed = OFF;
monpjc 3:3b88d6ae24f2 93 wait(0.2);
monpjc 3:3b88d6ae24f2 94 }
monpjc 3:3b88d6ae24f2 95
monpjc 3:3b88d6ae24f2 96 printf("Waiting for release\n");
monpjc 3:3b88d6ae24f2 97
monpjc 3:3b88d6ae24f2 98 // Wait for release
monpjc 3:3b88d6ae24f2 99 while( tsi.readDistance() != 0 ) {
monpjc 3:3b88d6ae24f2 100 redLed = OFF;
monpjc 3:3b88d6ae24f2 101 wait(0.2);
monpjc 3:3b88d6ae24f2 102 redLed = ON;
monpjc 3:3b88d6ae24f2 103 wait(0.2);
monpjc 3:3b88d6ae24f2 104 }
monpjc 3:3b88d6ae24f2 105 redLed = OFF;
monpjc 3:3b88d6ae24f2 106 wait(0.5);
monpjc 3:3b88d6ae24f2 107
monpjc 3:3b88d6ae24f2 108 printf("Rotate\n");
monpjc 3:3b88d6ae24f2 109
monpjc 3:3b88d6ae24f2 110 tempXmax = tempXmin = readVal(MAG_OUT_X_MSB);
monpjc 3:3b88d6ae24f2 111 tempYmax = tempYmin = readVal(MAG_OUT_Y_MSB);
monpjc 3:3b88d6ae24f2 112
monpjc 3:3b88d6ae24f2 113 while(tsi.readDistance() == 0) {
monpjc 3:3b88d6ae24f2 114 greenLed = ON;
monpjc 3:3b88d6ae24f2 115 wait(0.1);
monpjc 3:3b88d6ae24f2 116 greenLed = OFF;
monpjc 3:3b88d6ae24f2 117 wait(0.1);
monpjc 3:3b88d6ae24f2 118 newX = readVal(MAG_OUT_X_MSB);
monpjc 3:3b88d6ae24f2 119 newY = readVal(MAG_OUT_Y_MSB);
monpjc 3:3b88d6ae24f2 120 if (newX > tempXmax) tempXmax = newX;
monpjc 3:3b88d6ae24f2 121 if (newX < tempXmin) tempXmin = newX;
monpjc 3:3b88d6ae24f2 122 if (newY > tempYmax) tempYmax = newY;
monpjc 3:3b88d6ae24f2 123 if (newY < tempYmin) tempYmin = newY;
monpjc 3:3b88d6ae24f2 124 }
monpjc 3:3b88d6ae24f2 125
monpjc 3:3b88d6ae24f2 126 settings.maxX = tempXmax;
monpjc 3:3b88d6ae24f2 127 settings.minX = tempXmin;
monpjc 3:3b88d6ae24f2 128 settings.maxY = tempYmax;
monpjc 3:3b88d6ae24f2 129 settings.minY = tempYmin;
monpjc 3:3b88d6ae24f2 130
monpjc 3:3b88d6ae24f2 131 //store new X, Y values in EEPROM/Flash
monpjc 3:3b88d6ae24f2 132
monpjc 3:3b88d6ae24f2 133 // Calculate average from min/max
monpjc 3:3b88d6ae24f2 134 avgX=(settings.maxX+settings.minX)/2;
monpjc 3:3b88d6ae24f2 135 avgY=(settings.maxY+settings.minY)/2;
monpjc 3:3b88d6ae24f2 136
monpjc 3:3b88d6ae24f2 137 // Wait for release
monpjc 3:3b88d6ae24f2 138 while( tsi.readDistance() != 0 ) {
monpjc 3:3b88d6ae24f2 139 greenLed = OFF;
monpjc 3:3b88d6ae24f2 140 wait(0.2);
monpjc 3:3b88d6ae24f2 141 greenLed = ON;
monpjc 3:3b88d6ae24f2 142 wait(0.2);
monpjc 3:3b88d6ae24f2 143 }
monpjc 3:3b88d6ae24f2 144 greenLed = OFF;
monpjc 3:3b88d6ae24f2 145 wait(1.0);
monpjc 5:4438d5665b4f 146 }
monpjc 3:3b88d6ae24f2 147
monpjc 5:4438d5665b4f 148 // ================================ MAIN CODE ================================
monpjc 3:3b88d6ae24f2 149
monpjc 0:17ad5a30ff25 150 float max_batt;
monpjc 0:17ad5a30ff25 151 float batt_lvl;
monpjc 5:4438d5665b4f 152 float sensor_data[2];
monpjc 5:4438d5665b4f 153 float testVoltage;
monpjc 0:17ad5a30ff25 154
monpjc 0:17ad5a30ff25 155 int main()
monpjc 0:17ad5a30ff25 156 {
monpjc 5:4438d5665b4f 157 //unsigned int mode=1;
monpjc 5:4438d5665b4f 158
monpjc 5:4438d5665b4f 159 testVoltage = testPin.read();
monpjc 3:3b88d6ae24f2 160
monpjc 2:c08efa9effc8 161 Batt.init(CHRG_500MA);
monpjc 1:b1921e153d21 162 Batt.sense_en(1);
monpjc 0:17ad5a30ff25 163 wait(0.5);
monpjc 1:b1921e153d21 164 max_batt = Batt.read();
monpjc 3:3b88d6ae24f2 165 wigo_sensor1.Oversample_Ratio( OVERSAMPLE_RATIO_32);
monpjc 5:4438d5665b4f 166 wigo_sensor1.Barometric_Mode();
monpjc 1:b1921e153d21 167
monpjc 3:3b88d6ae24f2 168 printf("MAG3110 Test\n");
monpjc 3:3b88d6ae24f2 169
monpjc 3:3b88d6ae24f2 170 redLed = OFF;
monpjc 3:3b88d6ae24f2 171 greenLed = OFF;
monpjc 3:3b88d6ae24f2 172 blueLed = OFF;
monpjc 3:3b88d6ae24f2 173
monpjc 3:3b88d6ae24f2 174 initMag();
monpjc 3:3b88d6ae24f2 175
monpjc 3:3b88d6ae24f2 176 // Get some values
monpjc 3:3b88d6ae24f2 177 printf("DR_STATUS %X\n", readReg( MAG_DR_STATUS ));
monpjc 3:3b88d6ae24f2 178 printf("WHO_AM_I %X\n", readReg( MAG_WHO_AM_I ));
monpjc 3:3b88d6ae24f2 179 printf("SYSMOD %X\n", readReg( MAG_SYSMOD ));
monpjc 3:3b88d6ae24f2 180 printf("DIE_TEMP %d\n", readReg( MAG_DIE_TEMP ));
monpjc 3:3b88d6ae24f2 181
monpjc 3:3b88d6ae24f2 182 printf("OFF_X %d\n", readVal( MAG_OFF_X_MSB ));
monpjc 3:3b88d6ae24f2 183 printf("OFF_Y %d\n", readVal( MAG_OFF_Y_MSB ));
monpjc 3:3b88d6ae24f2 184 printf("OFF_Z %d\n", readVal( MAG_OFF_Z_MSB ));
monpjc 3:3b88d6ae24f2 185
monpjc 3:3b88d6ae24f2 186 printf("CTRL_REG1 %X\n", readReg( MAG_CTRL_REG1 ));
monpjc 3:3b88d6ae24f2 187 printf("CTRL_REG2 %X\n", readReg( MAG_CTRL_REG2 ));
monpjc 3:3b88d6ae24f2 188
monpjc 5:4438d5665b4f 189 // Mag calibration or store defaults
monpjc 5:4438d5665b4f 190 //===================================
monpjc 5:4438d5665b4f 191 //printf("calibrate\n");
monpjc 5:4438d5665b4f 192 //calXY();
monpjc 5:4438d5665b4f 193 //printf("....Finished\n");
monpjc 5:4438d5665b4f 194 //printf("avgX = %d, avgY = %d\n", avgX, avgY);
monpjc 5:4438d5665b4f 195 avgX = 64366;
monpjc 5:4438d5665b4f 196 avgY = 1624;
monpjc 3:3b88d6ae24f2 197
monpjc 3:3b88d6ae24f2 198 redLed = OFF;
monpjc 3:3b88d6ae24f2 199 greenLed = OFF;
monpjc 3:3b88d6ae24f2 200 blueLed = OFF;
monpjc 0:17ad5a30ff25 201
monpjc 0:17ad5a30ff25 202 while(1) {
monpjc 0:17ad5a30ff25 203
monpjc 3:3b88d6ae24f2 204 wait(2);
monpjc 3:3b88d6ae24f2 205 int xVal = readVal(MAG_OUT_X_MSB);
monpjc 3:3b88d6ae24f2 206 int yVal = readVal(MAG_OUT_Y_MSB);
monpjc 5:4438d5665b4f 207 int zVal = readVal(MAG_OUT_Z_MSB);
monpjc 3:3b88d6ae24f2 208 float heading = (atan2((double)(yVal-avgY),(double)(xVal-avgX)))*180/PI;
monpjc 3:3b88d6ae24f2 209
monpjc 3:3b88d6ae24f2 210 // Do something with heading - display direction and turn on blue LED if heading approx north
monpjc 3:3b88d6ae24f2 211 if (abs(heading) <= 22.5) { printf("N\n"); blueLed = ON; } else blueLed = OFF;
monpjc 3:3b88d6ae24f2 212 if (abs(heading) >= 157.5) printf("S\n");
monpjc 3:3b88d6ae24f2 213 if (heading >= 67.5 && heading <= 112.5) printf("E \n");
monpjc 3:3b88d6ae24f2 214 if (heading <= -67.5 && heading >= -112.5) printf("W \n");
monpjc 3:3b88d6ae24f2 215 if (heading > 22.5 && heading < 67.5) printf("NE\n");
monpjc 3:3b88d6ae24f2 216 if (heading < -22.5 && heading > -67.5) printf("NW\n");
monpjc 3:3b88d6ae24f2 217 if (heading > 112.5 && heading < 157.5) printf("SE\n");
monpjc 3:3b88d6ae24f2 218 if (heading < -112.5 && heading > -157.5) printf("SW\n");
monpjc 0:17ad5a30ff25 219
monpjc 3:3b88d6ae24f2 220 if (heading < 0) heading += 360.0;
monpjc 5:4438d5665b4f 221 //printf("xVal - avgX = %d, yVal - avgY = %d ", xVal-avgX, yVal-avgY);
monpjc 5:4438d5665b4f 222 //printf("X = %d, Y = %d, Z = %d, Heading %f\n", xVal, yVal, zVal, heading);
monpjc 5:4438d5665b4f 223 printf("Heading %f\n", heading);
monpjc 0:17ad5a30ff25 224
monpjc 2:c08efa9effc8 225 Batt.LEDupdate(1);
monpjc 0:17ad5a30ff25 226
monpjc 1:b1921e153d21 227 batt_lvl = Batt.read();
monpjc 0:17ad5a30ff25 228 if( batt_lvl > max_batt ) {
monpjc 0:17ad5a30ff25 229 max_batt = batt_lvl;
monpjc 0:17ad5a30ff25 230 }
monpjc 0:17ad5a30ff25 231
monpjc 5:4438d5665b4f 232 pc.printf("Batt = %f Max:%f %i%\n", batt_lvl, max_batt, Batt.level());
monpjc 3:3b88d6ae24f2 233
monpjc 3:3b88d6ae24f2 234 if ( wigo_sensor1.isDataAvailable()) {
monpjc 3:3b88d6ae24f2 235 wigo_sensor1.getAllData( &sensor_data[0]);
monpjc 5:4438d5665b4f 236 pc.printf("Bar: %f\tTemperature: %f\n", sensor_data[0]/100, sensor_data[1]);
monpjc 3:3b88d6ae24f2 237 }
monpjc 5:4438d5665b4f 238
monpjc 5:4438d5665b4f 239 //if ( mode & 0x0001) {
monpjc 5:4438d5665b4f 240 // pc.printf("\tPressure: %f\tTemperature: %f\r\n", sensor_data[0], sensor_data[1]);
monpjc 5:4438d5665b4f 241 // wigo_sensor1.Altimeter_Mode();
monpjc 5:4438d5665b4f 242 //} else {
monpjc 5:4438d5665b4f 243 // pc.printf("\Altitude: %f\tTemperature: %f\r\n", sensor_data[0], sensor_data[1]);
monpjc 5:4438d5665b4f 244 // wigo_sensor1.Barometric_Mode();
monpjc 5:4438d5665b4f 245 //}
monpjc 5:4438d5665b4f 246 //mode++;
monpjc 5:4438d5665b4f 247
monpjc 5:4438d5665b4f 248 //testVoltage = testPin.read();
monpjc 5:4438d5665b4f 249 //pc.printf("testVoltage = %f\n", testVoltage );
monpjc 5:4438d5665b4f 250 //testVoltage = testPin1.read();
monpjc 5:4438d5665b4f 251 //pc.printf("testVoltage1 = %f\n", testVoltage );
monpjc 5:4438d5665b4f 252 //testVoltage = testPin2.read();
monpjc 5:4438d5665b4f 253 //pc.printf("testVoltage2 = %f\n", testVoltage );
monpjc 5:4438d5665b4f 254 //testVoltage = testPin3.read();
monpjc 5:4438d5665b4f 255 //pc.printf("testVoltage3 = %f\n", testVoltage );
monpjc 5:4438d5665b4f 256 //testVoltage = testPin4.read();
monpjc 5:4438d5665b4f 257 //pc.printf("testVoltage4 = %f\n", testVoltage );
monpjc 5:4438d5665b4f 258 pc.printf("------------------------------------------------\n");
monpjc 5:4438d5665b4f 259
monpjc 0:17ad5a30ff25 260 }
monpjc 0:17ad5a30ff25 261 }