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.
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?
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