Arduino+LCD ELM327 OBD2 Reader V2.00

Arduino+LCD ELM327 OBD2 Reader V2.00

Postby MartinViljoen » Fri Oct 10, 2014 9:08 pm

I finally managed to build my OBD2 Reader version 2.00

Arduino Code

http://www.techtinker.co.za/uploads/WisperChip.zip

If you you haven't seen V1.00 [url]REMOVED[/url]
I abandoned it because of the LCD, It needed too many wires and which made the setup a bit messy.
Programming the OBD2 part to make it work was already a mission to mars , and didn't want to also focus on getting the electronics to work, let alone finding a clean way to mount it in my Jeep.

So I found this LCD. I can also cleanly mount it using a Cellphone holder that stick to the window.
photo(1).JPG


The previous LCD needed 7 I/O Pins and then another 2 I/O pins for 2 buttons.
The above LCD requires no I/O pins because it all happens via the analog pins and also gives you 5 buttons [LEFT] [RIGHT] [UP] [DOWN] and [SELECT]
My Sketch is currently not using the [SELECT] Button.

The yellow and green jumper cables in the picture goes from the TX/RX pins to the TX/RX of the ELM327 unit.
I soldered 2 wires directly onto the board to bypass the USB bridge Chip. (My Soldering is really bad I know!)
the tracks and legs of the chip and board is tiny and I managed to desolder some components which i couldn't put back as you can see in the picture. Buy hey it still works :-) Makes me thing why were they there in the first place :mrgreen:
Top
Image
Bottom
Image

Below is the pin-out of the chip it self,
529454pl2303ttlsch.jpg


Tip: Create a dummy sketch that writes data with a delay in between to the serial controller of the Arduino then make sure the ELM327 is powered by USB (I cut the 2 wires that goes to the ELM327 so that it only gets power from the USB and doesn't try to communicate to the PC via the 2 middle data lines, see the picture )
Then use a jumper lead from TX pin of the Arduino and poke around on the board around the area where i soldered you will notice the surface mounted led's will show communication as they flicker, that's how i figured out where to solder the TX pin , NOTE! only the TX pin will show activity whilst the RX is not connected, doing this with the RX pin doesn't work.


(I have not yet connected it up yet,and im using the sketch from my V1.00 OBD2 reader which i have adapted)
When finally connecting the setup to my Jeep I will power the Arduino using a USB cellphone lighter charger from the lighter power socket, the ELM327 will get 12V from the OBD2 Interface port on PIN 16 positive and PIN 4/5 negative.


Below is the sketch i used - I will update this thread once i have tested it in my Jeep
Code: Select all
                                                                                                                            // include the library code:
#include <LiquidCrystal.h>


//Declare Serial Read variables
int CmdCount=1;
byte inData;
char inChar;
String BuildINString="";
String DisplayString="";
long DisplayValue;
String SentMessage="";
int ByteCount=0;
long A;
int B;
int WorkingVal;
String WorkingString="";
int RefreshCounter=0; // when the reading should refresh
int RefreshCounterMax=50; //Adjust this refreshrate
int RESETMenuName=0;

//MenuAnalogVal
int x;
//Declare Buttons
int MenuID=0;
int UpDownMenu=0;

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

void setup()
{
    // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
  // Print a message to the LCD.
  lcd.setCursor(0, 0);
  Bootup();//Simulate Bootup process doesnt have to be here this only makes it look cool
  Retry:
  lcd.setCursor(0, 0);
  lcd.print("Connecting......    ");
  lcd.setCursor(0, 1);
  lcd.print("                    ");
  Serial.begin(38400);
 
  delay(500);
  //Send a test message to see if the ELM327 Chip is responding
  SentMessage = "ATI";
  Serial.println("ATI");delay(500);ReadData();
  if (BuildINString.substring(1,7)=="ELM327")
    {
      lcd.setCursor(0, 0);
      lcd.print("Welcome...            ");
      lcd.setCursor(0, 1);
      lcd.print("Connection OK         ");
      delay(1500);
      DisplayString="Reading Data...........";
    }
    else
    {
      lcd.setCursor(0, 0);
      lcd.print("Error             ");
      lcd.setCursor(0, 1);
      lcd.print("No Connection!         ");
      delay(1500);
      goto Retry;
    }
 

  delay(1500);
}

void loop()
{
RefreshCounter++;

x = analogRead (0);
//Serial.println(x);
lcd.setCursor(10,1);
if (x > 800 and x < 820){lcd.print ("Select  ");}
if (x > 620 and x < 630){if (MenuID>0){MenuID--;}DisplayString="Reading Data...........";delay(250);}//Left
if (x > 400 and x < 415){if (UpDownMenu<3){UpDownMenu++;}delay(250);RESETMenuName=0;}//DOWN
if (x > 190 and x < 215){if (UpDownMenu>0){UpDownMenu--;}delay(250);RESETMenuName=0;}//UP
if (x > -10 and x < 10) {if (MenuID<13){MenuID++;}DisplayString="Reading Data...........";delay(250);} //Right

if (UpDownMenu==0)
{
 
  if(RESETMenuName==0){lcd.setCursor(0, 0);lcd.print("Engine Readings  ");lcd.setCursor(0, 1);lcd.print("                      ");delay(2000);RESETMenuName=1;}
  if (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();}}
  if (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();}}
  if (MenuID==2){lcd.setCursor(0, 0);lcd.print("03 Ambient Temp    ");lcd.setCursor(0, 1);lcd.print(DisplayString);if (RefreshCounter==RefreshCounterMax){SentMessage = "01 46";Serial.println("01 46");delay(50);ReadData();}}
  if (MenuID==3){lcd.setCursor(0, 0);lcd.print("04 Throttle %      ");lcd.setCursor(0, 1);lcd.print(DisplayString);if (RefreshCounter==RefreshCounterMax){SentMessage = "01 11";Serial.println("01 11");delay(50);ReadData();}}
  if (MenuID==4){lcd.setCursor(0, 0);lcd.print("05 CAT 1 Temp      ");lcd.setCursor(0, 1);lcd.print(DisplayString);if (RefreshCounter==RefreshCounterMax){SentMessage = "01 3C";Serial.println("01 3C");delay(50);ReadData();}}
  if (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();}}
  if (MenuID==6){lcd.setCursor(0, 0);lcd.print("07 CAT 3 Temp      ");lcd.setCursor(0, 1);lcd.print(DisplayString);if (RefreshCounter==RefreshCounterMax){SentMessage = "01 3E";Serial.println("01 3E");delay(50);ReadData();}}
  if (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();}}
  if (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();}}
  if (MenuID==9){lcd.setCursor(0, 0);lcd.print("10 Vehicle Speed   ");lcd.setCursor(0, 1);lcd.print(DisplayString);if (RefreshCounter==RefreshCounterMax){SentMessage = "01 0D";Serial.println("01 0D");delay(50);ReadData();}}
  if (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();}}
  if (MenuID==11){lcd.setCursor(0, 0);lcd.print("12 Barometric     ");lcd.setCursor(0, 1);lcd.print(DisplayString);if (RefreshCounter==RefreshCounterMax){SentMessage = "01 33";Serial.println("01 33");delay(50);ReadData();}}
  if (MenuID==12){lcd.setCursor(0, 0);lcd.print("13 EGT            ");lcd.setCursor(0, 1);lcd.print(DisplayString);if (RefreshCounter==RefreshCounterMax){SentMessage = "01 78";Serial.println("01 78");delay(50);ReadData();}}
  if (MenuID==13){lcd.setCursor(0, 0);lcd.print("14 Oil Temp");lcd.setCursor(0, 1);lcd.print(DisplayString);if (RefreshCounter==RefreshCounterMax){SentMessage = "01 5C";Serial.println("01 5C");delay(50);ReadData();}}
}
if (UpDownMenu==1)
{
  if(RESETMenuName==0){lcd.setCursor(0, 0);lcd.print("Trans Readings   ");lcd.setCursor(0, 1);lcd.print("                      ");delay(2000);RESETMenuName=1;}
  lcd.setCursor(0, 0);lcd.print("Not Implemented      " ); 
}
if (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("Not Implemented      "); 
}
if (UpDownMenu==3)
{
  if(RESETMenuName==0){lcd.setCursor(0, 0);lcd.print("About By MartinV");lcd.setCursor(0, 1);lcd.print("\\WisperChip V2.00 ");delay(2000);RESETMenuName=1;}
  lcd.setCursor(0, 0);lcd.print("System Version  "); 
}
//Restart RefreshCounter 
if (RefreshCounter>=RefreshCounterMax){RefreshCounter=0;}
delay(1);

}

//Read Data and act accordingly
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("NO DATA","");
  BuildINString.replace("?","");
  BuildINString.replace(",","");
  //Serial.print(BuildINString);
 
  //Check which OBD Command was sent and calculate VALUE
  //Calculate RPM I.E Returned bytes wil be 41 0C 1B E0
  //RPM
  if (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 Vehicle speed I.E Returned bytes wil be 41 0C 1B E0
  if (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
  if (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
  if (SentMessage=="01 0F")
  {
    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);
  }
 
  //Air flow Rate
  if (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
  if (SentMessage=="01 46")
  {
    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);
  }
 
  //eNGINE OIL tEMP
  if (SentMessage=="01 5C")
  {
    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);
  }
 
  //Throttle position
  if (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 pressure
  if (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("WisperChip V2.00 ");
     for (int i=0; i <= 1; i++)
     {
       for (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("Martin Viljoen");   
delay(2000); 
}



This is what the end product looks like when its clamped into a Cellphone Holder.
usssnamed.jpg

unnadddddmed.jpg
You do not have the required permissions to view the files attached to this post.
Image
User avatar
MartinViljoen
 
Posts: 109
Joined: Mon Oct 06, 2014 5:23 pm
Location: Centurion South Africa

Re: Arduino+LCD ELM327 OBD2 Reader V2.00

Postby zzapultimate » Sat Dec 06, 2014 6:32 am

Martin,

Thanks for sharing this code. I've been trying to get this working in my car.

I uploaded this code to my Arduino and added the command Serial.println("AT SP 2");delay(500);ReadData();

I also had to modify the button part of the code since I don't have the same LCD with built in buttons.

With those two modifications I can get the elm327 and arduino to communicate with the OBDII port. Now my problem is that the data doesn't seem to be accurate. The temps read way off, the throttle position is jumpy, etc.

How well does the code work in your jeep? Any ideas on why my data is so off?
zzapultimate
 
Posts: 4
Joined: Sat Dec 06, 2014 6:05 am

Re: Arduino+LCD ELM327 OBD2 Reader V2.00

Postby MartinViljoen » Sun Dec 07, 2014 5:05 pm

zzapultimate wrote:Martin,

Thanks for sharing this code. I've been trying to get this working in my car.

I uploaded this code to my Arduino and added the command Serial.println("AT SP 2");delay(500);ReadData();

I also had to modify the button part of the code since I don't have the same LCD with built in buttons.

With those two modifications I can get the elm327 and arduino to communicate with the OBDII port. Now my problem is that the data doesn't seem to be accurate. The temps read way off, the throttle position is jumpy, etc.

How well does the code work in your jeep? Any ideas on why my data is so off?


Even after using the code in the original post ?
Its difficuilt to say, you would have print the data top the serial port then take the values an manually calculate it to see where its going wrong
Image
User avatar
MartinViljoen
 
Posts: 109
Joined: Mon Oct 06, 2014 5:23 pm
Location: Centurion South Africa

Re: Arduino+LCD ELM327 OBD2 Reader V2.00

Postby zzapultimate » Sun Dec 07, 2014 10:47 pm

The code is mostly the same. I made a few modifications to the buttons, menus, and changes some of the formulas to read out in Fahrenheit, but other than that the meat of the code is still the same.

How do I print out the serial data? Would that allow me to see what data I'm getting back from the car?
zzapultimate
 
Posts: 4
Joined: Sat Dec 06, 2014 6:05 am

Re: Arduino+LCD ELM327 OBD2 Reader V2.00

Postby MartinViljoen » Mon Dec 08, 2014 8:54 am

zzapultimate wrote:The code is mostly the same. I made a few modifications to the buttons, menus, and changes some of the formulas to read out in Fahrenheit, but other than that the meat of the code is still the same.

How do I print out the serial data? Would that allow me to see what data I'm getting back from the car?

Yes it will, print out what you are receiving.

Actually what you should do it, use an ELM327 cable without the Arduino , Connect it with a PC and use putty.

Then you would sent
ATI
ATL1
ATSP2
then I.E send 01 0C wand the car will report back with RPM, what you get back needs to be converted to numbers , you can use the windows calculator (Put it in programmer mode) from the view menu.
From there you need to use the OBD2 formula for RPM from Wikipedia.
Image
User avatar
MartinViljoen
 
Posts: 109
Joined: Mon Oct 06, 2014 5:23 pm
Location: Centurion South Africa

Re: Arduino+LCD ELM327 OBD2 Reader V2.00

Postby zzapultimate » Tue Dec 09, 2014 2:08 am

I don't have any means of connecting the ELM327 directly to the computer without the Arduino, so I think my best bet is to use the arduino & environment on my computer.

What commands would I add to the code to be able to read the cars response to the commands I'm sending it?

Or maybe easier, how to read the "ELM327" response during initialization. If i actually wanted to SEE the elm send back the "ELM327" response after the Serial.println("ATI"); command, how would I do that? Can I add a read command that would show the response in the serial monitor?

Thanks.
zzapultimate
 
Posts: 4
Joined: Sat Dec 06, 2014 6:05 am

Re: Arduino+LCD ELM327 OBD2 Reader V2.00

Postby MartinViljoen » Tue Dec 09, 2014 8:34 am

zzapultimate wrote:I don't have any means of connecting the ELM327 directly to the computer without the Arduino, so I think my best bet is to use the arduino & environment on my computer.

What commands would I add to the code to be able to read the cars response to the commands I'm sending it?

Or maybe easier, how to read the "ELM327" response during initialization. If i actually wanted to SEE the elm send back the "ELM327" response after the Serial.println("ATI"); command, how would I do that? Can I add a read command that would show the response in the serial monitor?

Thanks.



You can also do that, problem is you need to make an arduino sketch to send and receive data, which will both end up on the serial monitor.
When receiving data using the arduino from the ELM327 it sends 1 character at a time so you need to keep the stream open untill all characters have been received.
Off the top of my head,cant tell you right now how to do that, I need to sit with it first, hopefull toinight when i have some time i will try an help you.

Will make a sketch that will send the command you want and then receive the data to the serial monitor.
For a list of command you can get the EML327 documentation from their website
Image
User avatar
MartinViljoen
 
Posts: 109
Joined: Mon Oct 06, 2014 5:23 pm
Location: Centurion South Africa

Re: Arduino+LCD ELM327 OBD2 Reader V2.00

Postby zzapultimate » Tue Dec 09, 2014 10:37 pm

Thanks Martin. I found the ELM document and have been reading through it. I'm getting a better understanding of how it works now.
zzapultimate
 
Posts: 4
Joined: Sat Dec 06, 2014 6:05 am

Re: Arduino+LCD ELM327 OBD2 Reader V2.00

Postby 10_SS » Sat Jan 31, 2015 10:00 am

Martin, I wanted to say THANKS for posting this code. I've been trying for about 1yr now to get something I was happy with, but really something that was simple that would allow me to add my own 'custom' PIDS as I require things like GM Knock Retard, etc (non SAE PIDS). You did it. This is the first one of the kind that is out there that doesn't require some hard to understand library. Thank you for this!!

I wanted to PM you regarding the refresh rate... See where your at with it. All of everything else I've tried they are all "slow" to update evan as stock, with SAE PIDS... just wanted to chat about that. I cant PM as I'm new... but have some questions.. and some really good news at least for the GM vehicles I'm working with... I see your V1 had 300ms update between PID requests (slow, like everything else)... V2 has 50ms. just curious how your getting the 50ms response with the standard SAE PID requests? As you know, 300ms you probably want one PID per screen. But, 50ms, you can list 4-8 PIDS on one 4x20lcd screen, and still have a fast update rate.
10_SS
 
Posts: 1
Joined: Sat Jan 31, 2015 9:46 am

Re: Arduino+LCD ELM327 OBD2 Reader V2.00

Postby MartinViljoen » Sun Feb 01, 2015 12:40 am

Hi there , no probs glad you are able to put it to use, sorry about the PM thing , some first time joiners are using it to send spam ads, you can mail me on "mailmartinviljoen at gmail dot com" if you like.

Regarding the 50ms are you asking what the response is like? If so its fine, i guess the only way to find out to see if it will manage with a larger display is to try it, for me i coulnt go faster because it causes the lcd to create ghost characters because it cant popwer up and down the pixels quick enough which is a limitation of the lcd's refreshrate.

But pop me an email will gladly help where i can.
Image
User avatar
MartinViljoen
 
Posts: 109
Joined: Mon Oct 06, 2014 5:23 pm
Location: Centurion South Africa

Next

Return to OBD2 & CAN-BUS Projects

Who is online

Users browsing this forum: No registered users and 3 guests

cron