10Hz GPS, MEgasquirt, SD Card, ADxl345, 20x4 LCD datalogger
Dependencies: ADXL345 10HzGPSdatalogger mbed
main.cpp@0:b8d7df90819e, 2015-11-28 (annotated)
- 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?
User | Revision | Line number | New 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 |