OBD-läsare (3 / 4 steg)
Steg 3: Kod för att ladda upp till ARDUINO
Nedan är koden jag använde för detta!
Jag fick det mesta av detta från.
inkluderar bibliotek-koden:
#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 = ""; int RefreshCounter = 0; När behandlingen bör uppdatera int RefreshCounterMax = 50; Justera denna refreshrate int RESETMenuName = 0;
MenuAnalogVal int x; Deklarera knappar int MenuID = 0; int UpDownMenu = 0;
initiera bibliotek med numrerar av gränssnittet stiften LiquidCrystal lcd (8, 9, 4, 5, 6, 7);
void setup() {/ / Ställ in den LCD antal kolumner och rader: lcd.begin (16, 2); / / Skriv ut ett meddelande till den LCD. lcd.setCursor (0, 0); (Stöveln); //Simulate uppstart processen behöver inte vara här detta gör bara att 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(0,1)=="elm327") {lcd.setCursor (0, 0), lcd.print ("Välkommen... "); lcd.setCursor (0, 1); LCD.Print ("anslutning OK"); Delay(1500); Visningssträngen = "Läsa Data..."; }
Delay(1500); }
void loop() {RefreshCounter ++;
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--;} Visningssträngen = "behandlingen Data...";delay(250);} Vänster om (x > 400 och x < 415) {om (UpDownMenu < 3) {UpDownMenu ++;} Delay(250); RESETMenuName = 0;} NER om (x > 190 och x < 215) {om (UpDownMenu > 0) {UpDownMenu--;} Delay(250); RESETMenuName = 0;} OM (x >-10 och x < 10) {om (MenuID < 13) {MenuID ++;} Visningssträngen = "behandlingen Data...";delay(250);} Höger
om (UpDownMenu == 0) {if(RESETMenuName==0) {lcd.setCursor (0, 0);lcd.print ("motor avläsningar"), lcd.setCursor (0, 1);lcd.print(""); delay(2000); RESETMenuName = 1;} om (MenuID==0){lcd.setCursor (0, 0);lcd.print ("01 kylvätska Temp"), lcd.setCursor (0, 1);lcd.print (visningssträngen), om (RefreshCounter == RefreshCounterMax) {SentMessage = "01 05"; Serial.println ("01 05");delay(50); ReadData() ;}} om (MenuID==1){lcd.setCursor (0, 0);lcd.print ("02 IAT Temp"), lcd.setCursor (0, 1);lcd.print (visningssträngen), om (RefreshCounter == RefreshCounterMax) {SentMessage = "01 0F"; Serial.println ("01 0F");delay(50); ReadData() ;}} om (MenuID==2){lcd.setCursor (0, 0);lcd.print ("03 omgivande Temp"), lcd.setCursor (0, 1);lcd.print (visningssträngen), om (RefreshCounter == RefreshCounterMax) {SentMessage = "01 46"; Serial.println ("01 46");delay(50); ReadData() ;}} om (MenuID==3){lcd.setCursor (0, 0);lcd.print ("04 spjäll %"), lcd.setCursor (0, 1);lcd.print (visningssträngen), om (RefreshCounter == RefreshCounterMax) {SentMessage = "01 11"; Serial.println ("01 11");delay(50); ReadData() ;}} om (MenuID==4){lcd.setCursor (0, 0);lcd.print ("05 CAT 1 Temp"), lcd.setCursor (0, 1);lcd.print (visningssträngen), om (RefreshCounter == RefreshCounterMax) {SentMessage = "01 3 c"; Serial.println ("01 3C");delay(50); ReadData() ;}} om (MenuID==5){lcd.setCursor (0, 0);lcd.print ("06 CAT 2 Temp"), lcd.setCursor (0, 1);lcd.print (visningssträngen), om (RefreshCounter == RefreshCounterMax) {SentMessage = "01 3D"; Serial.println ("01 3D");delay(50); ReadData() ;}} om (MenuID==6){lcd.setCursor (0, 0);lcd.print ("07 CAT 3 Temp"), lcd.setCursor (0, 1);lcd.print (visningssträngen), om (RefreshCounter == RefreshCounterMax) {SentMessage = "01 3E"; Serial.println ("01 3E");delay(50); ReadData() ;}} om (MenuID==7){lcd.setCursor (0, 0);lcd.print ("08 CAT 4 Temp"), lcd.setCursor (0, 1);lcd.print (visningssträngen), om (RefreshCounter == RefreshCounterMax) {SentMessage = "01 3F"; Serial.println ("01 3F");delay(50); ReadData() ;}} om (MenuID==8){lcd.setCursor (0, 0);lcd.print ("09 RPM"), lcd.setCursor (0, 1);lcd.print (visningssträngen), om (RefreshCounter == RefreshCounterMax) {SentMessage = "01 0C"; Serial.println ("01 0C");delay(50); ReadData() ;}} om (MenuID==9){lcd.setCursor (0, 0);lcd.print ("10 fordonets hastighet"), lcd.setCursor (0, 1);lcd.print (visningssträngen), om (RefreshCounter == RefreshCounterMax) {SentMessage = "01 0D"; Serial.println ("01 0D");delay(50); ReadData() ;}} om (MenuID==10){lcd.setCursor (0, 0);lcd.print ("11 flöde"), lcd.setCursor (0, 1);lcd.print (visningssträngen), om (RefreshCounter == RefreshCounterMax) {SentMessage = "01 10"; Serial.println ("01 10");delay(50); ReadData() ;}} om (MenuID==11){lcd.setCursor (0, 0);lcd.print ("12 Barometric"), lcd.setCursor (0, 1);lcd.print (visningssträngen), om (RefreshCounter == RefreshCounterMax) {SentMessage = "01 33"; Serial.println ("01 33");delay(50); ReadData() ;}} om (MenuID==12){lcd.setCursor (0, 0);lcd.print ("13 pärlor"), lcd.setCursor (0, 1);lcd.print (visningssträngen), om (RefreshCounter == RefreshCounterMax) {SentMessage = "01 78"; Serial.println ("01 78");delay(50); ReadData() ;}} om (MenuID==13){lcd.setCursor (0, 0);lcd.print ("14 olja Temp");lcd.setCursor (0, 1);lcd.print (visningssträngen), om (RefreshCounter == RefreshCounterMax) {SentMessage = "01 5 c"; Serial.println ("01 5C");delay(50); ReadData() ;}} } om (UpDownMenu == 1) {if(RESETMenuName==0) {lcd.setCursor (0, 0);lcd.print ("Trans avläsningar"), lcd.setCursor (0, 1);lcd.print(""); delay(2000); RESETMenuName = 1;} lcd.setCursor (0, 0);lcd.print ("inte genomfört");} om (UpDownMenu == 2) {if(RESETMenuName==0) {lcd.setCursor (0, 0);lcd.print ("Inställningar"), lcd.setCursor (0, 1);lcd.print(""); delay(2000); RESETMenuName = 1;} lcd.setCursor (0, 0);lcd.print ("inte genomfört");} om (UpDownMenu == 3) {if(RESETMenuName==0) {lcd.setCursor (0, 0);lcd.print ("Zackery France");lcd.setCursor (0, 1);lcd.print ("\\Sensors Final"); delay(2000); RESETMenuName = 1;} lcd.setCursor (0, 0);lcd.print ("systemversion");} Starta om RefreshCounter om (RefreshCounter > = RefreshCounterMax) {RefreshCounter = 0;} delay(1);
}
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 //Calculate RPM dvs returnerade byte wil vara 41 0C 1B E0 //RPM om (SentMessage == "01 0C") {WorkingString = BuildINString.substring(7,9); A = strtoul(WorkingString.c_str(),NULL,16); WorkingString = BuildINString.substring(10,12); B = strtoul(WorkingString.c_str(),NULL,16); DisplayValue = ((A * 256) + B) / 4; Visningssträngen = String(DisplayValue) + "rpm"; lcd.setCursor (0, 1); LCD.Print(DisplayString); } //Calculate fordonets hastighet dvs returnerade byte wil vara 41 0C 1B E0 om (SentMessage == "01 0D") {WorkingString = BuildINString.substring(7,9); A = strtoul(WorkingString.c_str(),NULL,16);
DisplayValue = A; Visningssträngen = String(DisplayValue) + "km/h". lcd.setCursor (0, 1); LCD.Print(DisplayString); } //Coolant temp om (SentMessage == "01 05") {WorkingString = BuildINString.substring(7,9); A = strtoul(WorkingString.c_str(),NULL,16);
DisplayValue = A - 40; Visningssträngen = String(DisplayValue) + "C". lcd.setCursor (0, 1); LCD.Print(DisplayString); } //IAT temp om (SentMessage == "01 0F") {WorkingString = BuildINString.substring(7,9); A = strtoul(WorkingString.c_str(),NULL,16);
DisplayValue = en -40; Visningssträngen = String(DisplayValue) + "C". lcd.setCursor (0, 1); LCD.Print(DisplayString); } //Air flow Rate om (SentMessage == "01 10") {WorkingString = BuildINString.substring(7,9); A = strtoul(WorkingString.c_str(),NULL,16); WorkingString = BuildINString.substring(11,13); B = strtoul(WorkingString.c_str(),NULL,16); DisplayValue = ((A * 256) + B) / 100; Visningssträngen = String(DisplayValue) + "g/s"; lcd.setCursor (0, 1); LCD.Print(DisplayString); } //Ambient temp om (SentMessage == "01 46") {WorkingString = BuildINString.substring(7,9); A = strtoul(WorkingString.c_str(),NULL,16);
DisplayValue = en -40; Visningssträngen = String(DisplayValue) + "C". lcd.setCursor (0, 1); LCD.Print(DisplayString); } //eNGINE OIL tEMP if (SentMessage == "01 5C") {WorkingString = BuildINString.substring(7,9); A = strtoul(WorkingString.c_str(),NULL,16);
DisplayValue = en -40; Visningssträngen = String(DisplayValue) + "C". lcd.setCursor (0, 1); LCD.Print(DisplayString); } //Throttle position om (SentMessage == "01 11") {WorkingString = BuildINString.substring(7,9); A = strtoul(WorkingString.c_str(),NULL,16);
DisplayValue = A * 100/255; Visningssträngen = String(DisplayValue) + "%". lcd.setCursor (0, 1); LCD.Print(DisplayString); } //Barometric tryck om (SentMessage == "01 33") {WorkingString = BuildINString.substring(7,9); A = strtoul(WorkingString.c_str(),NULL,16);
DisplayValue = A; Visningssträngen = String(DisplayValue) + "kpa". lcd.setCursor (0, 1); LCD.Print(DisplayString); } //CAT 1 temp / / ((A*256) + B) / 10-40 if (SentMessage == "01 3 C") {WorkingString = BuildINString.substring(7,9); A = strtoul(WorkingString.c_str(),NULL,16); WorkingString = BuildINString.substring(10,12); B = strtoul(WorkingString.c_str(),NULL,16); DisplayValue = ((A * 256) + B) / 10-40; Visningssträngen = String(DisplayValue) + "C". lcd.setCursor (0, 1); LCD.Print(DisplayString); } //CAT 2 temp / / ((A*256) + B) / 10-40 if (SentMessage == "01 3D") {WorkingString = BuildINString.substring(7,9); A = strtoul(WorkingString.c_str(),NULL,16); WorkingString = BuildINString.substring(10,12); B = strtoul(WorkingString.c_str(),NULL,16); DisplayValue = ((A * 256) + B) / 10-40; Visningssträngen = String(DisplayValue) + "C". lcd.setCursor (0, 1); LCD.Print(DisplayString); } //CAT 3 temp / / ((A*256) + B) / 10-40 if (SentMessage == "01 3E") {WorkingString = BuildINString.substring(7,9); A = strtoul(WorkingString.c_str(),NULL,16); WorkingString = BuildINString.substring(10,12); B = strtoul(WorkingString.c_str(),NULL,16); DisplayValue = ((A * 256) + B) / 10-40; Visningssträngen = String(DisplayValue) + "C". lcd.setCursor (0, 1); LCD.Print(DisplayString); } //CAT 4 temp / / ((A*256) + B) / 10-40 if (SentMessage == "01 3F") {WorkingString = BuildINString.substring(7,9); A = strtoul(WorkingString.c_str(),NULL,16); WorkingString = BuildINString.substring(10,12); B = strtoul(WorkingString.c_str(),NULL,16); DisplayValue = ((A * 256) + B) / 10-40; Visningssträngen = String(DisplayValue) + "C". lcd.setCursor (0, 1); LCD.Print(DisplayString); }
}
void Bootup() {lcd.print ("bil läsare"); för (int jag = 0; jag < = 1; 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);}} } lcd.setCursor (2, 1); LCD.Print ("Zackery Frankrike"); Delay(2000); }