OBD2 Daten auf Display

Hallo,
ich versuche bereits seit einiger Zeit ein Art Datendisplay mit Arduino zu verwirklichen. Ich habe einen OBD2 Adapter (ELM327) im Fahrzeug, der Arduino Nano ist mit einem Bluetooth Modul (HC-05) verbunden, sowie mit einem 1.8" Display (ST7735S)

#include <Adafruit_GFX.h>
#include <Adafruit_ST7735.h>
#include <SoftwareSerial.h>

// SoftwareSerial initialisieren, um Daten vom ELM327-Adapter zu empfangen
SoftwareSerial elmSerial(6, 7); // RX, TX

// ST7735S-Display initialisieren
Adafruit_ST7735 tft = Adafruit_ST7735(10, 9, 8);

void setup() {
  // Serielle Verbindung zum Debuggen starten
  Serial.begin(9600);

  // SoftwareSerial-Verbindung zum ELM327-Adapter starten
  elmSerial.begin(9600);

  // ST7735S-Display initialisieren
  tft.initR(INITR_BLACKTAB);
  tft.setRotation(1);
  tft.fillScreen(ST7735_BLACK);
}

void loop() {
  // Befehl senden, um die Kühlmitteltemperatur abzufragen
  elmSerial.println("01 05");

  // Warten auf Antwort vom ELM327-Adapter
  delay(100);

  // Antwort vom ELM327-Adapter lesen
  String response = "";
  while (elmSerial.available()) {
    response += elmSerial.readString();
  }

  // Kühlmitteltemperatur extrahieren und in Grad Celsius konvertieren
  int coolantTemp = hexToCelsius(response.substring(6));

  // Kühlmitteltemperatur auf dem Serial Monitor ausgeben
  Serial.print("Kuehlmittel: ");
  Serial.print(coolantTemp);
  Serial.println(" °C");

  // Kühlmitteltemperatur auf dem ST7735S-Display anzeigen
  tft.fillScreen(ST7735_BLACK);
  tft.setCursor(0, 0);
  tft.setTextColor(ST7735_WHITE);
  tft.setTextSize(2);
  tft.print("Kuehltemp: ");
  tft.print(coolantTemp);
  tft.print(" C");

  // Pause zwischen den Schleifendurchläufen
  delay(1000);
}

// Hilfsfunktion zur Konvertierung von hexadezimalen Temperaturen in Grad Celsius
int hexToCelsius(String hexTemp) {
  // Extrahieren der hexadezimalen Temperatur und Konvertieren in eine Ganzzahl
  int temp = strtol(hexTemp.c_str(), NULL, 16);

  // Die Temperatur wird durch 4 geteilt und von 40 abgezogen, um die Grad Celsius zu erhalten
  return temp / 4 - 40;
}

Sobald ich alles verbinde, zeigt mir des gemessene Temperaturwert nur -40 C an. Ganz unabhängig welche Temperatur das Kühlmittel hat.
Kann es an einer falschen Baudrate liegen? Oder ist die Verbindung zw. HC-05 & ELM327 fehlerhaft?
Ich bin wirklich am verzweifeln und bin über jede Hilfe froh.

Liebe Grüße Tobi

Falscher Ansatz.

Las Dir doch Zwischenwerte ausgeben.
Als erstes fällt mir auf, das die -40 zu dieser Zeile passen:

wenn die Division als ergebnis 0 hat.
Dieses Ergebnis kann nur auftreten, wenn temp eben 0 ist.
Daher gilt es in erfahrung zu bringen, wie da eine 0 reinkommt.
Las Dir

  • hexTemp
  • response
  • und ggfls response.substring(6)

auf dem Seriellen Monitor ausgeben.

Dann finde ich das mit dem String auch nicht vorteilhaft, aber das ist eine andere Baustelle...
erstmal müsste überhaupt was kommen.

Du hast den Arduino mit dem Bluetooth-Modul verbunden.
Aber ist auch das BT Modul mit dem ELM327 verbunden?

Du verwendest SoftwareSerial um den HC-05 anzusteuern. Das ist erstmal vollkommen richtig. Erstellt aber noch keinerlei Verbindung zu irgendeinem Gerät!
Um das zu ermöglichen gibt es sog. AT-Befehle, mit denen Du den HC-05 konfigurieren kannst.
Zum einen kannst Du dort die Baudrate erhöhen, was ich aus performancegründen empfehlen würde. Aber nicht mehr als 57600, da beginnt SoftwareSerial sonst Probleme zu machen.
Zum anderen kannst Du dort dem Modul sagen, wie und womit es sich verbinden soll.
Ein paar Befehle kannst Du hier einsehen:

Dort ist auch ein PDF verlinkt, wo Du den Rest entnehmen kannst.

Wenn diese Hürde geschafft ist, würde ich beginnen Deinen Code robuster zu machen.
Man kann wunderbar auf das delay verzichten und auf einen Zeilenumbruch "warten", den der ELM327 standardmäßig sendet.
Und mit warten meine ich, so lange durch den loop laufen, bis Du alle nötigen Zeichen in einer globalen Variable zusammen hast. Die sollte aber vom typ char[] sein, da ein String auf dem Arduino langfristig für Probleme sorgt.

Hey TriB,

ich habe das HC-05 Modul auf Master gesetzt, sowie CMODE=0 und die Mac-Adresse des ELM327 Moduls gepaart.
Wenn das HC05 angeschlossen wird, blinkt es erst schneller, nach ca 2sek blinkt es langsamer. Wenn der Code läuft, blinkt das ELM327 auch blau.

Daher gehe ich davon aus, dass die beiden richtig verbunden sind

Okay, das ist ja schon mal die halbe Miete :slight_smile:
Wenn Du den mit AT-Commands konfigurieren konntest, wird auch die Baudrate stimmen.

Der ELM327 muss sich ja erstmal mit dem Fahzeug verbinden, bis Du die SID & PID anfragen kannst. Da Du das nicht explizit tust, versucht er das mit Standardeinstellungen. Dabei wird er i.d.R. INIT oder BUSY zurückliefern.
Je nach Einstellung gefolgt von einem Carriage Return oder Carriage Return + Linefeed.
Nichts davon wird in Deinem Code berücksichtigt.

Das regelmäßige Blinken wird vermutlich von der Keepalive Nachricht stammen, die der ELM327 nach erfolgter Verbindung sendet, bis Du etwas anderes von ihm verlangst.

Um dem Ganzen schnell und einfach auf den Grund zu gehen, schlage ich vor Du schnappst Dir Dein Handy, ein Bluetooth Terminal-Programm und verbindest Dich direkt mit dem ELM327.
Dann sendest Du 01 05\r\n raus und schaust was genau passiert. Kommt der angesprochene BUSY oder fehlt eines der Zeilenendzeichen? Meldet der erstmal wie nach einem Reset seine Version zurück? Usw.
Damit kannst Du dann versuchen Deinen Loop sauber zu programmieren und all die Rückmeldungen vom ELM entsprechend abzufangen oder zu berücksichtigen.

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