10Hz GPS, MEgasquirt, SD Card, ADxl345, 20x4 LCD datalogger

Dependencies:   ADXL345 10HzGPSdatalogger mbed

Committer:
jpnovak
Date:
Sat Nov 28 17:07:15 2015 +0000
Revision:
0:b8d7df90819e
10HzGPS Megasquirt adxl345 SD card LCD;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jpnovak 0:b8d7df90819e 1 //Code Designed to display run-time variables from a Megasquirt Fuel Injection controller.
jpnovak 0:b8d7df90819e 2 //This is the base code to load variables and print to LCD and write them to a file. File format is .FRD for import into EFI Analytics tuner Studio
jpnovak 0:b8d7df90819e 3
jpnovak 0:b8d7df90819e 4 #include "mbed.h"
jpnovak 0:b8d7df90819e 5 #include "gps.h" //////////////////////include for GPS Code /////////////////////////////
jpnovak 0:b8d7df90819e 6 #include "data.h" //////////////////////include for GPS Code /////////////////////////////
jpnovak 0:b8d7df90819e 7 #include "TextLCD.h"
jpnovak 0:b8d7df90819e 8 #include "SDFileSystem.h"
jpnovak 0:b8d7df90819e 9 #include "SerialBuffered.h"
jpnovak 0:b8d7df90819e 10 #include "ADXL345.h"
jpnovak 0:b8d7df90819e 11
jpnovak 0:b8d7df90819e 12
jpnovak 0:b8d7df90819e 13 //SD Card pin assignment
jpnovak 0:b8d7df90819e 14 SDFileSystem sd(p11, p12, p13, p14, "sd");//DI, D0, SCK, CS
jpnovak 0:b8d7df90819e 15
jpnovak 0:b8d7df90819e 16 //local file system.
jpnovak 0:b8d7df90819e 17
jpnovak 0:b8d7df90819e 18 LocalFileSystem local("local");
jpnovak 0:b8d7df90819e 19
jpnovak 0:b8d7df90819e 20
jpnovak 0:b8d7df90819e 21
jpnovak 0:b8d7df90819e 22 AnalogIn SDenable(p20);//define SD card switch
jpnovak 0:b8d7df90819e 23 DigitalOut myled1(LED1);//define LED
jpnovak 0:b8d7df90819e 24 Serial loggerSerial(USBTX, USBRX);
jpnovak 0:b8d7df90819e 25 Timer t;
jpnovak 0:b8d7df90819e 26
jpnovak 0:b8d7df90819e 27
jpnovak 0:b8d7df90819e 28 Serial pc(USBTX, USBRX);
jpnovak 0:b8d7df90819e 29 TextLCD lcd(p21, p22, p23, p24, p25, p26, p30, 20 ,4); //Define LCD pins
jpnovak 0:b8d7df90819e 30
jpnovak 0:b8d7df90819e 31
jpnovak 0:b8d7df90819e 32
jpnovak 0:b8d7df90819e 33 //Acclerometer - SparkFun ADXL345 16G pin assignment
jpnovak 0:b8d7df90819e 34 ADXL345 accelerometer(p5, p6, p7, p8); //SPI DI, D0, SCK, CS
jpnovak 0:b8d7df90819e 35
jpnovak 0:b8d7df90819e 36 //Serial usb(USBTX, USBRX); //define USB connection pins
jpnovak 0:b8d7df90819e 37 SerialBuffered megasquirt(120, p28, p27); // RS232 TX/RX that 120 is the size of the read buffer it will make for you
jpnovak 0:b8d7df90819e 38
jpnovak 0:b8d7df90819e 39 DigitalOut usb_activity(LED1); //define USB activity
jpnovak 0:b8d7df90819e 40 DigitalOut megasquirt_activity(LED2); //define Megasquirt activity
jpnovak 0:b8d7df90819e 41
jpnovak 0:b8d7df90819e 42
jpnovak 0:b8d7df90819e 43 int column;
jpnovak 0:b8d7df90819e 44 int row;
jpnovak 0:b8d7df90819e 45 int i;
jpnovak 0:b8d7df90819e 46 char c;
jpnovak 0:b8d7df90819e 47 int dataflag;
jpnovak 0:b8d7df90819e 48
jpnovak 0:b8d7df90819e 49 /////////////////////////////////////Define GPS Variables//////////////////////////////////
jpnovak 0:b8d7df90819e 50 float time1;
jpnovak 0:b8d7df90819e 51 char statusGPS;
jpnovak 0:b8d7df90819e 52 float Lat1;
jpnovak 0:b8d7df90819e 53 float Long1;
jpnovak 0:b8d7df90819e 54 char Lat_h1;
jpnovak 0:b8d7df90819e 55 char Long_h1;
jpnovak 0:b8d7df90819e 56 float time_GPS1;
jpnovak 0:b8d7df90819e 57 float speed_k1;
jpnovak 0:b8d7df90819e 58 float speed_mph1;
jpnovak 0:b8d7df90819e 59 float heading1;
jpnovak 0:b8d7df90819e 60
jpnovak 0:b8d7df90819e 61
jpnovak 0:b8d7df90819e 62 ///////////////////define buffers//////////////////////////
jpnovak 0:b8d7df90819e 63 unsigned char tmp_data[16];
jpnovak 0:b8d7df90819e 64 int tmp;
jpnovak 0:b8d7df90819e 65 unsigned char buf[120];
jpnovak 0:b8d7df90819e 66 float Time;
jpnovak 0:b8d7df90819e 67
jpnovak 0:b8d7df90819e 68
jpnovak 0:b8d7df90819e 69
jpnovak 0:b8d7df90819e 70 ////////////////////////////define MS variables////////////////////////
jpnovak 0:b8d7df90819e 71 long float SecL; //get secoonds
jpnovak 0:b8d7df90819e 72 long float PW;//get pulseWidth1
jpnovak 0:b8d7df90819e 73 long float PW2; //get pulseWidth2
jpnovak 0:b8d7df90819e 74 int RPM; //get Rpm
jpnovak 0:b8d7df90819e 75 int DutyCycle; //Injector Duty Cycle
jpnovak 0:b8d7df90819e 76 int DutyCycle2; //Injector Bank2 Duty Cycle
jpnovak 0:b8d7df90819e 77 long float SparkAdv; //get advance
jpnovak 0:b8d7df90819e 78 float squirt; //get squirt
jpnovak 0:b8d7df90819e 79 float Engine; //get squirt
jpnovak 0:b8d7df90819e 80 float afrtgt1; //get AFR target - Table 1
jpnovak 0:b8d7df90819e 81 float afrtgt2; //get AFR target - Table 2
jpnovak 0:b8d7df90819e 82 float wbo2_en1; //get WideBand Valid1
jpnovak 0:b8d7df90819e 83 float wbo2_en2; //get WideBand Valid2
jpnovak 0:b8d7df90819e 84 long float barometer; //get Barometer
jpnovak 0:b8d7df90819e 85 long float MAP; //get manifold absolute pressure MAP
jpnovak 0:b8d7df90819e 86 long float MAT; //get manifold absolute temperature (MAT)
jpnovak 0:b8d7df90819e 87 long float CLT; //get coolant temperature (CLT)
jpnovak 0:b8d7df90819e 88 long float TP; //get Throttle Position Sensor (TPS)
jpnovak 0:b8d7df90819e 89 long float vBatt; //get BAttery Voltage
jpnovak 0:b8d7df90819e 90 long float AFR; //get Realtime AFR for VE1
jpnovak 0:b8d7df90819e 91 long float AFR2; //get Realtime AFR for VE2
jpnovak 0:b8d7df90819e 92 long float knock; //get Knock Threshold Value
jpnovak 0:b8d7df90819e 93 long float Gego; //get egoCorrrection1 amount %
jpnovak 0:b8d7df90819e 94 long float Gego2; //get egoCorrrection2 amount %
jpnovak 0:b8d7df90819e 95 long float Gair; //get air correction (G_air)
jpnovak 0:b8d7df90819e 96 long float Gwarmup; //get Warmup Enrichment
jpnovak 0:b8d7df90819e 97 long float TPSacc; //get accel enrichment (ms)
jpnovak 0:b8d7df90819e 98 long float TPScut; //get TPS based fuel cut %
jpnovak 0:b8d7df90819e 99 long float Gbaro; //get baroCorrection %
jpnovak 0:b8d7df90819e 100 long float Gammae; //get gammaEnrich %
jpnovak 0:b8d7df90819e 101 long float veCurr1; //get Current VE value Table 1
jpnovak 0:b8d7df90819e 102 long float veCurr2; //get Current VE value Table 2
jpnovak 0:b8d7df90819e 103 long float IAC; //get IAC Step %
jpnovak 0:b8d7df90819e 104 long float ColdAdv; //get Cold Ignition Advance
jpnovak 0:b8d7df90819e 105 long float tpsDOT; //get Rate of Change TPS
jpnovak 0:b8d7df90819e 106 long float mapDOT; //get Rate of Change MAP
jpnovak 0:b8d7df90819e 107 long float Dwell; //get Ignition Dwell
jpnovak 0:b8d7df90819e 108 long float maf; //get MAF - Mass Air Flow
jpnovak 0:b8d7df90819e 109 long float fuelload; //get MAP/TPS Blend %
jpnovak 0:b8d7df90819e 110 long float Ethanol; //get fuel load percent alchohol
jpnovak 0:b8d7df90819e 111 char portstatus; //get Spare Port Status
jpnovak 0:b8d7df90819e 112 char knockRetard; //get Knock timing retard (deg)
jpnovak 0:b8d7df90819e 113 long float EAEFuelCorr; //get EAE Fuel correction
jpnovak 0:b8d7df90819e 114 long float egoV; //get egoV
jpnovak 0:b8d7df90819e 115 long float egoV2; //get egoV2
jpnovak 0:b8d7df90819e 116 char status1; //get Status1
jpnovak 0:b8d7df90819e 117 char status2; //get Status2
jpnovak 0:b8d7df90819e 118 char status3; //get Status3
jpnovak 0:b8d7df90819e 119 char status4; //get Status4
jpnovak 0:b8d7df90819e 120 long float looptime; //get looptime
jpnovak 0:b8d7df90819e 121 char status5; //get Status5
jpnovak 0:b8d7df90819e 122 long float tpsADC; //get tpsADC
jpnovak 0:b8d7df90819e 123 long float fuelload2; //get fuelload2
jpnovak 0:b8d7df90819e 124 long float ignload; //get ignload
jpnovak 0:b8d7df90819e 125 long float ignload2; //get ignload2
jpnovak 0:b8d7df90819e 126 char syncstatus; //get Sync-Status (0 - sync-error, 1 - syncstatus)
jpnovak 0:b8d7df90819e 127 float deltaT; //get deltaT
jpnovak 0:b8d7df90819e 128 long float wallfuel; //get wallfuel
jpnovak 0:b8d7df90819e 129
jpnovak 0:b8d7df90819e 130 int runtime;
jpnovak 0:b8d7df90819e 131 unsigned char data_out;
jpnovak 0:b8d7df90819e 132 int n;
jpnovak 0:b8d7df90819e 133 char MSII_288Header[] = {0x46,0x52,0x44,0x00,0x00,0x00,0x00,0x01,0x4b,0x61,0xf1,0x63,0x4d,0x53,0x49,0x49,0x20,0x52,0x65,0x76,0x20,0x32,0x2e,0x38,0x38,0x30,0x30,0x30,0x20,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x51,0x00,0x70};//file header
jpnovak 0:b8d7df90819e 134 char MSIIExtraHeader[] = {0x46,0x52,0x44,0x00,0x00,0x00,0x00,0x01,0x4b,0x6a,0xf3,0xa8,0x4d,0x53,0x32,0x45,0x78,0x74,0x72,0x61,0x20,0x52,0x65,0x6c,0x20,0x32,0x2e,0x31,0x2e,0x31,0x62,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x51,0x00,0x91};
jpnovak 0:b8d7df90819e 135 char parse_header[] = {0x01,0x00};//data header
jpnovak 0:b8d7df90819e 136
jpnovak 0:b8d7df90819e 137 //////////////////////////define accelerometer variables/////////////////////
jpnovak 0:b8d7df90819e 138 float x1;// new variable for math for acceleration parameters
jpnovak 0:b8d7df90819e 139 float y1;// new variable for math for acceleration parameters
jpnovak 0:b8d7df90819e 140 float z1;// new variable for math for acceleration parameters
jpnovak 0:b8d7df90819e 141 float x2;// new variable for math for acceleration parameters
jpnovak 0:b8d7df90819e 142 float y2;// new variable for math for acceleration parameters
jpnovak 0:b8d7df90819e 143 float z2;// new variable for math for acceleration parameters
jpnovak 0:b8d7df90819e 144
jpnovak 0:b8d7df90819e 145 /////////////////////////define accelerometer variables/////////////////////
jpnovak 0:b8d7df90819e 146 int readings[3] = {0, 0, 0};
jpnovak 0:b8d7df90819e 147 float XaccelADC;
jpnovak 0:b8d7df90819e 148 float YaccelADC;
jpnovak 0:b8d7df90819e 149 float ZaccelADC;
jpnovak 0:b8d7df90819e 150 float Xaccel_g;
jpnovak 0:b8d7df90819e 151 float Yaccel_g;
jpnovak 0:b8d7df90819e 152 float Zaccel_g;
jpnovak 0:b8d7df90819e 153
jpnovak 0:b8d7df90819e 154
jpnovak 0:b8d7df90819e 155
jpnovak 0:b8d7df90819e 156
jpnovak 0:b8d7df90819e 157 /*LCD 4x20 parallel code pin assignment*/
jpnovak 0:b8d7df90819e 158 //TextLCD lcd(p21, p22, p23, p24, p25, p26, p30, 20, 4); // (rs, rw, e, d0, d1, d2, d3, n_column, n_rows)
jpnovak 0:b8d7df90819e 159 //define file write
jpnovak 0:b8d7df90819e 160 //AnalogIn file_writeenable(p20);//define SD card switch
jpnovak 0:b8d7df90819e 161
jpnovak 0:b8d7df90819e 162
jpnovak 0:b8d7df90819e 163 //enter main loop
jpnovak 0:b8d7df90819e 164 int main()
jpnovak 0:b8d7df90819e 165 { ////start main program loop
jpnovak 0:b8d7df90819e 166
jpnovak 0:b8d7df90819e 167 //Acceleromater setup
jpnovak 0:b8d7df90819e 168
jpnovak 0:b8d7df90819e 169 //Go into standby mode to configure the device.
jpnovak 0:b8d7df90819e 170 accelerometer.setPowerControl(0x00);
jpnovak 0:b8d7df90819e 171
jpnovak 0:b8d7df90819e 172 //Full resolution, +/-16g, 4mg/LSB.
jpnovak 0:b8d7df90819e 173 accelerometer.setDataFormatControl(0x0B);
jpnovak 0:b8d7df90819e 174
jpnovak 0:b8d7df90819e 175 //3.2kHz data rate.
jpnovak 0:b8d7df90819e 176 accelerometer.setDataRate(ADXL345_3200HZ);
jpnovak 0:b8d7df90819e 177
jpnovak 0:b8d7df90819e 178 //Measurement mode.
jpnovak 0:b8d7df90819e 179 accelerometer.setPowerControl(0x08);
jpnovak 0:b8d7df90819e 180
jpnovak 0:b8d7df90819e 181
jpnovak 0:b8d7df90819e 182 ///////////////////////////GPS setup////////////////////
jpnovak 0:b8d7df90819e 183
jpnovak 0:b8d7df90819e 184
jpnovak 0:b8d7df90819e 185 pc.baud(115200);
jpnovak 0:b8d7df90819e 186 gps.baud(115200); //////////////////////include for GPS Code /////////////////////////////
jpnovak 0:b8d7df90819e 187
jpnovak 0:b8d7df90819e 188
jpnovak 0:b8d7df90819e 189 /////Startup Screen////////////
jpnovak 0:b8d7df90819e 190 lcd.cls();
jpnovak 0:b8d7df90819e 191 //lcd.init_Display();
jpnovak 0:b8d7df90819e 192 //DigitalOut myled(LED1);
jpnovak 0:b8d7df90819e 193 lcd.cls();
jpnovak 0:b8d7df90819e 194 lcd.printf(" Dashview V3 ");
jpnovak 0:b8d7df90819e 195 wait(1.5);
jpnovak 0:b8d7df90819e 196 lcd.cls();
jpnovak 0:b8d7df90819e 197 lcd.printf(" Hello ");
jpnovak 0:b8d7df90819e 198 wait(0.5);
jpnovak 0:b8d7df90819e 199 lcd.locate(0,1);
jpnovak 0:b8d7df90819e 200 lcd.printf("Have A Great Drive");
jpnovak 0:b8d7df90819e 201 wait(2.0);
jpnovak 0:b8d7df90819e 202 lcd.cls();
jpnovak 0:b8d7df90819e 203
jpnovak 0:b8d7df90819e 204
jpnovak 0:b8d7df90819e 205 ////////////End Startup Screen//////////
jpnovak 0:b8d7df90819e 206
jpnovak 0:b8d7df90819e 207
jpnovak 0:b8d7df90819e 208
jpnovak 0:b8d7df90819e 209 megasquirt.baud(115200); //define MEgasquirt serial speed
jpnovak 0:b8d7df90819e 210 loggerSerial.baud(115200); //define connection speed
jpnovak 0:b8d7df90819e 211
jpnovak 0:b8d7df90819e 212 // unsigned char tmp;
jpnovak 0:b8d7df90819e 213 // unsigned char data_in;
jpnovak 0:b8d7df90819e 214
jpnovak 0:b8d7df90819e 215
jpnovak 0:b8d7df90819e 216 /////////file header setup
jpnovak 0:b8d7df90819e 217 /////Setup file header for Datalog.
jpnovak 0:b8d7df90819e 218 /////File header is comma delimited for import to Excel or most video editing software overaly.
jpnovak 0:b8d7df90819e 219
jpnovak 0:b8d7df90819e 220 FILE *fp = fopen("/sd/datalog.csv", "a");
jpnovak 0:b8d7df90819e 221 //print header for MS.csv file
jpnovak 0:b8d7df90819e 222 fprintf(fp, "MSII Rev 2.88000, \ntime1,Lat1,Long1,speed_mph1,heading1,Xaccel_g, Yaccel_g, Zaccel_g,\n");
jpnovak 0:b8d7df90819e 223 fclose(fp);
jpnovak 0:b8d7df90819e 224
jpnovak 0:b8d7df90819e 225 t.start();
jpnovak 0:b8d7df90819e 226 dataflag=0;
jpnovak 0:b8d7df90819e 227 i = 0;
jpnovak 0:b8d7df90819e 228 while (1) { ///start functional loop
jpnovak 0:b8d7df90819e 229
jpnovak 0:b8d7df90819e 230 ////////turn on swtich to Pin 20 to write to SD card///////////////
jpnovak 0:b8d7df90819e 231 ////////file formate is .csv for import into Excel and also MegaLog Viewer
jpnovak 0:b8d7df90819e 232 if (SDenable > 0.5) { //switch enable = ON
jpnovak 0:b8d7df90819e 233 dataflag = 1;
jpnovak 0:b8d7df90819e 234 myled1 = 1;
jpnovak 0:b8d7df90819e 235 // printf("Opening File...\n"); // Drive should be marked as removed
jpnovak 0:b8d7df90819e 236 FILE *fp = fopen("/sd/datalog.csv", "a"); ///open file
jpnovak 0:b8d7df90819e 237 //write xls buffer from Megasquirt
jpnovak 0:b8d7df90819e 238
jpnovak 0:b8d7df90819e 239 if(fp == NULL) {
jpnovak 0:b8d7df90819e 240 error("Could not open file for write\n");
jpnovak 0:b8d7df90819e 241 }
jpnovak 0:b8d7df90819e 242 //if (dataflag == 1) {
jpnovak 0:b8d7df90819e 243 ///////Begin Dataflag loop//////////////////
jpnovak 0:b8d7df90819e 244
jpnovak 0:b8d7df90819e 245 // for (i = 0; i<5 ; i++)
jpnovak 0:b8d7df90819e 246 //{
jpnovak 0:b8d7df90819e 247 ///start for loop count
jpnovak 0:b8d7df90819e 248 /////////////////BEGIN DATA COLLECTION LOOP #1/////////////////////////////////////
jpnovak 0:b8d7df90819e 249
jpnovak 0:b8d7df90819e 250 ///////////////////////////////GPS Code/////////////////////////////////////
jpnovak 0:b8d7df90819e 251
jpnovak 0:b8d7df90819e 252 getGPSstring(1);
jpnovak 0:b8d7df90819e 253
jpnovak 0:b8d7df90819e 254 ///////convert string format to floating to perform math functions /////////////////////
jpnovak 0:b8d7df90819e 255 if (sscanf(gpsString, "$GPRMC,%s",rmc1) >= 1) {
jpnovak 0:b8d7df90819e 256 sep = 0;
jpnovak 0:b8d7df90819e 257 parseRMC();
jpnovak 0:b8d7df90819e 258 sscanf(time_GPS, "%f", &time1);
jpnovak 0:b8d7df90819e 259 sscanf(status, "%c", &statusGPS);
jpnovak 0:b8d7df90819e 260 sscanf(Lat, "%f", &Lat1);
jpnovak 0:b8d7df90819e 261 sscanf(Lat_h, "%c", &Lat_h1);
jpnovak 0:b8d7df90819e 262 sscanf(Long, "%f", &Long1);
jpnovak 0:b8d7df90819e 263 sscanf(Long_h, "%c", &Long_h1);
jpnovak 0:b8d7df90819e 264 sscanf(time_GPS, "%f", &time_GPS1);
jpnovak 0:b8d7df90819e 265 sscanf(speed_k, "%f", &speed_k1);
jpnovak 0:b8d7df90819e 266 sscanf(heading, "%f", &heading1);
jpnovak 0:b8d7df90819e 267
jpnovak 0:b8d7df90819e 268 }
jpnovak 0:b8d7df90819e 269
jpnovak 0:b8d7df90819e 270
jpnovak 0:b8d7df90819e 271 speed_mph1 = speed_k1 * 1.15077; ////convert Knots to mph
jpnovak 0:b8d7df90819e 272 Lat1 = Lat1/100; /////Convert format for google maps overlay
jpnovak 0:b8d7df90819e 273 Long1 = Long1/-100; /////Convert format for google maps overlay
jpnovak 0:b8d7df90819e 274
jpnovak 0:b8d7df90819e 275 lcd.locate(10,1);
jpnovak 0:b8d7df90819e 276 lcd.printf("Spd:%4.1f", speed_mph1);
jpnovak 0:b8d7df90819e 277 //pc.printf("time:%8.1f Lat:%9.6f Long:%9.6f Spd:%4.1f heading:%5.1f \r\n",time1,Lat1,Long1,speed_mph1,heading1);
jpnovak 0:b8d7df90819e 278
jpnovak 0:b8d7df90819e 279
jpnovak 0:b8d7df90819e 280 ///////////////////////////////////End GPS Code///////////////////////////////////////////////
jpnovak 0:b8d7df90819e 281
jpnovak 0:b8d7df90819e 282
jpnovak 0:b8d7df90819e 283
jpnovak 0:b8d7df90819e 284 ///////////////Accelerometer code begin here////////////////////////////////////
jpnovak 0:b8d7df90819e 285 {
jpnovak 0:b8d7df90819e 286 accelerometer.getOutput(readings);
jpnovak 0:b8d7df90819e 287
jpnovak 0:b8d7df90819e 288 XaccelADC = (int16_t)readings[0];
jpnovak 0:b8d7df90819e 289 YaccelADC = (int16_t)readings[1];
jpnovak 0:b8d7df90819e 290 ZaccelADC = (int16_t)readings[2];
jpnovak 0:b8d7df90819e 291
jpnovak 0:b8d7df90819e 292 Xaccel_g = (XaccelADC/256);
jpnovak 0:b8d7df90819e 293 Yaccel_g = (YaccelADC/256);
jpnovak 0:b8d7df90819e 294 Zaccel_g = (ZaccelADC/256);
jpnovak 0:b8d7df90819e 295
jpnovak 0:b8d7df90819e 296
jpnovak 0:b8d7df90819e 297 // uncommment to display Accelerometer
jpnovak 0:b8d7df90819e 298
jpnovak 0:b8d7df90819e 299
jpnovak 0:b8d7df90819e 300 // lcd.locate(0,0);/// define LCD location
jpnovak 0:b8d7df90819e 301 // lcd.printf("%4.2f, %4.2f, %4.2f", Xaccel_g, Yaccel_g, Zaccel_g);
jpnovak 0:b8d7df90819e 302
jpnovak 0:b8d7df90819e 303 ///////Lateral Acceleration bar Graph ///////////////////////
jpnovak 0:b8d7df90819e 304
jpnovak 0:b8d7df90819e 305 ///////////////X-direction accleration bar graph/////////////////
jpnovak 0:b8d7df90819e 306 /*
jpnovak 0:b8d7df90819e 307 x1 = Xaccel_g * 10;//scale one g to display resolution
jpnovak 0:b8d7df90819e 308 if (x1 < 0);//for negative g values
jpnovak 0:b8d7df90819e 309 {
jpnovak 0:b8d7df90819e 310 x2 = 10 + x1;//offset negative values for positive graph
jpnovak 0:b8d7df90819e 311 lcd.locate(0,3); /// define LCD location
jpnovak 0:b8d7df90819e 312 for (i=0; i<10; i++) {
jpnovak 0:b8d7df90819e 313 if (i < x2) lcd.putc(0x20);//write single space character
jpnovak 0:b8d7df90819e 314 else lcd.putc(0xFF);//write single clock space
jpnovak 0:b8d7df90819e 315 }
jpnovak 0:b8d7df90819e 316 }
jpnovak 0:b8d7df90819e 317
jpnovak 0:b8d7df90819e 318 if (x1 > 0);//for positive g values
jpnovak 0:b8d7df90819e 319 {
jpnovak 0:b8d7df90819e 320 lcd.locate(10,3);/// define LCD location
jpnovak 0:b8d7df90819e 321 for (i=0; i<10; i++) {
jpnovak 0:b8d7df90819e 322 if (i < x1) lcd.putc(0xFF);//write single block character
jpnovak 0:b8d7df90819e 323 else lcd.putc(0x20);//write single blank space
jpnovak 0:b8d7df90819e 324 }
jpnovak 0:b8d7df90819e 325 }
jpnovak 0:b8d7df90819e 326 */
jpnovak 0:b8d7df90819e 327 ////////////Forward/Braking Acceleration bar Graph ///////////////////////
jpnovak 0:b8d7df90819e 328 y1 = Yaccel_g * 10;//scale one g to display resolution
jpnovak 0:b8d7df90819e 329 if (y1 < 0);//for negative g values
jpnovak 0:b8d7df90819e 330 {
jpnovak 0:b8d7df90819e 331 y2 = 10 + y1;//offset negative values for positive graph
jpnovak 0:b8d7df90819e 332 lcd.locate(0,3); /// define LCD location
jpnovak 0:b8d7df90819e 333 for (i=0; i<10; i++) {
jpnovak 0:b8d7df90819e 334 if (i < y2) lcd.putc(0x20);//write single space character
jpnovak 0:b8d7df90819e 335 else lcd.putc(0xFF);//write single clock space
jpnovak 0:b8d7df90819e 336 }
jpnovak 0:b8d7df90819e 337 }
jpnovak 0:b8d7df90819e 338
jpnovak 0:b8d7df90819e 339 if (y1 > 0);//for positive g values
jpnovak 0:b8d7df90819e 340 {
jpnovak 0:b8d7df90819e 341 lcd.locate(10,3);/// define LCD location
jpnovak 0:b8d7df90819e 342 for (i=0; i<10; i++) {
jpnovak 0:b8d7df90819e 343 if (i < y1) lcd.putc(0xFF);//write single block character
jpnovak 0:b8d7df90819e 344 else lcd.putc(0x20);//write single blank space
jpnovak 0:b8d7df90819e 345 }
jpnovak 0:b8d7df90819e 346 }
jpnovak 0:b8d7df90819e 347 ////////////End Accelerometer code //////////////////////////////////////////////
jpnovak 0:b8d7df90819e 348
jpnovak 0:b8d7df90819e 349
jpnovak 0:b8d7df90819e 350
jpnovak 0:b8d7df90819e 351
jpnovak 0:b8d7df90819e 352
jpnovak 0:b8d7df90819e 353
jpnovak 0:b8d7df90819e 354 fprintf(fp, "%.3f, %9.6f, %9.6f, %3.1f,%4.1f, %.3f, %.3f, %.3f", time1,Lat1,Long1,speed_mph1,heading1,Xaccel_g, Yaccel_g, Zaccel_g);
jpnovak 0:b8d7df90819e 355 pc.printf("%.3f, %9.6f, %9.6f, %3.1f,%4.1f, %.3f, %.3f, %.3f, \r\n", time1,Lat1,Long1,speed_mph1,heading1,Xaccel_g, Yaccel_g, Zaccel_g);
jpnovak 0:b8d7df90819e 356 ////////Get Megasquirt Runtime data buffer//////////////
jpnovak 0:b8d7df90819e 357
jpnovak 0:b8d7df90819e 358
jpnovak 0:b8d7df90819e 359 //poll serial device for data stream (a,0,6) to (request, return, confirm)
jpnovak 0:b8d7df90819e 360 megasquirt.putc(97);//send 97 for run parameters, 83 for board revision, 81 code for revision number
jpnovak 0:b8d7df90819e 361 wait(0.005);
jpnovak 0:b8d7df90819e 362 megasquirt.putc(0);
jpnovak 0:b8d7df90819e 363 wait(0.005);
jpnovak 0:b8d7df90819e 364 megasquirt.putc(6);
jpnovak 0:b8d7df90819e 365 int actuallyRead = megasquirt.readBytes( buf, 112); // where 112 is the number of bytes you are expecting from MSII outpc buffer
jpnovak 0:b8d7df90819e 366
jpnovak 0:b8d7df90819e 367
jpnovak 0:b8d7df90819e 368 //decodeMS Runtime Data Buffer();
jpnovak 0:b8d7df90819e 369
jpnovak 0:b8d7df90819e 370 Time = t.read();//read value from timer in ms
jpnovak 0:b8d7df90819e 371
jpnovak 0:b8d7df90819e 372 ////////Decode MS Runtime Data Buffer////
jpnovak 0:b8d7df90819e 373
jpnovak 0:b8d7df90819e 374 ////The following code will parse the runtime data buffer from MSExtra-2
jpnovak 0:b8d7df90819e 375 //Position of the runtime bits given on msextra.com
jpnovak 0:b8d7df90819e 376 //Scalar math completed where known
jpnovak 0:b8d7df90819e 377
jpnovak 0:b8d7df90819e 378 //get seconds - runtime of MS
jpnovak 0:b8d7df90819e 379 tmp = buf[0];
jpnovak 0:b8d7df90819e 380 tmp = tmp << 8;
jpnovak 0:b8d7df90819e 381 SecL = tmp | buf[1];
jpnovak 0:b8d7df90819e 382 //MSseconds = MSseconds/256;
jpnovak 0:b8d7df90819e 383 //get pulseWidth1
jpnovak 0:b8d7df90819e 384 tmp = buf[2];
jpnovak 0:b8d7df90819e 385 tmp = tmp << 8;
jpnovak 0:b8d7df90819e 386 tmp = tmp | buf[3];
jpnovak 0:b8d7df90819e 387 PW = tmp*0.000666;
jpnovak 0:b8d7df90819e 388
jpnovak 0:b8d7df90819e 389
jpnovak 0:b8d7df90819e 390 //get pulseWidth2
jpnovak 0:b8d7df90819e 391 tmp = buf[4];
jpnovak 0:b8d7df90819e 392 tmp = tmp << 8;
jpnovak 0:b8d7df90819e 393 tmp = tmp | buf[5];
jpnovak 0:b8d7df90819e 394 PW2 = tmp*0.000666;
jpnovak 0:b8d7df90819e 395 //get Rpm
jpnovak 0:b8d7df90819e 396 tmp = buf[6];
jpnovak 0:b8d7df90819e 397 tmp = tmp << 8;
jpnovak 0:b8d7df90819e 398 RPM = tmp | buf[7];
jpnovak 0:b8d7df90819e 399
jpnovak 0:b8d7df90819e 400 //Calculate DutyCycle
jpnovak 0:b8d7df90819e 401 DutyCycle = (PW * (RPM / 60)) / 10;
jpnovak 0:b8d7df90819e 402
jpnovak 0:b8d7df90819e 403 //Calculate DutyCycle2
jpnovak 0:b8d7df90819e 404 DutyCycle2 = (PW2 * (RPM / 60)) / 10;
jpnovak 0:b8d7df90819e 405
jpnovak 0:b8d7df90819e 406
jpnovak 0:b8d7df90819e 407 //get advance
jpnovak 0:b8d7df90819e 408 tmp = buf[8];
jpnovak 0:b8d7df90819e 409 tmp = tmp << 8;
jpnovak 0:b8d7df90819e 410 tmp = tmp | buf[9];
jpnovak 0:b8d7df90819e 411 SparkAdv = tmp/10;
jpnovak 0:b8d7df90819e 412
jpnovak 0:b8d7df90819e 413 //get manifold absolute pressure MAP
jpnovak 0:b8d7df90819e 414 tmp = buf[18];
jpnovak 0:b8d7df90819e 415 tmp = tmp << 8;
jpnovak 0:b8d7df90819e 416 MAP = tmp | buf[19];
jpnovak 0:b8d7df90819e 417 MAP = MAP/10;
jpnovak 0:b8d7df90819e 418 //get manifold absolute temperature (MAT)
jpnovak 0:b8d7df90819e 419 tmp = buf[20];
jpnovak 0:b8d7df90819e 420 tmp = tmp << 8;
jpnovak 0:b8d7df90819e 421 MAT = tmp | buf[21];
jpnovak 0:b8d7df90819e 422 MAT = MAT/10; ///for Farenheit
jpnovak 0:b8d7df90819e 423 // MAT = 0.555*(MAT - 32); //for Celcius
jpnovak 0:b8d7df90819e 424 //get coolant temperature (CLT)
jpnovak 0:b8d7df90819e 425 tmp = buf[22];
jpnovak 0:b8d7df90819e 426 tmp = tmp << 8;
jpnovak 0:b8d7df90819e 427 CLT = tmp | buf[23];
jpnovak 0:b8d7df90819e 428 CLT = CLT/10;
jpnovak 0:b8d7df90819e 429 //CLT = 0.555*(CLT - 32); //for Celciuss
jpnovak 0:b8d7df90819e 430 //get Throttle Position Sensor (TPS)
jpnovak 0:b8d7df90819e 431 tmp = buf[24];
jpnovak 0:b8d7df90819e 432 tmp = tmp << 8;
jpnovak 0:b8d7df90819e 433 TP = tmp | buf[25];
jpnovak 0:b8d7df90819e 434 TP = TP / 10;
jpnovak 0:b8d7df90819e 435 //get BAttery Voltage
jpnovak 0:b8d7df90819e 436 tmp = buf[26];
jpnovak 0:b8d7df90819e 437 tmp = tmp << 8;
jpnovak 0:b8d7df90819e 438 vBatt = tmp | buf[27];
jpnovak 0:b8d7df90819e 439 vBatt = vBatt /10,
jpnovak 0:b8d7df90819e 440 //get Realtime AFR for VE1
jpnovak 0:b8d7df90819e 441 tmp = buf[28];
jpnovak 0:b8d7df90819e 442 tmp = tmp << 8;
jpnovak 0:b8d7df90819e 443 AFR = tmp | buf[29];
jpnovak 0:b8d7df90819e 444 AFR = AFR /10;
jpnovak 0:b8d7df90819e 445 //
jpnovak 0:b8d7df90819e 446 /////////////// Print Display Variables //////////////////
jpnovak 0:b8d7df90819e 447
jpnovak 0:b8d7df90819e 448
jpnovak 0:b8d7df90819e 449
jpnovak 0:b8d7df90819e 450 ///print bargraph of TPS
jpnovak 0:b8d7df90819e 451 /* lcd.locate(15,1);
jpnovak 0:b8d7df90819e 452 // for (i=0; i<20; i++){
jpnovak 0:b8d7df90819e 453 // if (i<TPS) lcd.printf(0xFF);
jpnovak 0:b8d7df90819e 454 // else lcd.printf(0x20);
jpnovak 0:b8d7df90819e 455 // }
jpnovak 0:b8d7df90819e 456 lcd.printf("%i ",TPS);
jpnovak 0:b8d7df90819e 457 */
jpnovak 0:b8d7df90819e 458
jpnovak 0:b8d7df90819e 459 //get Rpm
jpnovak 0:b8d7df90819e 460
jpnovak 0:b8d7df90819e 461 lcd.locate(0,0);
jpnovak 0:b8d7df90819e 462 lcd.printf("RPM= %i ",RPM);
jpnovak 0:b8d7df90819e 463
jpnovak 0:b8d7df90819e 464 //get AFR
jpnovak 0:b8d7df90819e 465
jpnovak 0:b8d7df90819e 466 //AFR = tmp/10;
jpnovak 0:b8d7df90819e 467 lcd.locate(10,0);
jpnovak 0:b8d7df90819e 468 lcd.printf("AFR= %4.1f", AFR);
jpnovak 0:b8d7df90819e 469
jpnovak 0:b8d7df90819e 470 //get Map
jpnovak 0:b8d7df90819e 471
jpnovak 0:b8d7df90819e 472 //MAP = MAP/10;
jpnovak 0:b8d7df90819e 473 ///will print MAP at atmospheric and Boost on turbo (Bar)
jpnovak 0:b8d7df90819e 474 if (MAP >100) {
jpnovak 0:b8d7df90819e 475 MAP = (MAP - 100)/100;
jpnovak 0:b8d7df90819e 476 lcd.locate (0,1);
jpnovak 0:b8d7df90819e 477 lcd.printf("%.1f Bar",MAP);
jpnovak 0:b8d7df90819e 478 } else {
jpnovak 0:b8d7df90819e 479 lcd.locate(0,1);
jpnovak 0:b8d7df90819e 480 lcd.printf("MAP= %4.1f", MAP);
jpnovak 0:b8d7df90819e 481 }
jpnovak 0:b8d7df90819e 482
jpnovak 0:b8d7df90819e 483 //get Clt
jpnovak 0:b8d7df90819e 484
jpnovak 0:b8d7df90819e 485 //CLT = CLT/10;
jpnovak 0:b8d7df90819e 486 lcd.locate(0,2);
jpnovak 0:b8d7df90819e 487 if (CLT < 120) {
jpnovak 0:b8d7df90819e 488 lcd.printf(" Warm Up ");
jpnovak 0:b8d7df90819e 489 } else {
jpnovak 0:b8d7df90819e 490 lcd.printf("CLT= %4.1f", CLT);
jpnovak 0:b8d7df90819e 491 }
jpnovak 0:b8d7df90819e 492
jpnovak 0:b8d7df90819e 493 //get MAT
jpnovak 0:b8d7df90819e 494 lcd.locate(10,2);
jpnovak 0:b8d7df90819e 495 lcd.printf("MAT= %4.1f", MAT);
jpnovak 0:b8d7df90819e 496
jpnovak 0:b8d7df90819e 497 //////////////Template to print variable///////////
jpnovak 0:b8d7df90819e 498 //Use code to add variable to display output /////
jpnovak 0:b8d7df90819e 499 /*
jpnovak 0:b8d7df90819e 500 //get Variable
jpnovak 0:b8d7df90819e 501
jpnovak 0:b8d7df90819e 502 //MAP = MAP/10;
jpnovak 0:b8d7df90819e 503 lcd.locate(10,1); position on LCD
jpnovak 0:b8d7df90819e 504 lcd.printf("Variable= %4.1f", Variable); //format print X.Y is number of data characters total and how many are past decimal point
jpnovak 0:b8d7df90819e 505
jpnovak 0:b8d7df90819e 506 */
jpnovak 0:b8d7df90819e 507 /////////////////////////end MS Code////////////////////////////////
jpnovak 0:b8d7df90819e 508 fprintf(fp, "%8.3f, %i, %4.1f, %3f, %4.1f, %4.1f, %5.1f, %5.1f, %f, %.3f, %.3f,\r\n", Time, RPM, MAP, TP, vBatt, AFR, MAT, CLT, PW, DutyCycle, SparkAdv);
jpnovak 0:b8d7df90819e 509
jpnovak 0:b8d7df90819e 510 /////////////////END DATA COLLECTION LOOP #1/////////////////////////////////////
jpnovak 0:b8d7df90819e 511
jpnovak 0:b8d7df90819e 512
jpnovak 0:b8d7df90819e 513
jpnovak 0:b8d7df90819e 514 } ///end for loop count
jpnovak 0:b8d7df90819e 515
jpnovak 0:b8d7df90819e 516
jpnovak 0:b8d7df90819e 517
jpnovak 0:b8d7df90819e 518 //pc.printf("print complete");//debug statement
jpnovak 0:b8d7df90819e 519
jpnovak 0:b8d7df90819e 520 ///////end Dataflag loop//////////////////
jpnovak 0:b8d7df90819e 521
jpnovak 0:b8d7df90819e 522
jpnovak 0:b8d7df90819e 523
jpnovak 0:b8d7df90819e 524
jpnovak 0:b8d7df90819e 525 //pc.printf("close file"); // debug statement
jpnovak 0:b8d7df90819e 526
jpnovak 0:b8d7df90819e 527 fclose(fp); ///close file
jpnovak 0:b8d7df90819e 528 dataflag = 0; //close flag and reset counter
jpnovak 0:b8d7df90819e 529 i=0; ///reset counter i
jpnovak 0:b8d7df90819e 530 ///end datalog - return to function
jpnovak 0:b8d7df90819e 531
jpnovak 0:b8d7df90819e 532
jpnovak 0:b8d7df90819e 533 } // end switch enable loop
jpnovak 0:b8d7df90819e 534
jpnovak 0:b8d7df90819e 535 //
jpnovak 0:b8d7df90819e 536 // else //If switch NOT enabled begin else loop 2
jpnovak 0:b8d7df90819e 537
jpnovak 0:b8d7df90819e 538 // {
jpnovak 0:b8d7df90819e 539 myled1 = 0;
jpnovak 0:b8d7df90819e 540 /////////////////BEGIN DATA COLLECTION LOOP #2/////////////////////////////////////
jpnovak 0:b8d7df90819e 541
jpnovak 0:b8d7df90819e 542
jpnovak 0:b8d7df90819e 543 ///////////////////////////////GPS Code/////////////////////////////////////
jpnovak 0:b8d7df90819e 544 getGPSstring(1);
jpnovak 0:b8d7df90819e 545
jpnovak 0:b8d7df90819e 546 ///////convert string format to floating to perform math functions /////////////////////
jpnovak 0:b8d7df90819e 547 if (sscanf(gpsString, "$GPRMC,%s",rmc1) >= 1) {
jpnovak 0:b8d7df90819e 548 sep = 0;
jpnovak 0:b8d7df90819e 549 parseRMC();
jpnovak 0:b8d7df90819e 550 sscanf(time_GPS, "%f", &time1);
jpnovak 0:b8d7df90819e 551 sscanf(Lat, "%f", &Lat1);
jpnovak 0:b8d7df90819e 552 sscanf(Lat_h, "%c", &Lat_h1);
jpnovak 0:b8d7df90819e 553 sscanf(Long, "%f", &Long1);
jpnovak 0:b8d7df90819e 554 sscanf(Long_h, "%c", &Long_h1);
jpnovak 0:b8d7df90819e 555 sscanf(time_GPS, "%f", &time_GPS1);
jpnovak 0:b8d7df90819e 556 sscanf(speed_k, "%f", &speed_k1);
jpnovak 0:b8d7df90819e 557 sscanf(heading, "%f", &heading1);
jpnovak 0:b8d7df90819e 558
jpnovak 0:b8d7df90819e 559 }
jpnovak 0:b8d7df90819e 560
jpnovak 0:b8d7df90819e 561
jpnovak 0:b8d7df90819e 562 speed_mph1 = speed_k1 * 1.15077; ////convert Knots to mph
jpnovak 0:b8d7df90819e 563 Lat1 = Lat1/100; /////Convert format for google maps overlay
jpnovak 0:b8d7df90819e 564 Long1 = Long1/-100; /////Convert format for google maps overlay
jpnovak 0:b8d7df90819e 565
jpnovak 0:b8d7df90819e 566 lcd.locate(10,1);
jpnovak 0:b8d7df90819e 567 lcd.printf("Spd:%4.1f ", speed_mph1);
jpnovak 0:b8d7df90819e 568 //pc.printf("time:%8.1f Lat:%9.6f Long:%9.6f Spd:%4.1f heading:%5.1f %.3f, %.3f, %.3f \r\n",time1,Lat1,Long1,speed_mph1,heading1,Xaccel_g, Yaccel_g, Zaccel_g, );
jpnovak 0:b8d7df90819e 569
jpnovak 0:b8d7df90819e 570 ///////////////////////////////////End GPS Code///////////////////////////////////////////////
jpnovak 0:b8d7df90819e 571
jpnovak 0:b8d7df90819e 572
jpnovak 0:b8d7df90819e 573 ///////////////Accelerometer code begin here////////////////////////////////////
jpnovak 0:b8d7df90819e 574
jpnovak 0:b8d7df90819e 575 accelerometer.getOutput(readings);
jpnovak 0:b8d7df90819e 576
jpnovak 0:b8d7df90819e 577 XaccelADC = (int16_t)readings[0];
jpnovak 0:b8d7df90819e 578 YaccelADC = (int16_t)readings[1];
jpnovak 0:b8d7df90819e 579 ZaccelADC = (int16_t)readings[2];
jpnovak 0:b8d7df90819e 580
jpnovak 0:b8d7df90819e 581 Xaccel_g = (XaccelADC/256);
jpnovak 0:b8d7df90819e 582 Yaccel_g = (YaccelADC/256);
jpnovak 0:b8d7df90819e 583 Zaccel_g = (ZaccelADC/256);
jpnovak 0:b8d7df90819e 584
jpnovak 0:b8d7df90819e 585
jpnovak 0:b8d7df90819e 586 // uncommment to display Accelerometer
jpnovak 0:b8d7df90819e 587
jpnovak 0:b8d7df90819e 588
jpnovak 0:b8d7df90819e 589 // lcd.locate(0,0);/// define LCD location
jpnovak 0:b8d7df90819e 590 // lcd.printf("%4.2f, %4.2f, %4.2f", Xaccel_g, Yaccel_g, Zaccel_g);
jpnovak 0:b8d7df90819e 591
jpnovak 0:b8d7df90819e 592 ///////Lateral Acceleration bar Graph ///////////////////////
jpnovak 0:b8d7df90819e 593
jpnovak 0:b8d7df90819e 594 ///////////////X-direction accleration bar graph/////////////////
jpnovak 0:b8d7df90819e 595 /*
jpnovak 0:b8d7df90819e 596 x1 = Xaccel_g * 10;//scale one g to display resolution
jpnovak 0:b8d7df90819e 597 if (x1 < 0);//for negative g values
jpnovak 0:b8d7df90819e 598 {
jpnovak 0:b8d7df90819e 599 x2 = 10 + x1;//offset negative values for positive graph
jpnovak 0:b8d7df90819e 600 lcd.locate(0,3); /// define LCD location
jpnovak 0:b8d7df90819e 601 for (i=0; i<10; i++) {
jpnovak 0:b8d7df90819e 602 if (i < x2) lcd.putc(0x20);//write single space character
jpnovak 0:b8d7df90819e 603 else lcd.putc(0xFF);//write single clock space
jpnovak 0:b8d7df90819e 604 }
jpnovak 0:b8d7df90819e 605 }
jpnovak 0:b8d7df90819e 606
jpnovak 0:b8d7df90819e 607 if (x1 > 0);//for positive g values
jpnovak 0:b8d7df90819e 608 {
jpnovak 0:b8d7df90819e 609 lcd.locate(10,3);/// define LCD location
jpnovak 0:b8d7df90819e 610 for (i=0; i<10; i++) {
jpnovak 0:b8d7df90819e 611 if (i < x1) lcd.putc(0xFF);//write single block character
jpnovak 0:b8d7df90819e 612 else lcd.putc(0x20);//write single blank space
jpnovak 0:b8d7df90819e 613 }
jpnovak 0:b8d7df90819e 614 }
jpnovak 0:b8d7df90819e 615 */
jpnovak 0:b8d7df90819e 616 ////////////Forward/Braking Acceleration bar Graph ///////////////////////
jpnovak 0:b8d7df90819e 617 y1 = Yaccel_g * 10;//scale one g to display resolution
jpnovak 0:b8d7df90819e 618 if (y1 < 0);//for negative g values
jpnovak 0:b8d7df90819e 619 {
jpnovak 0:b8d7df90819e 620 y2 = 10 + y1;//offset negative values for positive graph
jpnovak 0:b8d7df90819e 621 lcd.locate(0,3); /// define LCD location
jpnovak 0:b8d7df90819e 622 for (i=0; i<10; i++) {
jpnovak 0:b8d7df90819e 623 if (i < y2) lcd.putc(0x20);//write single space character
jpnovak 0:b8d7df90819e 624 else lcd.putc(0xFF);//write single clock space
jpnovak 0:b8d7df90819e 625 }
jpnovak 0:b8d7df90819e 626 }
jpnovak 0:b8d7df90819e 627
jpnovak 0:b8d7df90819e 628 if (y1 > 0);//for positive g values
jpnovak 0:b8d7df90819e 629 {
jpnovak 0:b8d7df90819e 630 lcd.locate(10,3);/// define LCD location
jpnovak 0:b8d7df90819e 631 for (i=0; i<10; i++) {
jpnovak 0:b8d7df90819e 632 if (i < y1) lcd.putc(0xFF);//write single block character
jpnovak 0:b8d7df90819e 633 else lcd.putc(0x20);//write single blank space
jpnovak 0:b8d7df90819e 634 }
jpnovak 0:b8d7df90819e 635 }
jpnovak 0:b8d7df90819e 636
jpnovak 0:b8d7df90819e 637
jpnovak 0:b8d7df90819e 638 pc.printf("%.3f, %9.6f, %9.6f, %3.1f,%4.1f, %.3f, %.3f, %.3f, \r\n", time1,Lat1,Long1,speed_mph1,heading1,Xaccel_g, Yaccel_g, Zaccel_g);
jpnovak 0:b8d7df90819e 639 ////////Get Megasquirt Runtime data buffer//////////////
jpnovak 0:b8d7df90819e 640
jpnovak 0:b8d7df90819e 641
jpnovak 0:b8d7df90819e 642 //poll serial device for data stream (a,0,6) to (request, return, confirm)
jpnovak 0:b8d7df90819e 643 megasquirt.putc(97);//send 97 for run parameters, 83 for board revision, 81 code for revision number
jpnovak 0:b8d7df90819e 644 wait(0.005);
jpnovak 0:b8d7df90819e 645 megasquirt.putc(0);
jpnovak 0:b8d7df90819e 646 wait(0.005);
jpnovak 0:b8d7df90819e 647 megasquirt.putc(6);
jpnovak 0:b8d7df90819e 648 int actuallyRead = megasquirt.readBytes( buf, 112); // where 112 is the number of bytes you are expecting from MSII outpc buffer
jpnovak 0:b8d7df90819e 649
jpnovak 0:b8d7df90819e 650
jpnovak 0:b8d7df90819e 651 //decodeMS Runtime Data Buffer();
jpnovak 0:b8d7df90819e 652
jpnovak 0:b8d7df90819e 653 Time = t.read();//read value from timer in ms
jpnovak 0:b8d7df90819e 654
jpnovak 0:b8d7df90819e 655 ////////Decode MS Runtime Data Buffer////
jpnovak 0:b8d7df90819e 656
jpnovak 0:b8d7df90819e 657 ////The following code will parse the runtime data buffer from MSExtra-2
jpnovak 0:b8d7df90819e 658 //Position of the runtime bits given on msextra.com
jpnovak 0:b8d7df90819e 659 //Scalar math completed where known
jpnovak 0:b8d7df90819e 660
jpnovak 0:b8d7df90819e 661 //get seconds - runtime of MS
jpnovak 0:b8d7df90819e 662 tmp = buf[0];
jpnovak 0:b8d7df90819e 663 tmp = tmp << 8;
jpnovak 0:b8d7df90819e 664 SecL = tmp | buf[1];
jpnovak 0:b8d7df90819e 665 //MSseconds = MSseconds/256;
jpnovak 0:b8d7df90819e 666 //get pulseWidth1
jpnovak 0:b8d7df90819e 667 tmp = buf[2];
jpnovak 0:b8d7df90819e 668 tmp = tmp << 8;
jpnovak 0:b8d7df90819e 669 tmp = tmp | buf[3];
jpnovak 0:b8d7df90819e 670 PW = tmp*0.000666;
jpnovak 0:b8d7df90819e 671
jpnovak 0:b8d7df90819e 672
jpnovak 0:b8d7df90819e 673 //get pulseWidth2
jpnovak 0:b8d7df90819e 674 tmp = buf[4];
jpnovak 0:b8d7df90819e 675 tmp = tmp << 8;
jpnovak 0:b8d7df90819e 676 tmp = tmp | buf[5];
jpnovak 0:b8d7df90819e 677 PW2 = tmp*0.000666;
jpnovak 0:b8d7df90819e 678 //get Rpm
jpnovak 0:b8d7df90819e 679 tmp = buf[6];
jpnovak 0:b8d7df90819e 680 tmp = tmp << 8;
jpnovak 0:b8d7df90819e 681 RPM = tmp | buf[7];
jpnovak 0:b8d7df90819e 682
jpnovak 0:b8d7df90819e 683 //Calculate DutyCycle
jpnovak 0:b8d7df90819e 684 DutyCycle = (PW * (RPM / 60)) / 10;
jpnovak 0:b8d7df90819e 685
jpnovak 0:b8d7df90819e 686 //Calculate DutyCycle2
jpnovak 0:b8d7df90819e 687 DutyCycle2 = (PW2 * (RPM / 60)) / 10;
jpnovak 0:b8d7df90819e 688
jpnovak 0:b8d7df90819e 689
jpnovak 0:b8d7df90819e 690 //get advance
jpnovak 0:b8d7df90819e 691 tmp = buf[8];
jpnovak 0:b8d7df90819e 692 tmp = tmp << 8;
jpnovak 0:b8d7df90819e 693 tmp = tmp | buf[9];
jpnovak 0:b8d7df90819e 694 SparkAdv = tmp/10;
jpnovak 0:b8d7df90819e 695
jpnovak 0:b8d7df90819e 696 //get manifold absolute pressure MAP
jpnovak 0:b8d7df90819e 697 tmp = buf[18];
jpnovak 0:b8d7df90819e 698 tmp = tmp << 8;
jpnovak 0:b8d7df90819e 699 MAP = tmp | buf[19];
jpnovak 0:b8d7df90819e 700 MAP = MAP/10;
jpnovak 0:b8d7df90819e 701 //get manifold absolute temperature (MAT)
jpnovak 0:b8d7df90819e 702 tmp = buf[20];
jpnovak 0:b8d7df90819e 703 tmp = tmp << 8;
jpnovak 0:b8d7df90819e 704 MAT = tmp | buf[21];
jpnovak 0:b8d7df90819e 705 MAT = MAT/10; ///for Farenheit
jpnovak 0:b8d7df90819e 706 // MAT = 0.555*(MAT - 32); //for Celcius
jpnovak 0:b8d7df90819e 707 //get coolant temperature (CLT)
jpnovak 0:b8d7df90819e 708 tmp = buf[22];
jpnovak 0:b8d7df90819e 709 tmp = tmp << 8;
jpnovak 0:b8d7df90819e 710 CLT = tmp | buf[23];
jpnovak 0:b8d7df90819e 711 CLT = CLT/10;
jpnovak 0:b8d7df90819e 712 //CLT = 0.555*(CLT - 32); //for Celciuss
jpnovak 0:b8d7df90819e 713 //get Throttle Position Sensor (TPS)
jpnovak 0:b8d7df90819e 714 tmp = buf[24];
jpnovak 0:b8d7df90819e 715 tmp = tmp << 8;
jpnovak 0:b8d7df90819e 716 TP = tmp | buf[25];
jpnovak 0:b8d7df90819e 717 TP = TP / 10;
jpnovak 0:b8d7df90819e 718 //get BAttery Voltage
jpnovak 0:b8d7df90819e 719 tmp = buf[26];
jpnovak 0:b8d7df90819e 720 tmp = tmp << 8;
jpnovak 0:b8d7df90819e 721 vBatt = tmp | buf[27];
jpnovak 0:b8d7df90819e 722 vBatt = vBatt /10,
jpnovak 0:b8d7df90819e 723 //get Realtime AFR for VE1
jpnovak 0:b8d7df90819e 724 tmp = buf[28];
jpnovak 0:b8d7df90819e 725 tmp = tmp << 8;
jpnovak 0:b8d7df90819e 726 AFR = tmp | buf[29];
jpnovak 0:b8d7df90819e 727 AFR = AFR /10;
jpnovak 0:b8d7df90819e 728 //
jpnovak 0:b8d7df90819e 729 /////////////// Print Display Variables //////////////////
jpnovak 0:b8d7df90819e 730
jpnovak 0:b8d7df90819e 731
jpnovak 0:b8d7df90819e 732
jpnovak 0:b8d7df90819e 733 ///print bargraph of TPS
jpnovak 0:b8d7df90819e 734 /* lcd.locate(15,1);
jpnovak 0:b8d7df90819e 735 // for (i=0; i<20; i++){
jpnovak 0:b8d7df90819e 736 // if (i<TPS) lcd.printf(0xFF);
jpnovak 0:b8d7df90819e 737 // else lcd.printf(0x20);
jpnovak 0:b8d7df90819e 738 // }
jpnovak 0:b8d7df90819e 739 lcd.printf("%i ",TPS);
jpnovak 0:b8d7df90819e 740 */
jpnovak 0:b8d7df90819e 741
jpnovak 0:b8d7df90819e 742 //get Rpm
jpnovak 0:b8d7df90819e 743
jpnovak 0:b8d7df90819e 744 lcd.locate(0,0);
jpnovak 0:b8d7df90819e 745 lcd.printf("RPM= %i ",RPM);
jpnovak 0:b8d7df90819e 746
jpnovak 0:b8d7df90819e 747 //get AFR
jpnovak 0:b8d7df90819e 748
jpnovak 0:b8d7df90819e 749 //AFR = tmp/10;
jpnovak 0:b8d7df90819e 750 lcd.locate(10,0);
jpnovak 0:b8d7df90819e 751 lcd.printf("AFR= %4.1f", AFR);
jpnovak 0:b8d7df90819e 752
jpnovak 0:b8d7df90819e 753 //get Map
jpnovak 0:b8d7df90819e 754
jpnovak 0:b8d7df90819e 755 //MAP = MAP/10;
jpnovak 0:b8d7df90819e 756 ///will print MAP at atmospheric and Boost on turbo (Bar)
jpnovak 0:b8d7df90819e 757 if (MAP >100) {
jpnovak 0:b8d7df90819e 758 MAP = (MAP - 100)/100;
jpnovak 0:b8d7df90819e 759 lcd.locate (0,1);
jpnovak 0:b8d7df90819e 760 lcd.printf("%.1f Bar",MAP);
jpnovak 0:b8d7df90819e 761 } else {
jpnovak 0:b8d7df90819e 762 lcd.locate(0,1);
jpnovak 0:b8d7df90819e 763 lcd.printf("MAP= %4.1f", MAP);
jpnovak 0:b8d7df90819e 764 }
jpnovak 0:b8d7df90819e 765
jpnovak 0:b8d7df90819e 766 //get Clt
jpnovak 0:b8d7df90819e 767
jpnovak 0:b8d7df90819e 768 //CLT = CLT/10;
jpnovak 0:b8d7df90819e 769 lcd.locate(0,2);
jpnovak 0:b8d7df90819e 770 if (CLT < 120) {
jpnovak 0:b8d7df90819e 771 lcd.printf(" Warm Up ");
jpnovak 0:b8d7df90819e 772 } else {
jpnovak 0:b8d7df90819e 773 lcd.printf("CLT= %4.1f", CLT);
jpnovak 0:b8d7df90819e 774 }
jpnovak 0:b8d7df90819e 775
jpnovak 0:b8d7df90819e 776 //get MAT
jpnovak 0:b8d7df90819e 777 lcd.locate(10,2);
jpnovak 0:b8d7df90819e 778 lcd.printf("MAT= %4.1f", MAT);
jpnovak 0:b8d7df90819e 779
jpnovak 0:b8d7df90819e 780 //////////////Template to print variable///////////
jpnovak 0:b8d7df90819e 781 //Use code to add variable to display output /////
jpnovak 0:b8d7df90819e 782 /*
jpnovak 0:b8d7df90819e 783 //get Variable
jpnovak 0:b8d7df90819e 784
jpnovak 0:b8d7df90819e 785 //MAP = MAP/10;
jpnovak 0:b8d7df90819e 786 lcd.locate(10,1); position on LCD
jpnovak 0:b8d7df90819e 787 lcd.printf("Variable= %4.1f", Variable); //format print X.Y is number of data characters total and how many are past decimal point
jpnovak 0:b8d7df90819e 788
jpnovak 0:b8d7df90819e 789 */
jpnovak 0:b8d7df90819e 790 /////////////////////////end MS Code////////////////////////////////
jpnovak 0:b8d7df90819e 791
jpnovak 0:b8d7df90819e 792
jpnovak 0:b8d7df90819e 793
jpnovak 0:b8d7df90819e 794
jpnovak 0:b8d7df90819e 795 /////////////////END DATA COLLECTION LOOP #2/////////////////////////////////////
jpnovak 0:b8d7df90819e 796 // } ///end else loop 2
jpnovak 0:b8d7df90819e 797 ///////////////end datalog code///////////////////////////////////////////////
jpnovak 0:b8d7df90819e 798
jpnovak 0:b8d7df90819e 799 } ///exit while loop
jpnovak 0:b8d7df90819e 800
jpnovak 0:b8d7df90819e 801 }
jpnovak 0:b8d7df90819e 802 //exit main loop
jpnovak 0:b8d7df90819e 803
jpnovak 0:b8d7df90819e 804