02.06.2011, 21:32
Hier mal ein Arduino-Programm, welches auf einem 4x20-Display die Kühllmitteltemperatur anzeigt:
Natürlich muß man anpassen, an welchen Portbits das Display hängt, und ggf. die Displaygröße ändern.
Es werden einfache Mode01-Messages an den ELM geschickt, und die Antwort bit für Bit zerlegt und angezeigt.
Ich hatte den Mega gewählt, weil dieser 4 serielle Ports hat - der erste hängt wie beim normalen Arduino parallel zum USB-Anschluß. Am zweiten (Serial1) hängt der ELM, so kann der beim programmieren dranbleiben, und im Betrieb weiter Debugmessages schicken.
Code:
#include <LiquidCrystal.h>
LiquidCrystal lcd(22, 23, 24, 25, 26, 27, 28); // Displan-Anschlüsse an einem Arduino Mega
int backLight = 29; // Pin fuer Hintergrundbeleuchtung
char buffer[16] ;
int a = 0;
int b = 0;
int pointer = 0;
void setup() {
pinMode(backLight, OUTPUT);
digitalWrite(backLight, HIGH); // Licht an!
lcd.begin(4,20); // Display mit 4 Zeilen, 20 Zeichen
lcd.clear(); // Display leeren
lcd.setCursor(0,0); lcd.print("Corvetteduino"); // Test ob's geht...
Serial.begin(9600); // Serialport für Debugging (Arduino USB-Monitor)
Serial1.begin(9600); // Serialport für ELM
Serial1.println("ATZ"); // Reset ELM
delay(2000);
Serial1.println("ATE0"); // local Echo OFF
delay(2000);
}
int hex2dec(byte x) { // Umrechnung HEX-Zeichen nach Dezimal
if (x >= '0' && x <= '9') { return x - '0'; } else if (x >= 'A' && x <= 'F') { return x - 'A' + 10; }
}
void loop()
{
Serial1.flush(); // Eingangspuffer leeren
Serial1.print("01 05"); // Mode01-Message schicken, Frage nach Kühlmitteltemp
Serial1.print((char)13); // Return dahinter
while (Serial1.available() < 3) {} // Warten, bis erste 3 Zeichen vom ELM angekommen
Serial.println("ELM sendet!"); // Debug-Message
pointer = 0;
a = 0;
delay(200); // Warten bis Nachricht sicher im Puffer
while (Serial1.available() >0) // Solange Zeichen im Puffer sind
{
buffer[pointer] = Serial1.read(); // Ein Zeichen lesen und in's Array packen
Serial.print(buffer[pointer]); // Debug-Message
pointer++; // Pointer eins erhöhen für nächstes Array-Element
}
a = hex2dec(buffer[7]) + hex2dec(buffer[6]) * 16; // passende Bits in Hex umrechnen
if (pointer > 9) {b = hex2dec(buffer[10]) + hex2dec(buffer[9]) * 16;} // für lange Antworten
lcd.clear();
lcd.setCursor(0,0); lcd.print("Temp:"); // Erste Zeile Einheit schreiben
lcd.setCursor(10,0); lcd.print(a-40); // ab 10. Stelle dann Ergebnis ausgeben
delay(1000); // 1 Sek warten
}
Natürlich muß man anpassen, an welchen Portbits das Display hängt, und ggf. die Displaygröße ändern.
Es werden einfache Mode01-Messages an den ELM geschickt, und die Antwort bit für Bit zerlegt und angezeigt.
Ich hatte den Mega gewählt, weil dieser 4 serielle Ports hat - der erste hängt wie beim normalen Arduino parallel zum USB-Anschluß. Am zweiten (Serial1) hängt der ELM, so kann der beim programmieren dranbleiben, und im Betrieb weiter Debugmessages schicken.