Arduino OBDII Multi-Digital LED Data Display and Scan Tool

Andrew Overby
3 / 19 / 2018

The auto industry has been an interest of mine since a young age. Advanced technology in these vehicles are becoming more widespread and autonomous cars may be seen in mass production by 2020. I firmly believe, however, that there is a passion when driving a vehicle, and it is certainly fun to push their limits every once in a while. By creating a new-school gauge that would connect through the OBD port in order to give the user live read-outs of certain PIDs, I added my own flare. My goal was to create one that is affordable and surpass the capabilities of other OBDII gauges on the market. A few companies sell products that are similar to this project, but expensive.

A common application of this technology can be seen in scan tools used by mechanics. I wanted to incorporate this technology so the user could use the gauge to not only have a new-school, on board display for the vehicle’s diagnostics, but have the ability to scan codes in case a check engine light were to turn on. The user would also have the ability to clear these codes once the issues are resolved.

The core of the idea started with an Arduino Nano. I quickly realized this was not suitable and I needed more memory and storage for the large program I would be running. Instead, I chose an Arduino Mega to carry out the project. The gauge has multiple menus, each with different variations of PID readings. These include:

  • Multi-Gauge (RPM, Speed, Engine Load, Engine Temperature, Battery Voltage) - *as seen in headline video
  • Timer (0-60, 0-100)
  • Digital Tachometer
  • Digital Speedometer
  • Intake Manifold Pressure
  • Mass Flow Rate
  • Engine Load
  • Engine Oil Temperature
  • Engine Intake Temperature
  • Engine Coolant Temperature
  • Throttle Percent

Each PID is indicated by an Adafruit NeoPixel ring that will light up with respect to the current state of the control. For instance, when the car reaches its redline RPM, it flashes a different color, telling the driver to switch gears. This is very similar to a shift light. In order to scroll through the menus and select different options, pressing and holding the button on the side of the gauge will select the option next to the indicated arrow. If the user clicks the button, it will scroll, and if the user double clicks the button, it will take the user back to the previous screen or quickly access a menu for the different modes.

The user also has the ability to change the colors on the LED display and customize the gauge to fit their car’s characteristics. These settings include: redline RPM, LED brightness, LED color, shift light color, connection type (different manufacturers tend to use different sample rates for their data retrieval) , and the choice between metric or imperial units.

A detailed representation of each menu is shown below. Please refer to the key at the bottom. Note that the car was not running but the ignition was on so some readings are not relevant, such as RPM, engine load, and mass air flow. In this case, they indicate as 'dash' marks.

The chart above explains the process of pressing the button through the menus/submenus. By experimenting with the debouncing times on a button, I was able to create multiple functions for one action saving cost and space on the gauge.

Aside from the gauge, the user has the ability to also use the serial monitor in the Arduino IDE to scan and read their vehicle’s PIDs. This helps create a more friendly interface giving there are certain limits with the display.

To connect the gauge to my car, I used the Freematics OBD2UART Adapter to easily interface the Arduino Mega with the port. To house the unit, I created a control box designed in SOLIDWORKS that was 3D printed. There were some issues with this print due to the inconsistent heating on the bed of the printer. In addition to the control box, the entire gauge housing was designed in a SOLIDWORKS assembly as well before printing. To help limit energy consumption, I finished the project by wiring a relay to the ignition in my car that would only allow the gauge to be on when the car is.

This project was a great learning experience diving in to the world of coding. I was also able to improve my skills in programs such as: Arduino IDE and SOLIDWORKS, but most of all, I saw significant improvements with my electronic skills from previous projects. I look forward to further improving this product by designing my own PCB board through AutoDesk Eagle and creating a better parts assembly. 

Below is a demonstration of the research and development of the project.

Below is the completed gauge inside a steering column gauge pod by New South Performance.