Arduino_Honda_OBD1_BM-Duino/BMDuino2/Datalogging.ino

194 lines
6.4 KiB
C++

//Set Your Injector Size. Default : 240cc
int injsize = 240;
//Set the Datalogging Addresse to the correct one for your ECU (these addresse are for Crome >= 1.4, Work with P30 bin)
byte ADDR_RPMLOW = 0x10;
byte ADDR_RPMHIGH = 0x11;
byte ADDR_LOCAM = 0x12;
byte ADDR_HICAM = 0x13;
byte ADDR_MAP = 0x14;
byte ADDR_TPS = 0x15;
//byte ADDR_COL = 0x16;
byte ADDR_INJLOW = 0x17;
byte ADDR_INJHIGH = 0x18;
byte ADDR_IGN = 0x19;
//byte ADDR_KNOCK = 0x1A;
byte ADDR_IAT = 0x1B;
byte ADDR_VSS = 0x1C;
byte ADDR_ECT = 0x1D;
//byte ADDR_BARO = 0x1E;
byte ADDR_BATT = 0x1F;
byte ADDR_O2 = 0x20;
byte ADDR_VTEC = 0x22;
unsigned int ecuTimeout = 5000;
//##################################################################################
void GetData(){
//Get RPM&Speed Raw Values
float speedRaw=ecuRead(ADDR_VSS);
unsigned int rpmLowRaw=ecuRead(ADDR_RPMLOW);
unsigned int rpmHighRaw=ecuRead(ADDR_RPMHIGH);
int RPM = 1851562/((rpmHighRaw * 256) + rpmLowRaw);
//Reset Rpm Display
if (RPM < 0) {
RPM = 0;
} else if (RPM > 9999) {
RPM = 9999;
}
//Set RPM & Speed Display
Display_Rpm = RPM;
//Display_Rpm = .92*Display_Rpm+.08*RPM; //Simple IIR filter to smooth out the digital rpm read out
//Display_Vss = .4*speedRaw; //MPH
Display_Vss = speedRaw; //KMH
//Get&Set All Others Displays
if (lcd_menu == 3 | lcd_menu == 10) {
float ECTTempRaw=ecuRead(ADDR_ECT);
float IATRaw=ecuRead(ADDR_IAT);
int o2Raw=ecuRead(ADDR_O2);
float mapRaw=ecuRead(ADDR_MAP);
float tpsRaw=ecuRead(ADDR_TPS);
unsigned int lowInjRaw=ecuRead(ADDR_INJLOW);
unsigned int highInjRaw=ecuRead(ADDR_INJHIGH);
unsigned int ignRaw=ecuRead(ADDR_IGN);
float batteryRaw = ecuRead(ADDR_BATT);
int vtecRaw=ecuRead(ADDR_VTEC);
//Set Between Values
float altitudeOffset = -10.87*(float(EEPROM.read(2))*5/256)+30.48;
float Fake_inHg = -10.87*(float(mapRaw)*5/256)+30.48;
Fake_inHg = Fake_inHg-altitudeOffset; //now inHg is guage Vac and no longer absolute vac
tpsRaw = (0.4716 * tpsRaw) - 11.3184;
//Get Vtec
bool VtecActive = false;
if (vtecRaw == 67) {
VtecActive = true;
}
Display_ECT = calcTemp(ECTTempRaw, UseFareneith);
Display_IAT = calcTemp(IATRaw, UseFareneith);
Display_AFR = (2*o2Raw) + 10;
//Display_AFR = (float(o2Raw)*5/256)*2+9.6; //AFR o2 for zietronix widebands
Display_inHg = constrain(Fake_inHg,0,50);
Display_MAP = (1764/255)*mapRaw; //mBar
Display_BATT = (26.0 * batteryRaw) / 270.0;
Display_TPS = constrain(tpsRaw, 0, 100);
Display_IGN = (0.25 * ignRaw) - 6;
Display_O2 = o2Raw;
Display_CONSO = constrain(calcConso(), 0.0001, 50.0);
Display_VTEC = VtecActive;
if(Display_Rpm<30){ //28 is the rpm that it displays when engine is off
EEPROM.write(2,mapRaw);
}
}
}
//##################################################################################
byte ecuRead(byte ecuAddress) {
Serial3.write(ecuAddress);
unsigned int time=0;
while(Serial3.available() == 0 && time < ecuTimeout) time+=1;
if (time >= ecuTimeout) return 0x00;
else return Serial3.read();
}
//##################################################################################
float calcConso() {
unsigned int lowInjRaw=ecuRead(ADDR_INJLOW);
unsigned int highInjRaw=ecuRead(ADDR_INJHIGH);
float injValue = ((highInjRaw * 256) + lowInjRaw) / 352;
float dutyCycle = (Display_Rpm * injValue) / 1200;
float hundredkm = ((60 / Display_Vss) * 100) / 60; //minutes needed to travel 100km
return (hundredkm * ((injsize / 100) * dutyCycle)) / 1000;
}
//##################################################################################
float calcTemp(int raw, bool Far) {
if (Far) {
//Fareneith
if(raw>45)
return -.8334*float(raw) + 194.25;
else if(raw<=45)
return -2.3529*float(raw) + 263.0;
} else {
//Celcius
raw = raw / 51;
raw = (0.1423*pow(raw,6)) - (2.4938*pow(raw,5)) + (17.837*pow(raw,4)) - (68.698*pow(raw,3)) + (154.69*pow(raw,2)) - (232.75*raw) + 284.24;
return ((raw - 32)*5)/9;
}
}
//##################################################################################
void CheckForBeeMR(){
//Enable Launch
if (BeeMRLaunchEnabled && BeeMRLanching == false && Display_Rpm >= BeeMRLaunchRPM && Display_Vss <= BeeMRLaunchVSS) {
BeeMRLanching = true;
digitalWrite(RelayPin, HIGH);
digitalWrite(RelayPin2, HIGH);
if (BeeMRMode == 0) {
//Reload Menu
if (lcd_menu == 5) {
PopBeeMRRPM();
}
//1st Wait (Relay Activation Time)
delay(RelayActivaionTime);
//Disable By Time
delay(BeeMRLaunchCutTime);
BeeMRLanching = false;
digitalWrite(RelayPin, LOW);
digitalWrite(RelayPin2, LOW);
//2rd Wait (Relay Activation Time)
delay(RelayActivaionTime);
}
}
//Enable Limiter
if (BeeMRRevLimiting == false && Display_Rpm >= BeeMRRevRPM) {
if ((BeeMRLaunchEnabled && Display_Vss > BeeMRLaunchVSS) | BeeMRLaunchEnabled == false) {
BeeMRRevLimiting = true;
digitalWrite(RelayPin, HIGH);
digitalWrite(RelayPin2, HIGH);
if (BeeMRMode == 0) {
//Reload Menu
if (lcd_menu == 5) {
PopBeeMRRPM();
}
//Disable By Time
delay(BeeMRRevCutTime);
BeeMRRevLimiting = false;
digitalWrite(RelayPin, LOW);
digitalWrite(RelayPin2, LOW);
Display_Rpm -= 100;
}
}
}
//Disable By Rpm
if (BeeMRMode == 1) {
if (BeeMRLanching && Display_Rpm <= BeeMRLaunchRPM - BeeMRLaunchCutRPM) {
BeeMRLanching = false;
digitalWrite(RelayPin, LOW);
digitalWrite(RelayPin2, LOW);
}
if (BeeMRRevLimiting && Display_Rpm <= BeeMRRevRPM - BeeMRRevCutRPM) {
BeeMRRevLimiting = false;
digitalWrite(RelayPin, LOW);
digitalWrite(RelayPin2, LOW);
}
}
}
//####################################################################################################################################################################
//####################################################################################################################################################################