Many hobbyists and car enthusiasts are diving into DIY car diagnostics and data monitoring using Arduino and OBD2 interfaces. A common setup involves the Arduino Uno, the Sparkfun OBD2 UART module, and an LCD screen to display real-time vehicle parameters such as RPM and speed. This project aims to read and display car data, but users sometimes encounter issues where the displayed data becomes static and doesn’t update as expected. Let’s explore a troubleshooting scenario and potential solutions for this problem, focusing on using the Arduino Uno with the Sparkfun OBD2 UART to retrieve live car data.
One user encountered a problem with their Arduino OBD2 project. They wired a Sparkfun OBD2 UART to an Arduino Uno, intending to display RPM, speed, coolant temperature, and oxygen sensor readings on a 16×2 LCD screen. The wiring was done by connecting OBD TX to Arduino RX, OBD RX to Arduino TX, and OBD GND to Arduino GND. They used code adapted from Sparkfun’s example, but noticed that the RPM and speed values displayed on the LCD seemed frozen, not updating even after starting the car’s engine. The initial readings appeared to be the last recorded values before the engine was shut off, which is not the desired real-time monitoring behavior.
To investigate if the Sparkfun OBD2 UART module was functioning correctly, the user wisely tested it with a USB FTDI (TTL) adapter and a terminal program (Tera Term). They connected the OBD TX to TTL RX, OBD RX to TTL TX, and OBD GND to TTL GND. Using AT commands as detailed in the Sparkfun OBD2 UART guide, they successfully communicated with their car’s OBD2 port. Commands like ATZ
(reset), ATRV
(read voltage), ATSP0
(auto protocol select), 010C
(RPM request), and 010D
(speed request) all returned expected values. Crucially, the RPM and speed values updated when the engine was started and idled, confirming that the Sparkfun OBD2 UART module was indeed capable of reading live data from the car.
The successful TTL adapter test strongly suggests that the issue lies within the Arduino setup or code. Here are a few potential areas to examine when troubleshooting static data readings in an Arduino OBD2 project with the Sparkfun OBD2 UART:
-
Serial Communication Issues: Double-check the serial communication setup in the Arduino code. Ensure the baud rate in
Serial.begin(9600);
matches the expected baud rate for the Sparkfun OBD2 UART. Also, verify that the RX and TX pins are correctly connected between the Arduino and the Sparkfun module. Sometimes swapped RX/TX lines can lead to communication problems. -
Code Logic: Review the Arduino code for any logical errors in how OBD2 requests are sent and responses are processed. The provided code snippet shows the use of
Serial.println("010D");
andSerial.println("010C");
to request speed and RPM respectively, followed bygetResponse()
to read the responses. Ensure that thegetResponse()
function correctly reads and parses the OBD2 data. Pay close attention to howrxData
is populated and howstrtol()
is used to convert the hexadecimal data to integer values. -
Flushing Serial Buffer: The code includes
Serial.flush();
after sending commands. Whileflush()
waits for the transmission of outgoing serial data to complete, it does not clear the receive buffer. If there is residual data in the serial buffer, it might interfere with reading new responses. Consider if clearing the receive buffer before expecting a response might be necessary in certain scenarios, although in this case, thegetResponse()
function aims to read until a carriage return, which should ideally clear out previous data. -
Power Supply: While less likely given the TTL test worked, ensure the Sparkfun OBD2 UART module is receiving sufficient power from the Arduino. Although typically the Arduino’s power should be adequate for this module, power fluctuations or insufficient current can sometimes cause erratic behavior.
To effectively troubleshoot this “static data” issue, systematically go through these points. Double-checking the serial wiring and baud rate is a good starting point. Carefully examine the code, particularly the response parsing logic within getResponse()
. Using the serial monitor in the Arduino IDE to observe the raw serial data being received from the Sparkfun OBD2 UART can provide valuable insights into whether the Arduino is correctly receiving data and if the issue is with data interpretation or communication itself. By methodically eliminating potential causes, users can successfully get their Arduino Obd2 Sparkfun projects to display real-time car data accurately.