OBD2 project met ELM327 - Gek gedrag

Beste

Ik ben mondjesmaat bezig met een project om via OBD2 wat gegevens uit mijn auto uit te lezen omdat er origineel geen meters voor zijn (water & olie temperatuur). Het internet staat vol met voorbeelden etc, maar ik zit met een heel specifiek probleem.

Mijn setup is:

  • originele UNO (uit de starter kit)
  • Velleman HC-05 bluetooth module
  • ELM327 bluetooth (via bol.com)
  • ELMduino library (optioneel - om alles te vereenvoudigen)

Het probleem is namelijk dat als ik via een basic sketch communiceer met de ELM327 deze nooit correct antwoord, tenzij ik 1 willekeurig karakter mee stuur. Bijvoorbeeld, om een reset te doen via commando "ATZ", moet ik "AATZ" sturen. Idem voor het commando "ATRV" (batterijspanning) moet ik "AATRV" sturen.

Ik weet niet wat ik hier fout doe, en wil graag weten waarom dit gebeurd... Verder heb ik al een testen gedaan met de ELMduino library, maar om dit te laten werken heb ik enkele OBD commando's in de header file van de library moeten aanpassen (met leading willekeurige A) vooraleer ik correcte data terug krijg.

Ik vermoed dat mijn ELM327 toch de oorzaak is. Deze komt wel van bol.com, maar toch denk ik dat dit een chinese kloon is omdat het adres ervan 0:0:111111 is toen ik de adapter met mijn HC-05 aan het pairen was.
Los daarvan heb ik dezelfde module al met een Android tablet gebruikt om een auto via de app "Torque" uit te lezen. Deze heeft geen problemen om te connecteren.

Kan er iemand me in de juiste richting wijzen wat ik kan doen zodat ik geen willekeurig karakter mee hoef te sturen?

Mogen we veronderstellen dat je opstelling is zoals hieronder?

Arduino <- wired -> HC-05 <- wireless -> ELM327

Indien ja, aan welke pinnen heb je de HC-05 aangesloten?

Kun je je programma tonen?

  1. In de IDE, tools -> autoformat
  2. In de IDE, edit -> copy for forum
  3. Plak hier in een antwoord.

Klopt helemaal.

Aansluitingen zijn de volgende:
Arduino HC-05
7 TXD
8 RXD (met spanningsdeler)

Alle aansluitingen zijn gedubbelcheckt met de posts van:

Anyway, hier is de code. Negeer even de originele code om de communicatie tussen ELM327 & arduino te testen alsook een test om met de state pin te leren werken (momenteel gewoon een LED aangesloten).

#include <SoftwareSerial.h>
#include "ELMduino.h"

const int StatePin = 4;
const int RXPin = 7;
const int TXPin = 8;

boolean BTconnected = false;

char c = ' ';
boolean NL = true;

// in AT-mode -> 38400 (ENable pin)
const long baudRate = 9600;

SoftwareSerial BT(RXPin, TXPin);
#define ELM_PORT BT

ELM327 myELM327;

uint32_t coolantTemp = 0;

void setup() {
  //pinMode(StatePin, INPUT);

  Serial.begin(9600);
  Serial.println("Start serial");

  // wait until the HC-05 has made a connection
  //while (!BTconnected)
  //{
  //  if (digitalRead(StatePin) == HIGH){
  //    BTconnected = true;
  //  };
  //}

  //Serial.println("HC-05 is now connected");
  //Serial.println("");

  BT.begin(baudRate);

  if (!myELM327.begin(ELM_PORT, true, 2000)) {
    Serial.println("Couldn't connect to OBD scanner");
    while (1);
  }
  
  Serial.print("Initialized OBDII at ");
  Serial.println(baudRate);
}

void loop() {

  float tempCoolantTemp = myELM327.engineCoolantTemp();

  if (myELM327.status == ELM_SUCCESS) {
    Serial.print("Temp raw: "); Serial.println(tempCoolantTemp);
    
    coolantTemp = (uint32_t)tempCoolantTemp;
    Serial.print("Temp: "); Serial.println(coolantTemp);
  } else {
    myELM327.printError();
  }

  delay(30000);
  
  // Read from the Bluetooth module and send to the Arduino Serial Monitor
//  if (BT.available()) {
//      c = BT.read();
//      Serial.write(c);
//  }
 
  // Read from the Serial Monitor and send to the Bluetooth module
//  if (Serial.available()) {
//      c = Serial.read();
//      BT.write(c);   
//  }  
}

Verder heb ik ook de ELMduino code eens in DEBUG mode gezet. Deze geeft mij de volgende logs, maar ik geraak er niet helemaal uit. Je kan zien dat ik enkele commando's in de library heb aangepast zodat er wel een connectie kan worden opgezet, alleen falen ze allemaal omdat het eerste character wordt "opgegeten" => A?\r\n

Start serial
Clearing input serial buffer
Sending the following command/query: AAT D
	Received char: A
	Received char: ?
	Received char: \r
	Received char: \n
	Received char: A
	Received char: T
	Received char:  
	Received char: D
	Received char: \r
	Received char: O
	Received char: K
	Received char: \r
	Received char: \n
	Received char: \r
	Received char: \n
	Received char: >
Delimiter found
All chars received: AATDOK
Clearing input serial buffer
Sending the following command/query: AAT Z
	Received char: A
	Received char: ?
	Received char: \r
	Received char: \n
	Received char: A
	Received char: T
	Received char:  
	Received char: Z
	Received char: \r
	Received char: E
	Received char: L
	Received char: M
	Received char: 3
	Received char: 2
	Received char: 7
	Received char:  
	Received char: v
	Received char: 1
	Received char: .
	Received char: 5
	Received char: \r
	Received char: \n
	Received char: \r
	Received char: \n
	Received char: >
Delimiter found
All chars received: AATZELM327v15
Clearing input serial buffer
Sending the following command/query: AAT TP A0
	Received char: A
	Received char: ?
	Received char: \r
	Received char: \n
	Received char: A
	Received char: T
	Received char:  
	Received char: T
	Received char: P
	Received char:  
	Received char: A
	Received char: 0
	Received char: \r
	Received char: ?
	Received char: \r
	Received char: \n
	Received char: \r
	Received char: \n
	Received char: >
Delimiter found
All chars received: AATTPA0
Setting protocol via AAT TP A%c did not work - trying via AT SP %c
Clearing input serial buffer
Sending the following command/query: AT SP 0
	Received char: A
	Received char: ?
	Received char: \r
	Received char: \n
	Received char: T
	Received char:  
	Received char: S
	Received char: P
	Received char:  
	Received char: 0
	Received char: \r
	Received char: ?
	Received char: \r
	Received char: \n
	Received char: \r
	Received char: \n
	Received char: >
Delimiter found
All chars received: ATSP0
Setting protocol via AT SP %c did not work
Initialized OBDII at 9600
Service: 1
PID: 5
Normal length query detected
Query string: 0105
Clearing input serial buffer
Sending the following command/query: 0105
	Received char: 0
	Received char: ?
	Received char: \r
	Received char: \n
	Received char: 1
	Received char: 0
	Received char: 5
	Received char: \r
	Received char: ?
	Received char: \r
	Received char: \n
	Received char: \r
	Received char: \n
	Received char: >
Delimiter found
All chars received: 0105
Expected response header: 4105
Response not detected
Temp raw: -40.00
Temp: 4294967256

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.