Hacka en ELM327 kabel att göra en Arduino OBD2 Scanner (2 / 3 steg)
Steg 2: Koppla Arduino LCD-skölden till arduino
Bifogar den Arduino LCD sköld till arduino och ansluta den till datorn för att programmeras.
Nedan är min Arduino skiss, märkte jag att formateringen bråkar med koden lite, jag har några mer tillgängliga uppgifter relaterade till detta bygga kan du Visa koden här.
http://techtinker.co.za/viewtopic.php?f=14&t=17
inkludera bibliotek koden: < br > #include
Deklarera seriell Läs variabler
int CmdCount = 1;
byte inData;
char inChar;
String BuildINString = "";
Sträng visningssträngen = "";
lång DisplayValue;
String SentMessage = "";
int ByteCount = 0;
lång A;
int B;
int WorkingVal;
String WorkingString = "";
Deklarera knappar
int MenuID = 0;
initiera bibliotek med numrerar av gränssnittet stiften
LiquidCrystal lcd (8, 9, 4, 5, 6, 7);
void setup()
{
Ange den LCD antal kolumner och rader:
LCD.BEGIN (16, 2);
Skriv ut ett meddelande till LCD-skärmen.
lcd.setCursor (0, 0);
Uppstart (); //Simulate uppstart processen behöver inte vara här detta bara gör det ser cool
Försök igen:
lcd.setCursor (0, 0);
LCD.Print ("ansluta... ");
lcd.setCursor (0, 1);
LCD.Print("");
Serial.BEGIN(38400);
Delay(500);
Skicka ett testmeddelande till se om ELM327 Chip svarar
SentMessage = "ATI";
Serial.println("ATI");Delay(500); ReadData();
om (BuildINString.substring(1,7)=="ELM327")
{
lcd.setCursor (0, 0);
LCD.Print ("Välkommen... ");
lcd.setCursor (0, 1);
LCD.Print ("anslutning OK");
Delay(1500);
}
annat
{
lcd.setCursor (0, 0);
LCD.Print ("fel");
lcd.setCursor (0, 1);
LCD.Print ("ingen anslutning!");
Delay(1500);
gå till försök igen;
}
Delay(1500);
}
void loop() {
int x;
x = analogRead (0);
Serial.println(x);
lcd.setCursor(10,1);
om (x > 800 och x < 820){lcd.print ("Välj");}
IF (x > 620 och x < 630) {om (MenuID > 0) {MenuID--;} Delay(250);} Vänster
om (x > 400 och x < 415){lcd.print ("ned");}
om (x > 190 och x < 215){lcd.print ("Up");}
om (x >-10 och x < 10) {om (MenuID < 11) {MenuID ++;} Delay(250);} Höger
om (MenuID==0){lcd.setCursor (0, 0);lcd.print ("01 kylvätska Temp"), lcd.setCursor (0, 1);lcd.print(DisplayString); SentMessage = "01 05"; Serial.println ("01 05");delay(300); ReadData();}
om (MenuID==1){lcd.setCursor (0, 0);lcd.print ("02 IAT Temp"), lcd.setCursor (0, 1);lcd.print(DisplayString); SentMessage = "01 0F"; Serial.println ("01 0F");delay(300); ReadData();}
om (MenuID==2){lcd.setCursor (0, 0);lcd.print ("03 omgivande Temp"), lcd.setCursor (0, 1);lcd.print(DisplayString); SentMessage = "01 46"; Serial.println ("01 46");delay(300); ReadData();}
om (MenuID==3){lcd.setCursor (0, 0);lcd.print ("04 spjäll %"), lcd.setCursor (0, 1);lcd.print(DisplayString); SentMessage = "01 11"; Serial.println ("01 11");delay(300); ReadData();}
om (MenuID==4){lcd.setCursor (0, 0);lcd.print ("05 CAT 1 Temp"), lcd.setCursor (0, 1);lcd.print ("inte genomfört");}
om (MenuID==5){lcd.setCursor (0, 0);lcd.print ("06 CAT 2 Temp"), lcd.setCursor (0, 1);lcd.print ("inte genomfört");}
om (MenuID==6){lcd.setCursor (0, 0);lcd.print ("07 CAT 3 Temp"), lcd.setCursor (0, 1);lcd.print ("inte genomfört");}
om (MenuID==7){lcd.setCursor (0, 0);lcd.print ("08 CAT 4 Temp"), lcd.setCursor (0, 1);lcd.print ("inte genomfört");}
om (MenuID==8){lcd.setCursor (0, 0);lcd.print ("09 RPM"), lcd.setCursor (0, 1);lcd.print(DisplayString); SentMessage = "01 0C"; Serial.println ("01 0C");delay(300); ReadData();}
om (MenuID==9){lcd.setCursor (0, 0);lcd.print ("10 fordonets hastighet"), lcd.setCursor (0, 1);lcd.print(DisplayString); SentMessage = "01 0D"; Serial.println ("01 0D");delay(300); ReadData();}
om (MenuID==10){lcd.setCursor (0, 0);lcd.print ("11 flöde"), lcd.setCursor (0, 1);lcd.print(DisplayString); SentMessage = "01 10"; Serial.println ("01 10");delay(300); ReadData();}
om (MenuID==11){lcd.setCursor (0, 0);lcd.print ("12 Barometric"), lcd.setCursor (0, 1);lcd.print(DisplayString); SentMessage = "01 33"; Serial.println ("01 33");delay(300); ReadData();}
}
Läsa Data och agera därefter
void ReadData()
{
BuildINString = "";
While(Serial.available() > 0)
{
inData = 0;
inChar = 0;
inData = Serial.read();
inChar=char(inData);
BuildINString = BuildINString + inChar;
}
IF(BuildINString!=""){Serial.Print(BuildINString);}
BuildINString.replace(SentMessage,"");
BuildINString.replace (">","");
BuildINString.replace("OK","");
BuildINString.replace("STOPPED","");
BuildINString.replace("SEARCHING","");
BuildINString.replace ("inga DATA","");
BuildINString.replace("?","");
BuildINString.replace(",","");
Serial.Print(BuildINString);
Kolla som OBD-kommando har sänts och beräkna värdet
Beräkna RPM dvs returnerade byte wil vara 41 0C 1B E0
om (SentMessage == "01 0C")
{
WorkingString = BuildINString.substring(7,9);
A = strtol(WorkingString.c_str(),NULL,0);
WorkingString = BuildINString.substring(11,13);
B = strtol(WorkingString.c_str(),NULL,0);
DisplayValue = ((A * 256) + B) / 4;
Visningssträngen = String(DisplayValue) + "rpm";
lcd.setCursor (0, 1);
LCD.Print(DisplayString);
}
Beräkna fordonets hastighet dvs returnerade byte wil vara 41 0C 1B E0
om (SentMessage == "01 0D")
{
WorkingString = BuildINString.substring(7,9);
A = strtol(WorkingString.c_str(),NULL,0);
DisplayValue = A;
Visningssträngen = String(DisplayValue) + "km/h".
lcd.setCursor (0, 1);
LCD.Print(DisplayString);
}
Kylvätska Temp
om (SentMessage == "01 05")
{
WorkingString = BuildINString.substring(7,9);
A = strtol(WorkingString.c_str(),NULL,0);
DisplayValue = A;
Visningssträngen = String(DisplayValue) + "C".
lcd.setCursor (0, 1);
LCD.Print(DisplayString);
}
IAT Temp
om (SentMessage == "01 0F")
{
WorkingString = BuildINString.substring(7,9);
A = strtol(WorkingString.c_str(),NULL,0);
DisplayValue = A;
Visningssträngen = String(DisplayValue) + "C".
lcd.setCursor (0, 1);
LCD.Print(DisplayString);
}
Luftflöde hastighet
om (SentMessage == "01 10")
{
WorkingString = BuildINString.substring(7,9);
A = strtol(WorkingString.c_str(),NULL,0);
WorkingString = BuildINString.substring(11,13);
B = strtol(WorkingString.c_str(),NULL,0);
DisplayValue = ((A * 256) + B) / 100;
Visningssträngen = String(DisplayValue) + "g/s";
lcd.setCursor (0, 1);
LCD.Print(DisplayString);
}
Omgivande Temp
om (SentMessage == "01 46")
{
WorkingString = BuildINString.substring(7,9);
A = strtol(WorkingString.c_str(),NULL,0);
DisplayValue = A;
Visningssträngen = String(DisplayValue) + "C".
lcd.setCursor (0, 1);
LCD.Print(DisplayString);
}
Gasspjällsvinkeln
om (SentMessage == "01 11")
{
WorkingString = BuildINString.substring(7,9);
A = strtol(WorkingString.c_str(),NULL,0);
DisplayValue = A;
Visningssträngen = String(DisplayValue) + "%".
lcd.setCursor (0, 1);
LCD.Print(DisplayString);
}
Barometertryck
om (SentMessage == "01 33")
{
WorkingString = BuildINString.substring(7,9);
A = strtol(WorkingString.c_str(),NULL,0);
DisplayValue = A;
Visningssträngen = String(DisplayValue) + "kpa".
lcd.setCursor (0, 1);
LCD.Print(DisplayString);
}
}
void Bootup()
{
LCD.Print ("WisperChip V2.00");
för (int jag = 0; jag < = 5; i ++)
{
för (int j = 1; j < = 4; j ++) / / -/ |\-
{
IF(j==1) {lcd.setCursor (0, 1);lcd.print ("-"); delay(200);}
IF(j==2) {lcd.setCursor (0, 1);lcd.print ("/"); delay(200);}
IF(j==3) {lcd.setCursor (0, 1);lcd.print ("|"); Delay(200);}
IF(j==4) {lcd.setCursor (0, 1);lcd.print ("\\");delay(200);}
}
}
Delay(1000);
}