Moderator Asked me To Post the code...
This WILL as it is now, read an OBDII J1850 VPW Port, It will also tell you all information from the Headers,, Source,, Target and Data..
Unlike the ELM326 It gives DETALs... AND shows where the 200us SOF starts...
It uses 2 interupts... IF I COULD ADD THIS **> DY[YY] = TLtime; <** ONE LINE TO THE CountH() INTERRUPT, AND **> DX[XX] = THtime; <** LINE
TO THE CountL() INTERRUPT I COULD GET RID OF THE HOLE > void loop() < routine...
But if I add them the timing gets screwed up...
Code: Select all
int Led1 = 2; // GPIO2 of ESP32 // On Board
int txPin = 22; // GPIO22 of ESP output
int rxPinH = 32; // GPIO32 of ESP input Interrupt High Pulse
int rxPinL = 33; // GPIO32 of ESP input Interrupt Low Pulse
int ButtonPin = 4; // GPIO4 of ESP output
int ButtonState;
boolean TrigH = false;
boolean TrigL = false;
int THstart = 0;
int THstop = 0;
int THtime = 0;
int TLstart = 0;
int TLstop = 0;
int TLtime = 0;
int XX = 0;
int YY = 0;
int DX[3000]; // High
int DY[3000]; // Low
int SOF[100]; // Start of Frame, Holds the ByteCount
int bCount = 0;
int MyBit[9];
byte Mybyte = 0;
byte ByteArray[3000];
int ByteCount = 0;
int SOFcount = 0;
int i;
int j;
String IsThisHeader = "No";
int NumMessages = 0;
boolean WhileStop = false;
void setup()
{
pinMode(Led1, OUTPUT);
pinMode( txPin, OUTPUT );
pinMode( rxPinH,INPUT);
pinMode( rxPinL,INPUT);
pinMode(ButtonPin, INPUT_PULLUP);
digitalWrite(Led1, LOW);
digitalWrite(txPin, LOW);
attachInterrupt(digitalPinToInterrupt(rxPinH), CountH,RISING);
attachInterrupt(digitalPinToInterrupt(rxPinL), CountL,FALLING);
Serial.begin(115200);
delay(4000);
Serial.println("STARTING");
digitalWrite(Led1, HIGH);
}
void loop()
{
if (TrigH == true)
{
DY[YY] = TLtime;
TrigH = false;
}
if (TrigL == true)
{
DX[XX] = THtime;
TrigL = false;
}
ButtonState = digitalRead(ButtonPin);
if (ButtonState == 0)
{
detachInterrupt(rxPinH);
detachInterrupt(rxPinL);
ProcessPulses();
}
}
void CountH()
{
digitalWrite(txPin, HIGH);
TrigL = false;
TrigH = true;
THstart = micros();
TLstop = micros();
TLtime = (TLstop - TLstart);
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> THIS is where I want to add the LINE- DY[YY] = TLtime;
YY = YY + 1;
}
void CountL()
{
digitalWrite(txPin, LOW);
TrigH = false;
TrigL = true;
TLstart = micros();
THstop = micros();
THtime = (THstop - THstart);
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> THIS is where I want to add the LINE- DX[XX] = THtime;
XX = XX + 1;
}
void ProcessPulses()
{
Serial.println("Processing Pulses");
Serial.println(XX);
Serial.println(YY);
Serial.println();
for (int i=1; i <= XX; i++)
{
if (DX[i] > 185 and DX[i] < 220) //Header
{
Serial.print("-");
ByteCount = ByteCount + 1;
ByteArray[ByteCount] = 45;
SOF[SOFcount] = ByteCount;
SOFcount = SOFcount + 1; // count starts at 0
IsThisHeader = "Yes";
}
else
{
IsThisHeader = "No";
}
if (IsThisHeader == "No") // Not a Header, Put 8bits to make Byte
{
//Serial.print( DX[i]);
//Serial.print(" ");
if(DY[i] > 110 and DY[i] < 140) //-128
{
bCount = bCount + 1;
MyBit[bCount] = 1;
}
if(DY[i] > 45 and DY[i] < 70 ) //-64
{
bCount = bCount + 1;
MyBit[bCount] = 0;
}
if(DX[i] > 110 and DX[i] < 150) //+128
{
bCount = bCount + 1;
MyBit[bCount] = 0;
}
if(DX[i] > 45 and DX[i] < 85 ) //+64
{
bCount = bCount + 1;
MyBit[bCount] = 1;
}
if(bCount == 8) // bits
{
//Mybyte = (MyBit[1] << 3) | (MyBit[2] << 2) | (MyBit[3] << 1) | (MyBit[4] << 0); //= 8
Mybyte = (MyBit[1] << 7) | (MyBit[2] << 6) | (MyBit[3] << 5) | (MyBit[4] << 4) | (MyBit[5] << 3) | (MyBit[6] << 2) | (MyBit[7] << 1) | (MyBit[8] << 0);
Serial.print(Mybyte,HEX);
ByteCount = ByteCount + 1;
ByteArray[ByteCount] = Mybyte;
bCount = 0;
}
}
}
Serial.println();
SOFcount = 0;
for (int i=1; i <= ByteCount; i++)
{
if ((ByteArray[i] == 45) and (SOF[SOFcount] == i)) // SOF data starts at 0
{
SOFcount = SOFcount + 1;
Serial.print("-");
}
else
{
Serial.print(ByteArray[i],HEX);
}
}
Serial.println();
PrintData();
while (1){}
}
void PrintData()
{
i = 0;
SOFcount = 0;
NumMessages = 0;
while (i <= ByteCount)
{
i = i + 1;
if ((ByteArray[i] == 45) and (SOF[SOFcount] == i))
{
Serial.println();
NumMessages = NumMessages + 1;
Serial.print(NumMessages);
Serial.print(") ");
Serial.print("Found a Header Byte = ");
SOFcount = SOFcount + 1;
i = i + 1;
Mybyte = ByteArray[i];
Serial.println(Mybyte,HEX);
Serial.print("Priority = ");
Serial.print(bitRead(Mybyte, 7)); // Priority
Serial.print(bitRead(Mybyte, 6));
Serial.print(bitRead(Mybyte, 5));
Serial.print(" | ");
Serial.print(" Headers = "); // Num of Headers to follow
if (bitRead(Mybyte, 4) == 0)
{
Serial.print("3");
}
else
{
Serial.print("1");
}
Serial.print(" | ");
Serial.print(" InFrame = "); // InFrame
if (bitRead(Mybyte, 3) == 0)
{
Serial.print("Required");
}
else
{
Serial.print("Not Allowed");
}
Serial.print(" | ");
Serial.print(" Addressinng Mode = "); // Addressinng Mode
if (bitRead(Mybyte, 2) == 0)
{
Serial.print("Functional Addressing");
}
else
{
Serial.print("Physical Addressing");
}
Serial.print(" | "); // Message Type
Serial.print(" Message Type = ");
if ((bitRead(Mybyte, 1) == 0) and (bitRead(Mybyte, 0) == 0)) // =00
{
Serial.print("0 Data Bytes");
}
if ((bitRead(Mybyte, 1) == 0) and (bitRead(Mybyte, 0) == 1)) // =01
{
Serial.print("1 Data Bytes");
}
if ((bitRead(Mybyte, 1) == 1) and (bitRead(Mybyte, 0) == 0)) // =10
{
Serial.print("2 Data Bytes");
}
if ((bitRead(Mybyte, 1) == 1) and (bitRead(Mybyte, 0) == 1)) // =11
{
Serial.print("3 Data Bytes");
}
Serial.print(" = ");
Serial.print(bitRead(Mybyte, 1));
Serial.print(bitRead(Mybyte, 0));
//Header info
if (bitRead(Mybyte, 4) == 0) // * 3 byte Header
{
Serial.println();
Serial.print("Source = ");
Mybyte = ByteArray[i + 2];
Serial.print(Mybyte,HEX);
Serial.print(" | ");
Mybyte = ByteArray[i + 1];
Serial.print(" Target = ");
Serial.print(Mybyte,HEX);
}
// Message Data
Serial.print(" Message Data = ");
j = 3;
while (WhileStop == false)
{
Mybyte = ByteArray[i + j];
if (Mybyte != 45)
{
Serial.print(Mybyte,HEX);
Serial.print(",");
j = j + 1;
if (j > 14)
{
WhileStop = true;
}
}
else
{
WhileStop = true;
}
}
WhileStop = false;
Serial.print(" Last Byte is Checksum");
Serial.println();
}
}
}