Étape 3: CODE à uploader dans l’ARDUINO
Voici le code que j’ai utilisé pour cela !
J’ai obtenu la plupart de ce à partir de.
incluent le code de la bibliothèque :
#include
Déclarer la série lire variables int CmdCount = 1 ; inData octets ; char inChar ; String BuildINString = "" ; String DisplayString = "" ; DisplayValue long ; String SentMessage = "" ; int ByteCount = 0 ; A long ; int B ; int WorkingVal ; String WorkingString = "" ; int RefreshCounter = 0 ; Quand la lecture devrait actualiser int RefreshCounterMax = 50 ; Ajustez ce refreshrate int RESETMenuName = 0 ;
MenuAnalogVal int x ; Déclarer les boutons int MenuID = 0 ; int UpDownMenu = 0 ;
initialiser la bibliothèque avec les numéros des broches interface lcd innovente (8, 9, 4, 5, 6, 7) ;
void setup() {/ / set up nombre du LCD de colonnes et de lignes : lcd.begin (16, 2); / / imprimer un message à l’écran LCD. lcd.setCursor (0, 0) ; Démarrage (); //Simulate processus de démarrage ne doit pas être ici, cela lui donne seulement une apparence cool Retry : lcd.setCursor (0, 0) ; LCD.Print ("connexion... "); lcd.setCursor (0, 1) ; LCD.Print("") ; Serial.Begin(38400) ; Delay(500) ; Envoyer un message de test pour voir si la puce ELM327 répond SentMessage = « ATI » ; Serial.println("ATI");Delay(500) ; ReadData() ; Si (BuildINString.substring(0,1)=="elm327") {lcd.setCursor (0, 0); lcd.print ("Bienvenue... "); lcd.setCursor (0, 1) ; LCD.Print ("connexion OK") ; Delay(1500) ; DisplayString = « Lecture Data... » ; }
Delay(1500) ; }
void loop() {RefreshCounter ++ ;
x = analogRead (0) ; Serial.println(x) ; lcd.setCursor(10,1) ; Si (x > 800 et x < 820){lcd.print ("Select");} Si (x > 620 et x < 630) {si (MenuID > 0) {MenuID--;} DisplayString = "lecture Data...";delay(250);} Si gauche (x > 400 et x < 415) {si (UpDownMenu < 3) {UpDownMenu ++;} Delay(250) ; RESETMenuName = 0;} Vers le bas si (x > 190 et x < 215) {si (UpDownMenu > 0) {UpDownMenu--;} Delay(250) ; RESETMenuName = 0;} UP si (x >-10 et x 10 <) {si (MenuID < 13) {MenuID ++;} DisplayString = "lecture Data...";delay(250);} Droit
Si (UpDownMenu == 0) {if(RESETMenuName==0) {lcd.setCursor (0, 0);lcd.print (« moteur lectures"); lcd.setCursor (0, 1);lcd.print(" ") ; delay(2000) ; RESETMenuName = 1;} Si (MenuID==0){lcd.setCursor (0, 0);lcd.print ("01 Coolant Temp"); lcd.setCursor (0, 1);lcd.print (DisplayString); if (RefreshCounter == RefreshCounterMax) {SentMessage = "01 05" ; Serial.println ("01 05");delay(50) ; ReadData();}} Si (MenuID==1){lcd.setCursor (0, 0);lcd.print ("02 IAT Temp"); lcd.setCursor (0, 1);lcd.print (DisplayString); if (RefreshCounter == RefreshCounterMax) {SentMessage = « 01 0F » ; Serial.println ("01 0F");delay(50) ; ReadData();}} Si (MenuID==2){lcd.setCursor (0, 0);lcd.print ("Temp ambiante 03"); lcd.setCursor (0, 1);lcd.print (DisplayString); if (RefreshCounter == RefreshCounterMax) {SentMessage = "01 46" ; Serial.println ("01 46");delay(50) ; ReadData();}} Si (MenuID==3){lcd.setCursor (0, 0);lcd.print ("04 % de gaz"); lcd.setCursor (0, 1);lcd.print (DisplayString); if (RefreshCounter == RefreshCounterMax) {SentMessage = "01 11" ; Serial.println ("01 11");delay(50) ; ReadData();}} Si (MenuID==4){lcd.setCursor (0, 0);lcd.print (« 05 CAT 1 Temp"); lcd.setCursor (0, 1);lcd.print (DisplayString); if (RefreshCounter == RefreshCounterMax) {SentMessage ="01 3"; Serial.println ("01 3C");delay(50) ; ReadData();}} Si (MenuID==5){lcd.setCursor (0, 0);lcd.print ("06 CAT 2 Temp"); lcd.setCursor (0, 1);lcd.print (DisplayString); if (RefreshCounter == RefreshCounterMax) {SentMessage = "01 3D" ; Serial.println ("01 3D");delay(50) ; ReadData();}} Si (MenuID==6){lcd.setCursor (0, 0);lcd.print (« 07 CAT 3 Temp"); lcd.setCursor (0, 1);lcd.print (DisplayString); if (RefreshCounter == RefreshCounterMax) {SentMessage = « 01 3 sexies » ; Serial.println ("01 3E");delay(50) ; ReadData();}} Si (MenuID==7){lcd.setCursor (0, 0);lcd.print (« 08 CAT 4 Temp"); lcd.setCursor (0, 1);lcd.print (DisplayString); if (RefreshCounter == RefreshCounterMax) {SentMessage = « 01 3F » ; Serial.println ("01 3F");delay(50) ; ReadData();}} Si (MenuID==8){lcd.setCursor (0, 0);lcd.print ("09 RPM"); lcd.setCursor (0, 1);lcd.print (DisplayString); if (RefreshCounter == RefreshCounterMax) {SentMessage = "01 0c » ; Serial.println ("01 0C");delay(50) ; ReadData();}} Si (MenuID==9){lcd.setCursor (0, 0);lcd.print ("vitesse du véhicule 10"); lcd.setCursor (0, 1);lcd.print (DisplayString); if (RefreshCounter == RefreshCounterMax) {SentMessage = "01 0d » ; Serial.println ("01 0D");delay(50) ; ReadData();}} Si (MenuID==10){lcd.setCursor (0, 0);lcd.print (« 11 Air Flow Rate"); lcd.setCursor (0, 1);lcd.print (DisplayString); if (RefreshCounter == RefreshCounterMax) {SentMessage =" 01 10"; Serial.println ("01 10");delay(50) ; ReadData();}} Si (MenuID==11){lcd.setCursor (0, 0);lcd.print (« barométrique 12"); lcd.setCursor (0, 1);lcd.print (DisplayString); if (RefreshCounter == RefreshCounterMax) {SentMessage =" 01 33"; Serial.println ("01 33");delay(50) ; ReadData();}} Si (MenuID==12){lcd.setCursor (0, 0);lcd.print (« EGT 13"); lcd.setCursor (0, 1);lcd.print (DisplayString); if (RefreshCounter == RefreshCounterMax) {SentMessage =" 01 78"; Serial.println ("01 78");delay(50) ; ReadData();}} Si (MenuID==13){lcd.setCursor (0, 0);lcd.print (« 14 Temp");lcd.setCursor d’huile (0, 1);lcd.print (DisplayString); if (RefreshCounter == RefreshCounterMax) {SentMessage ="01 5"; Serial.println ("01 5C");delay(50) ; ReadData();}} } Si (UpDownMenu == 1) {if(RESETMenuName==0) {lcd.setCursor (0, 0);lcd.print ("Trans lectures"); lcd.setCursor (0, 1);lcd.print("") ; delay(2000) ; RESETMenuName = 1;} lcd.setCursor (0, 0);lcd.print ("non implémenté");} Si (UpDownMenu == 2) {if(RESETMenuName==0) {lcd.setCursor (0, 0);lcd.print ("Settings"); lcd.setCursor (0, 1);lcd.print("") ; delay(2000) ; RESETMenuName = 1;} lcd.setCursor (0, 0);lcd.print ("non implémenté");} Si (UpDownMenu == 3) {if(RESETMenuName==0) {lcd.setCursor (0, 0);lcd.print ("Ilona France");lcd.setCursor (0, 1);lcd.print ("\\Sensors Final"); delay(2000) ; RESETMenuName = 1;} lcd.setCursor (0, 0);lcd.print ("système Version");} Redémarrez RefreshCounter si (RefreshCounter > = RefreshCounterMax) {RefreshCounter = 0;} delay(1) ;
}
Lire les données et agir en conséquence Sub {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 ("aucune donnée","") ; BuildINString.replace("?","") ; BuildINString.replace(",","") ; Serial.Print(BuildINString) ; Vérifiez qui envoi commande OBD et calculer la valeur //Calculate tr/mn c’est à dire retour octets sera 41 0C 1 b E0 //RPM Si (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 ; DisplayString = String(DisplayValue) + « rpm » ; lcd.setCursor (0, 1) ; LCD.Print(DisplayString) ; } //Calculate véhicule vitesse c’est à dire retour octets wil être 41 0C 1 b E0 si (SentMessage == "01 0d") {WorkingString = BuildINString.substring(7,9) ; A = strtoul(WorkingString.c_str(),NULL,16) ;
DisplayValue = A ; DisplayString = String(DisplayValue) + « km/h » ; lcd.setCursor (0, 1) ; LCD.Print(DisplayString) ; } //Coolant temp si (SentMessage == "01 05") {WorkingString = BuildINString.substring(7,9) ; A = strtoul(WorkingString.c_str(),NULL,16) ;
DisplayValue = A - 40 ; DisplayString = String(DisplayValue) + « C » ; lcd.setCursor (0, 1) ; LCD.Print(DisplayString) ; } //IAT temp si (SentMessage == « 01 0F ») {WorkingString = BuildINString.substring(7,9) ; A = strtoul(WorkingString.c_str(),NULL,16) ;
DisplayValue = un -40 ; DisplayString = String(DisplayValue) + « C » ; lcd.setCursor (0, 1) ; LCD.Print(DisplayString) ; } //Air débit si (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 ; DisplayString = String(DisplayValue) + « g/s » ; lcd.setCursor (0, 1) ; LCD.Print(DisplayString) ; } //Ambient temp si (SentMessage == "01 46") {WorkingString = BuildINString.substring(7,9) ; A = strtoul(WorkingString.c_str(),NULL,16) ;
DisplayValue = un -40 ; DisplayString = String(DisplayValue) + « C » ; lcd.setCursor (0, 1) ; LCD.Print(DisplayString) ; } if tEMP de //eNGINE huile (SentMessage == "01 5C") {WorkingString = BuildINString.substring(7,9) ; A = strtoul(WorkingString.c_str(),NULL,16) ;
DisplayValue = un -40 ; DisplayString = String(DisplayValue) + « C » ; lcd.setCursor (0, 1) ; LCD.Print(DisplayString) ; } //Throttle positionner si (SentMessage == "01 11") {WorkingString = BuildINString.substring(7,9) ; A = strtoul(WorkingString.c_str(),NULL,16) ;
DisplayValue = A * 100/255 ; DisplayString = String(DisplayValue) + « % » ; lcd.setCursor (0, 1) ; LCD.Print(DisplayString) ; } //Barometric pression si (SentMessage == "01 33") {WorkingString = BuildINString.substring(7,9) ; A = strtoul(WorkingString.c_str(),NULL,16) ;
DisplayValue = A ; DisplayString = String(DisplayValue) + « kpa » ; lcd.setCursor (0, 1) ; LCD.Print(DisplayString) ; } //CAT 1 temp / / ((A*256) + B) / 10-40 if (SentMessage == "01 3C") {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 ; DisplayString = 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 ; DisplayString = 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 ; DisplayString = 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 ; DisplayString = String(DisplayValue) + « C » ; lcd.setCursor (0, 1) ; LCD.Print(DisplayString) ; }
}
void Bootup() {lcd.print ("lecteur de voiture") ; pour (int j’ai = 0; j’ai < = 1; i ++) {pour (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 ("Ilona France") ; Delay(2000) ; }