Arduino+LCD ELM327 OBD2 Reader V2.00

Re: Arduino+LCD ELM327 OBD2 Reader V2.00

Postby abt06 » Tue Mar 24, 2015 2:27 pm

Hi!
I connected gadget to Audi Q5. It has connected good. But when I check RPM it show me not correct numbers. If RPM is 790 then on display I can see 0 if I add throttle to 1500 it show as 670 RPM. It's a first problem
Second is Road Speed. When I start it shows OK. But later when I add speed It shows speed as MPH( in Miles). ???
When the speed is around 50 Km/h it shows till 54 km/h as 5 km/h and it's repeated every 60, 70, 80, 90 ... etc.
I dont understand it. Could you help me where is problem?
abt06
 
Posts: 1
Joined: Thu Mar 19, 2015 12:11 pm

Re: Arduino+LCD ELM327 OBD2 Reader V2.00

Postby MartinViljoen » Mon Mar 30, 2015 8:18 am

abt06 wrote:Hi!
I connected gadget to Audi Q5. It has connected good. But when I check RPM it show me not correct numbers. If RPM is 790 then on display I can see 0 if I add throttle to 1500 it show as 670 RPM. It's a first problem
Second is Road Speed. When I start it shows OK. But later when I add speed It shows speed as MPH( in Miles). ???
When the speed is around 50 Km/h it shows till 54 km/h as 5 km/h and it's repeated every 60, 70, 80, 90 ... etc.
I dont understand it. Could you help me where is problem?


I haven't tested it extensively, I know at some point there was a miss calculation on the RPM in the Arduino Sketch (Cant remember if I uploaded the corrected version), So If you look at RPM calculation formula compared to the formula that should be used on the OBD2 Wikipedia page, the mistake is easy to spot.

Regarding the Speed , you need to monitor the actual data that comes from your Audi then translate it appropriately,

(Sorry If I'm not being helpfull enough, I a bit tied up with work other related projects at the moment, Time is not my friend at this stage :D )
Image
User avatar
MartinViljoen
 
Posts: 106
Joined: Mon Oct 06, 2014 5:23 pm
Location: Centurion South Africa

Re: Arduino+LCD ELM327 OBD2 Reader V2.00

Postby berof » Thu May 28, 2015 11:38 am

Hello.Thanks for sharing your code.Before trying it , can you help me how to connect the elm327 to the arduino.I have this version which is bluetooth http://www.iobd2.org/wp-content/uploads ... 9032_a.jpg

It has a bluetooth module connected , with only power , ground , rx and tx connected to ELM327.Do i have to connect the ground from this to the arduino ground ? Or only tx/rx ?
berof
 
Posts: 2
Joined: Thu May 28, 2015 11:32 am

Re: Arduino+LCD ELM327 OBD2 Reader V2.00

Postby MartinViljoen » Thu May 28, 2015 8:12 pm

berof wrote:Hello.Thanks for sharing your code.Before trying it , can you help me how to connect the elm327 to the arduino.I have this version which is bluetooth http://www.iobd2.org/wp-content/uploads ... 9032_a.jpg

It has a bluetooth module connected , with only power , ground , rx and tx connected to ELM327.Do i have to connect the ground from this to the arduino ground ? Or only tx/rx ?


Hi Berof, easiest is to find the ELM327 Chip on the board then just follow the tracks from TX and RX and connect that to the TX and RX pins on the Arduino.
For it to work the Arduino must be grounded to the ELM327.

Image
Image
User avatar
MartinViljoen
 
Posts: 106
Joined: Mon Oct 06, 2014 5:23 pm
Location: Centurion South Africa

Re: Arduino+LCD ELM327 OBD2 Reader V2.00

Postby berof » Mon Jun 01, 2015 11:49 am

Thanks for the quick reply.

Here is my ELM327 MINI bluetooth device.
Image

There was the bluetooth module which i removed. It was similar to this one:
Image

It has only soldiered GND , +3,3v , RXD and TXD

The ELM327 is two layered , so i cant access the chip , but im not sure i have to.
Image

When I used the ELM with my phone , it had 3 leds and they all flashed when it was connected and talking.Now when i plug it it only has it RED LED on.I think when i connect it in my car , both arduino and ELM have common ground through the car , so black soldiered wire is not needed , but with or without it connected i have no success.Your code keep saying "connecting,error" on the LCD.

When i connect all items at home , just powering arduino with PC , i get the RED LED on ELM ON.You mentioned when i have the correct connections made , the leds on the arduino for tx/rx must start flashing.When to expect that , just on the PC or when connected in car ?

Can i test with some other code in car , if i receive any data from ELM or not ?
berof
 
Posts: 2
Joined: Thu May 28, 2015 11:32 am

Re: Arduino+LCD ELM327 OBD2 Reader V2.00

Postby max-seat » Wed Sep 16, 2015 9:53 pm

Hello,
When sending messages ELM327 does not answer why ??? My OBD2 adapter is a UART
Thanks ;)

//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;
}
max-seat
 
Posts: 1
Joined: Wed Sep 16, 2015 9:43 pm

Re: Arduino+LCD ELM327 OBD2 Reader V2.00

Postby el_pombo » Wed Nov 02, 2016 2:30 am

I am doing something wrong! From the pics I was unable to find exactly the RX and TX pins on the board, so I tested conductivity with a multimeter and did this:

elm1.jpg


elm2.jpg


When I send a command the light on the board blinks, so it seems RX on the board is working, but I can't get a response so I think I didn't solder to the correct pin for TX on the board.

Does anyone know the exact location of both pins?

All the best!
You do not have the required permissions to view the files attached to this post.
Last edited by el_pombo on Fri Nov 04, 2016 12:49 pm, edited 2 times in total.
el_pombo
 
Posts: 2
Joined: Tue Nov 01, 2016 5:21 pm

Re: Arduino+LCD ELM327 OBD2 Reader V2.00

Postby el_pombo » Thu Nov 03, 2016 11:06 pm

Nevermind, I figured it out!
el_pombo
 
Posts: 2
Joined: Tue Nov 01, 2016 5:21 pm

Re: Arduino+LCD ELM327 OBD2 Reader V2.00

Postby MartinViljoen » Sat Dec 10, 2016 6:56 pm

MartinViljoen wrote: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
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
Image
User avatar
MartinViljoen
 
Posts: 106
Joined: Mon Oct 06, 2014 5:23 pm
Location: Centurion South Africa

Re: Arduino+LCD ELM327 OBD2 Reader V2.00

Postby r0b3rt » Fri Aug 11, 2017 12:28 pm

Hello,
can i pleas you for help?
When i try to include ArduinoOBD into library in Arduino, got error: "Specified folder/zip file does not contain a valid library".
All i want to do is read PID_ENGINE_OIL_TEMP – Engine oil temperature (°C) and print it on LCD over I2C.

PLEASE,PLEASE,PLEASE help me!
r0b3rt
 
Posts: 1
Joined: Fri Aug 11, 2017 12:18 pm

Previous

Return to OBD2 & CAN-BUS Projects

Who is online

Users browsing this forum: No registered users and 1 guest

cron