View Single Post
Old 04-20-2021, 04:41 PM   #1
apollokid's Avatar
Join Date: Aug 2020
Location: Milan (Italy)
Default Arduino LH Jetronic interface: live data + MicroSD logging + ELM327

Hello everyone, my name is Diego and I live in the north of Italy. I recently posted a question in this forum about the reverse engineering of the Tq-signal that the LH Jetronic send to the EZK.
I've immediatly found some users interested when I described the project on which I'm working on and I was invited to open a new topic to create a place where to talk about and to share tech information and experiences.

Since it's impossibile to query the live data from the LH-Jetronic of my Volvo 945 I decided that I could try to build an interface that, acting like a network sniffer, decodes all the I/O signals directly through the control unit connector using my DIY breakout-box.

This is a picture of the board in the state it is today:

The project started last summer when I decided that it was the time to learn something about this Arduino who talk everyone. Today it's still under development and some parts are yet missing but the board is already usable for some tests and it is in a state that is much more than a proof of concept.

The board is divided in 3 main layers:
  • 12V car layer: here I put all the circuitry that is powered by the battery of the car. Here is where I put active filters, resistos, OpAmps and anything I need to drive the led of the optoisolators. I've also used some microswitches to be able to enable/disable each single signal without disconnect any wire.
    I still have to add an overcurrent protection circuit (a couple of fuses it could be the minimum)
  • Optoisolators layer: here I put the optoisolators (now I'm using both the 4N35 for the digital signals and the HCNR201 for the analog ones)
  • Arduino layer: here I put all the 5V circuitry from the transistors of the optoisolators to the input pins of the Arduino board

The Arduino board I used is an Arduino Mega 2560 since it supports 6 interupt pins and many digital and analog input pins plus the following shields:
Here some screenshots of the GUI I've designed with a brief description of the available functions:

Injection screen

  • Ton is the pulse time of injectors
  • Tq is the engine load (yet under reverse engineering, at the moment I read the raw pulse width in μs)
  • rpm is obvious
  • λ is a graphical tool that shows the deviation from λ=1 (stechiometric mixture), it uses a configurable lenght circular buffer to calculate a mobile avarage plus the voltage produced by the oxigen sensor
  • hummer is when engine is knocking (yet under reverse engineering)
  • switch is the idle switch on the throttle body
  • IAC is the PWM of the idle air valve that measures the opening %

Cooling system

  • 1 Fan: show when radiator fan is active at low speed
  • 2 Fans: the same at high speed
  • ECT voltage: voltage of the ECT sensor but I support the LH doesn't read a voltage but a current that I could measure using a breakout-box
  • ECT temperature (at the moment I use a quadratic interpolation function base on the voltage but I don't think that is too much precise)

Oxigen sensor

  • Media mob. (in english mobile avarage): is the configurable lenght in seconds of the samples
  • n. camp. (in english number of samples): report how many samples are in the circular buffer
  • The λ % indicator reports for how much time the mixtures was rich or lean
  • Oxigen sensor voltage
  • Same λ graphical tool of "Injection screen"


  • Giri (engine rpm)
  • VelocitÓ (vehicle speed)
  • Nice To Have: instant fuel consumption, must be measured the opening and closing latency of the injectors with a scope or by consulting a tech paper (more documentation is need)

ELM327 Emulator

Report the status of the bluetooth ELM 327 emulator.
At the moment I support only the following PIDs but I want to supports as many as I can.
  • 010C engine rpm
  • 0105 Engine coolant temperature
  • 0114 Oxygen Sensor 1
  • 0D Vehicle speed (incomplete)

For this feature I made a derivated work from the library GTTurboEcu since the orginal version works only with SoftwareSerial and I had found some random hangs when the rpm signal that I was reading using interrupts changed quickly.
So I added the support to HardwareSerial too by introducing an abstract layer interface and in this way I solved all my problems.
NOTE: I've tested it only with Torque on Android but it may also work with other compatible scanners

MicroSD real time data logger

To be implemented.
I've some ideas to be developed, for example I could create the commands to start/stop the logging and to choose which signal include or the max leght of each recording.
I was also think at a injection map reverse decoder (by only driving the car it could be relative easy to rebuild the real injection map also without accessing to the memory of the control unit and it could also be possibile to measure the deviation (min vs max) of injectors pulse width that could help in diagnosys (for example in the case of a roughly engine)
Any suggestion here in usefull features is really appreciated.


To be implemented
For example I would like to add i18n support

That's all
I hope to finish the board within this year but I don't have none that runs me back so I will take all the time I need.
Anyway I'm curious to start testing it on the car (at the moment I tested it only on my desk using a signal generator and a DIY injectors emulator that I build using a fuel relay drived by a Darlington transistor with a zener 60V diode as overvoltage protection to replicate as much as possible the same waveform of the real injectors)
Finally I will return to work on the software Kikad becasue It could be fantastic to get a PCB and collapse this large prototype board into a little device that stays in the palm of one hand.

Opss... I was forgetting to share you at least one picture of my DIY breakout boxes.
Without them and the my friend Picoscope 2204A this project could be really hard to carry on, if not impossibile.
Here more pictures hoping they could be useful to someone:

apollokid is offline   Reply With Quote