ELMduino icon indicating copy to clipboard operation
ELMduino copied to clipboard

Custom PIDs

Open 415Robots opened this issue 1 year ago • 14 comments
trafficstars

Greetings,

I am having trouble pulling a specific PID (220052) . Currently using processPID() to make custom calls, but it only returns 0.0. I've tried the follow:

  • Try ethanolPercentage within ELMduino (not working)
  • Use processPID() on a few different custom PIDs (working)
  • Validate 220052 exists and is enabled, using torque app (working)
  • Try different Services for the PID 0x52 (not working)

// example double var = myELM327.processPID(34, 82, 1, 1, 100.0 / 255.0, 0.0);

My next plan of attack is to use the code in the test.ino to try passing the decimal or hex values over serial to see I can get anything. Is there any specific variables I should watch, that might give me a clue as to what I am doing wrong?

415Robots avatar Jan 24 '24 09:01 415Robots

Please post your formatted code and debug printouts.

PowerBroker2 avatar Jan 24 '24 13:01 PowerBroker2

#include "BluetoothSerial.h"
#include "ELMduino.h"

BluetoothSerial SerialBT;
ELM327 myELM327;

double var = 1.0;

void setup()
{
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);

  SerialBT.begin("ArduHUD", true);
  if (!SerialBT.connect("OBDII"))
  {
    Serial.println(F("Couldn't connect to OBD scanner - Phase 1"));
    while (1);
  }

  if (!myELM327.begin(SerialBT, true, 2000))
  {
    Serial.println(F("Couldn't connect to OBD scanner - Phase 2"));
    while (1);
  }
  
  Serial.println(F("Connected to ELM327"));
}


void loop() {
  var = myELM327.processPID(34, 82, 1, 1, 100.0/255.0,0);

  if (myELM327.nb_rx_state == ELM_SUCCESS) {
    Serial.print("Ethanol (%): ");
    Serial.println(var);
  } else {
    Serial.println("Failed to read Transmission Temperature or PID not supported.");
  }

  delay(200); // Delay between reads
}

data output debug test_ino_data

415Robots avatar Jan 26 '24 05:01 415Robots

@415Robots Your loop needs to handle the case where the code is still getting the data from the ELM device. Try this in your loop():

if (myELM327.nb_rx_state == ELM_SUCCESS)
      {
       Serial.print("Ethanol (%): ");
       Serial.println(var);
      }
      else if (myELM327.nb_rx_state != ELM_GETTING_MSG)
      {
        myELM327.printError();
      }

That will allow the full response message to be received before being processed.

Also, the code shown in your two screenshots are both different than the code you posted, so it's not clear what code is actually running...

jimwhitelaw avatar Jan 26 '24 06:01 jimwhitelaw

Thanks for the feedback, I'll add the print Error and post the results. I only have limited access to the vehicle, so the testing was a lot of modifying working code to try to get PID 220052 to work, apologies for the confusion.

  • Screenshot 1: Output from processPID with the following inputs: Service = 34 (0x22 = 34), PID = 82 (0x52 =82)
  • Screenshot 2: Debug information showing the query string, Service, and PID
  • Screenshot 3: Testing to see if "220052" is a valid PID using powerbroker's test.ino example with the serial input of "220052" and "340082". If you look at the last byte of the highlighted data in the message, you'll see the value C6. Applying the conversion from hex to percentage, the result yields the expected result of 77.6%.

Sidenote: I definitely will check out the ELMulator, I really could use some kind of bench test for this project.

415Robots avatar Jan 26 '24 07:01 415Robots

Added the else if to target the non ELM_GETTING_MSG states, but it doesn't seem to generate an error... or I am doing it wrong. Results in the Ethanol test with terminal attached:

415Robots avatar Jan 27 '24 10:01 415Robots

You are not doing it wrong, and you should not expect an error. What I see happening now is that you’re getting a CAN “Response Pending” message (7Fxxxx). ELMduino doesn’t currently handle this type of response, and instead it returns zero. See p. 45 of the Elm327 datasheet for info.

jimwhitelaw avatar Jan 27 '24 14:01 jimwhitelaw

See Issue #44, parsing response data

thebeardedgarage avatar Jan 27 '24 16:01 thebeardedgarage

@415Robots Can you either post the debug printouts in the text of your comments (formatted please) or post the screenshots different? It's hard for me to read in the screenshots and when I try to download the hires, github comes up with an empty page for some reason...

Either way, it looks like the response header for service 2 (or whichever service you're using) doesn't behave like response headers for service 1.

PowerBroker2 avatar Jan 27 '24 20:01 PowerBroker2

21:54:08.931 -> Ethanol (%): 0.00 21:54:09.119 -> Service: 34 21:54:09.119 -> PID: 82 21:54:09.119 -> Normal length query detected 21:54:09.119 -> Query string: 22521 21:54:09.119 -> Clearing input serial buffer 21:54:09.157 -> Sending the following command/query: 22521 21:54:09.321 -> Received char: 7 21:54:09.534 -> Received char: F 21:54:09.755 -> Received char: 2 21:54:09.940 -> Received char: 2 21:54:10.153 -> Received char: 1 21:54:10.321 -> Received char: 2 21:54:10.534 -> Received char: \r 21:54:10.755 -> Received char: \r 21:54:10.932 -> Received char: > 21:54:10.932 -> Delimiter found. 21:54:10.932 -> All chars received: 7F2212 21:54:10.932 -> Expected response header: 6252 21:54:10.932 -> Response not detected 21:54:10.932 -> WARNING: Number of payload chars is less than the number of expected response chars returned by ELM327 - returning 0 21:54:10.984 -> Ethanol (%): 0.00 21:54:11.154 -> Service: 34 21:54:11.154 -> PID: 82 21:54:11.154 -> Normal length query detected 21:54:11.154 -> Query string: 22521 21:54:11.154 -> Clearing input serial buffer 21:54:11.154 -> Sending the following command/query: 22521 21:54:11.368 -> Received char: 7 21:54:11.581 -> Received char: F 21:54:11.772 -> Received char: 2 21:54:11.958 -> Received char: 2 21:54:12.180 -> Received char: 1 21:54:12.354 -> Received char: 2 21:54:12.559 -> Received char: \r 21:54:12.771 -> Received char: \r 21:54:12.970 -> Received char: > 21:54:12.970 -> Delimiter found. 21:54:12.970 -> All chars received: 7F2212 21:54:12.970 -> Expected response header: 6252 21:54:12.970 -> Response not detected 21:54:12.970 -> WARNING: Number of payload chars is less than the number of expected response chars returned by ELM327 - returning 0 21:54:13.024 -> Ethanol (%): 0.00 21:54:13.202 -> Service: 34 21:54:13.202 -> PID: 82 21:54:13.202 -> Normal length query detected 21:54:13.202 -> Query string: 22521 21:54:13.202 -> Clearing input serial buffer 21:54:13.202 -> Sending the following command/query: 22521 21:54:13.418 -> Received char: 7 21:54:13.587 -> Received char: F 21:54:13.801 -> Received char: 2 21:54:14.179 -> Received char: 2 21:54:14.189 -> Received char: 1 21:54:14.404 -> Received char: 2 21:54:14.606 -> Received char: \r 21:54:14.819 -> Received char: \r 21:54:14.988 -> Received char: > 21:54:14.988 -> Delimiter found. 21:54:14.988 -> All chars received: 7F2212 21:54:15.167 -> Expected response header: 6252 21:54:15.167 -> Response not detected 21:54:15.167 -> WARNING: Number of payload chars is less than the number of expected response chars returned by ELM327 - returning 0

thebeardedgarage avatar Jan 28 '24 06:01 thebeardedgarage

I'm not sure if this is a CAN error/warning as mentioned earlier or if this is how a service 32 PID response header is supposed to look like - can you provide more info on this custom PID? Do you have any documentation on it? I'm conflicted on whether I should make a special case for it in the lib or not.

PowerBroker2 avatar Jan 28 '24 18:01 PowerBroker2

Hello Powerbroker2, I am in the same situation as @415Robots. The information I have recieved on this PID is from the torque pro app.

PID: 220052 Min. Value: 0 Max Value:100 Scale Factor: x1 Unit type: % Equation: A/255*100

When running this pid through the obd2 editor in torque app, I get this response:

Screenshot_20240123_224517_Torque

thebeardedgarage avatar Jan 28 '24 18:01 thebeardedgarage

I'm still unsure of how the PID is supposed to work and how to calculate what the response header should be. Is there any actual documentation of the PID or PID response?

PowerBroker2 avatar Jan 28 '24 19:01 PowerBroker2

Using your test.ino sketch, here is the response for 220052. The last byte of the highlighted data in the message, you'll see the value C6. Applying the conversion from hex to decimal (C6=198), 198/255*100 the result yields the expected result of 77.6%.

Screenshot_20240128_112350_Samsung Internet

thebeardedgarage avatar Jan 28 '24 19:01 thebeardedgarage

Idk what was going on in the previous set of debug prints, but this particular response looks similar to what I would expect. Notice how the response header's first byte is +4 compared to the query response header's first byte. The library in findResponse() is setup to handle this case, even for 6-byte PID queries:

https://github.com/PowerBroker2/ELMduino/blob/77874c0d13e262e59a15211c49642ecc5eb34e28/src/ELMduino.cpp#L2327-L2335

I think more detailed debugging will be required to figure out what is going wrong.

PowerBroker2 avatar Jan 28 '24 21:01 PowerBroker2