Repository files navigation

🚗 OBD2 K-Line Library
(ISO 9141 · KWP2000 · KW1281 · DS2 · KW82)

A professional, high-performance Arduino/ESP32 library for vehicle diagnostics over K-Line — universal OBD-II (ISO 9141-2, ISO 14230-4/KWP2000) plus manufacturer-specific deep access for VAG KW1281, BMW DS2 and Opel KW82.

GitHub forksGitHub Repo starsGitHub Issues or Pull RequestsGitHub LicenseGitHub last commitESP32ArduinoPlatformIO RegistryArduino IDE Library Manager


📌 Overview

OBD2_KLine is a professional, high-performance library for vehicle diagnostics via K-Line, supporting ISO 9141-2, ISO 14230-4 / KWP2000, VAG KW1281, BMW DS2 and Opel KW82. Designed for Arduino, ESP32 and similar microcontrollers, it lets your device talk directly to a vehicle's ECU over the K-Line.

K-Line is a legacy protocol used in many European and Japanese vehicles built between ~1987 and 2010, especially before CAN became mandatory — making this library ideal for both generic OBD-II diagnostics and manufacturer-specific deep system access (VAG, BMW, Opel).

❓ Does Your Vehicle Support K-Line?

Confirm your car speaks K-Line by checking the OBD-II connector pins:

  • Pin 7 connected → K-Line (ISO 9141 / ISO 14230). This library will work.
  • Pins 6 & 14 connected → CAN bus. Use my OBD2 CAN Bus Library instead.

Example OBD-II connectors (left: K-Line with pin 7 · right: CAN with pins 6 & 14):

OBD2 Connector Pin 7 K-LineOBD2 Connector Pin 6 and 14 CAN Bus

🚀 Key Features

  • Universal compatibility — Arduino (Uno, Nano, Mega), ESP32 and other popular MCUs.

  • Six protocols, one API — the packet format is a setting, not a rewrite of your sketch.

    CategorySupported Protocols
    Universal OBD2ISO 9141-2, ISO 14230-4 (KWP2000)
    VAG (VW/Audi/Seat/Škoda)KW1281 (legacy block protocol)
    BMWDS2 (Diagnostic System 2)
    Opel / VauxhallKW82
    Anything elseCustom — define the framing yourself
  • Flexible initialization5-Baud (Slow Init), Fast Init, ping and handshake-free modes, each selectable independently of the protocol.

  • Automatic detection — finds the protocol on its own when you do not yet know what the car speaks.

  • Handles the plumbing — headers, length bytes, checksums and handshake timings are built and verified for you.

  • Developer friendly — integrated debug output showing every byte on the bus.

🔍 What You Can Read & Control

🔹 Standard OBD-II — works on any compliant car

Generic diagnostics defined by SAE J1979. No car-specific configuration needed — plug in and read:

ModeDescription
01Live data — real-time sensor values (RPM, coolant temp, speed, throttle, fuel trims…)
02Freeze frame — the sensor snapshot stored when a fault appeared
03Read stored Diagnostic Trouble Codes (DTCs)
04Clear DTCs and reset the MIL
05Oxygen sensor test results
06On-board monitoring test results
07Read pending Diagnostic Trouble Codes
09Vehicle information — VIN, Calibration IDs, Calibration Verification Numbers

DTCs come back as readable codes (P0123 style), and a supported-PID scan lets you ask the ECU which PIDs it actually implements before requesting them.

🔸 Manufacturer protocols — deeper, car-specific access

The manufacturer protocols reach data and functions that generic OBD-II never exposes:

  • Extended live data — manufacturer measurement blocks carrying far more channels than the standard PIDs, decoded into named values with real units (injection time, ignition advance, idle actuator steps, engine load, lambda, and so on). One request returns the whole block, so a dozen values cost a single message.
  • Vehicle control & actuator tests — command the ECU to drive real hardware: MIL and service lamps, fuel pump relay, A/C relay, throttle actuator, tank vent valve, and per-cylinder ignition coil or injection cut-off.
  • Full ECU identification — VIN, part number, supplier, hardware version, software number and engine code.
  • ECU memory & flash reading — read the ECU's internal memory block by block across the whole flash range, streamed over the debug port so you can capture the dump to a file on your PC for analysis.
  • Raw service access — send any manufacturer service by hand; the library still adds the header, length byte and checksum for you.
  • Discovery tools — scan which identifiers an ECU answers and dump responses as offset tables, so you can map an ECU nobody has documented yet.

💡 Manufacturer-specific access is provided through ECU definition files. The generic OBD-II layer ships with the library; car-specific definitions (Opel Simtec 71 / Bosch M1.5.5 / Bosch ME7.5, BMW Bosch BMS 46 and others) are maintained separately — see the Contact section below.

📊 Typical Data Rates

Real-world throughput measured with this library:

ProtocolAverage responses per second
ISO 9141-2~8–9 responses/sec
ISO 14230-4~9–10 responses/sec

🔎 Actual throughput varies with the ECU's internal processing time, the requested PID type and system latency.

📦 Installation

Arduino Library Manager (recommended)

  1. Open the Arduino IDE.
  2. Go to Sketch → Include Library → Manage Libraries…
  3. Search for "OBD2 K-Line".
  4. Click Install.

Manual

Download this repo as a .zip and add it via Sketch → Include Library → Add .ZIP Library…

⚡ Basic Usage — Read Live Data

Read Engine RPM, Coolant Temperature and Vehicle Speed. The library automatically handles different board architectures (AVR / ESP32):

#include"OBD2_KLine.h"// core: connection + protocol layer
#include"ecus/OBD2_Standard.h"// standard OBD2 diagnostics -> OBD2_KLine
OBD2_KLine KLine;
// Uno / Nano have no spare hardware serial, so they fall back to AltSoftSerial// on its fixed pins (RX 8, TX 9). Every other board uses Serial1.
#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__)
#include<AltSoftSerial.h>
AltSoftSerial altSerial;
#defineOBD_SERIAL altSerial
#else
#defineOBD_SERIAL Serial1
#endif
#defineOBD_RX_PIN5
#defineOBD_TX_PIN4voidsetup() {
Serial.begin(115200);
KLine.setSerial(OBD_SERIAL);
KLine.setPins(OBD_RX_PIN, OBD_TX_PIN);
KLine.setDebug(Serial); // View communication logs
KLine.setProtocol(Automatic); // Automatic, ISO9141, ISO14230, KW1281, DS2, KW82, Custom
Serial.println("OBD2 System Starting...");
}
voidloop() {
if (!KLine.isConnected() && !KLine.connect()) return;
float rpm = KLine.getLiveData(0x0C); // PID 0x0C: Engine RPMfloat coolant = KLine.getLiveData(0x05); // PID 0x05: Coolant Tempfloat speed = KLine.getLiveData(0x0D); // PID 0x0D: Vehicle Speed
Serial.print("RPM: "); Serial.println(rpm);
Serial.print("Temp: "); Serial.print(coolant); Serial.println(" C");
Serial.print("Speed: "); Serial.print(speed); Serial.println(" km/h");
}

🛠️ Schematics for Communication

K-Line operates at different voltage/signal levels than microcontroller pins. These circuits provide level shifting and protection for safe, stable operation. Pick the approach that suits your project:

🔹 Transistor-based

Simple, low-cost discrete-transistor interface for basic builds and prototyping. R6 is sized for 3.3V MCUs — for a 5V MCU, change R6 to 5.3 kΩ.

🔹 Comparator-based

Uses a cheap comparator IC (e.g. LM393) for a clean digital level — better noise immunity and well-defined thresholds than the transistor design, at a slightly higher component count.

🔹 Dedicated automotive IC

L9637DMC33290

Si9241SN65HVDA195

Purpose-built K-Line / ISO 9141 transceiver ICs (L9637D, MC33290, Si9241, SN65HVDA195, etc.) with built-in level shifting and protection — highest reliability, recommended for production-grade designs.

📷 Gallery

Custom PCBs designed for this library:

🛠️ Custom hardware & PCBs: looking for ready-to-use devices or custom-made PCBs based on this project? Reach out via email in the Contact section below.

🔗 Related Projects

Part of a full OBD2 / automotive diagnostics ecosystem:

Firmware & ReadersLibrariesManufacturer ProtocolsUI
OBD2 K-line ReaderOBD2 K-Line LibraryBMW I/K BusOBD2 Diagnostic UI
OBD2 CAN Bus ReaderOBD2 CAN Bus LibraryVAG KW1281

☕ Support My Work

If you enjoy my projects and want to support me, you can do so through the links below:

Buy Me A CoffeePayPalGitHub Sponsors


📬 Contact

For information, job offers, collaboration, sponsorship, or purchasing my devices, you can contact me via email.

📧 Email: muksin.muksin04@gmail.com


Created by Muki · If you find this useful, consider giving it a ⭐

About

OBD2 K-Line diagnostics library for Arduino, ESP32 and compatible boards. Supports ISO9141, ISO14230 (KWP2000), KW1281, DS2 and KW82

Topics

Resources

Stars

59 stars

Watchers

2 watching

Forks

Releases

Sponsor this project

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

🚗 OBD2 K-Line Library
(ISO 9141 · KWP2000 · KW1281 · DS2 · KW82)

A professional, high-performance Arduino/ESP32 library for vehicle diagnostics over K-Line — universal OBD-II (ISO 9141-2, ISO 14230-4/KWP2000) plus manufacturer-specific deep access for VAG KW1281, BMW DS2 and Opel KW82.

GitHub forksGitHub Repo starsGitHub Issues or Pull RequestsGitHub LicenseGitHub last commitESP32ArduinoPlatformIO RegistryArduino IDE Library Manager


📌 Overview

OBD2_KLine is a professional, high-performance library for vehicle diagnostics via K-Line, supporting ISO 9141-2, ISO 14230-4 / KWP2000, VAG KW1281, BMW DS2 and Opel KW82. Designed for Arduino, ESP32 and similar microcontrollers, it lets your device talk directly to a vehicle's ECU over the K-Line.

K-Line is a legacy protocol used in many European and Japanese vehicles built between ~1987 and 2010, especially before CAN became mandatory — making this library ideal for both generic OBD-II diagnostics and manufacturer-specific deep system access (VAG, BMW, Opel).

❓ Does Your Vehicle Support K-Line?

Confirm your car speaks K-Line by checking the OBD-II connector pins:

  • Pin 7 connected → K-Line (ISO 9141 / ISO 14230). This library will work.
  • Pins 6 & 14 connected → CAN bus. Use my OBD2 CAN Bus Library instead.

Example OBD-II connectors (left: K-Line with pin 7 · right: CAN with pins 6 & 14):

OBD2 Connector Pin 7 K-LineOBD2 Connector Pin 6 and 14 CAN Bus

🚀 Key Features

  • Universal compatibility — Arduino (Uno, Nano, Mega), ESP32 and other popular MCUs.

  • Six protocols, one API — the packet format is a setting, not a rewrite of your sketch.

    CategorySupported Protocols
    Universal OBD2ISO 9141-2, ISO 14230-4 (KWP2000)
    VAG (VW/Audi/Seat/Škoda)KW1281 (legacy block protocol)
    BMWDS2 (Diagnostic System 2)
    Opel / VauxhallKW82
    Anything elseCustom — define the framing yourself
  • Flexible initialization5-Baud (Slow Init), Fast Init, ping and handshake-free modes, each selectable independently of the protocol.

  • Automatic detection — finds the protocol on its own when you do not yet know what the car speaks.

  • Handles the plumbing — headers, length bytes, checksums and handshake timings are built and verified for you.

  • Developer friendly — integrated debug output showing every byte on the bus.

🔍 What You Can Read & Control

🔹 Standard OBD-II — works on any compliant car

Generic diagnostics defined by SAE J1979. No car-specific configuration needed — plug in and read:

ModeDescription
01Live data — real-time sensor values (RPM, coolant temp, speed, throttle, fuel trims…)
02Freeze frame — the sensor snapshot stored when a fault appeared
03Read stored Diagnostic Trouble Codes (DTCs)
04Clear DTCs and reset the MIL
05Oxygen sensor test results
06On-board monitoring test results
07Read pending Diagnostic Trouble Codes
09Vehicle information — VIN, Calibration IDs, Calibration Verification Numbers

DTCs come back as readable codes (P0123 style), and a supported-PID scan lets you ask the ECU which PIDs it actually implements before requesting them.

🔸 Manufacturer protocols — deeper, car-specific access

The manufacturer protocols reach data and functions that generic OBD-II never exposes:

  • Extended live data — manufacturer measurement blocks carrying far more channels than the standard PIDs, decoded into named values with real units (injection time, ignition advance, idle actuator steps, engine load, lambda, and so on). One request returns the whole block, so a dozen values cost a single message.
  • Vehicle control & actuator tests — command the ECU to drive real hardware: MIL and service lamps, fuel pump relay, A/C relay, throttle actuator, tank vent valve, and per-cylinder ignition coil or injection cut-off.
  • Full ECU identification — VIN, part number, supplier, hardware version, software number and engine code.
  • ECU memory & flash reading — read the ECU's internal memory block by block across the whole flash range, streamed over the debug port so you can capture the dump to a file on your PC for analysis.
  • Raw service access — send any manufacturer service by hand; the library still adds the header, length byte and checksum for you.
  • Discovery tools — scan which identifiers an ECU answers and dump responses as offset tables, so you can map an ECU nobody has documented yet.

💡 Manufacturer-specific access is provided through ECU definition files. The generic OBD-II layer ships with the library; car-specific definitions (Opel Simtec 71 / Bosch M1.5.5 / Bosch ME7.5, BMW Bosch BMS 46 and others) are maintained separately — see the Contact section below.

📊 Typical Data Rates

Real-world throughput measured with this library:

ProtocolAverage responses per second
ISO 9141-2~8–9 responses/sec
ISO 14230-4~9–10 responses/sec

🔎 Actual throughput varies with the ECU's internal processing time, the requested PID type and system latency.

📦 Installation

Arduino Library Manager (recommended)

  1. Open the Arduino IDE.
  2. Go to Sketch → Include Library → Manage Libraries…
  3. Search for "OBD2 K-Line".
  4. Click Install.

Manual

Download this repo as a .zip and add it via Sketch → Include Library → Add .ZIP Library…

⚡ Basic Usage — Read Live Data

Read Engine RPM, Coolant Temperature and Vehicle Speed. The library automatically handles different board architectures (AVR / ESP32):

#include"OBD2_KLine.h"// core: connection + protocol layer
#include"ecus/OBD2_Standard.h"// standard OBD2 diagnostics -> OBD2_KLine
OBD2_KLine KLine;
// Uno / Nano have no spare hardware serial, so they fall back to AltSoftSerial// on its fixed pins (RX 8, TX 9). Every other board uses Serial1.
#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__)
#include<AltSoftSerial.h>
AltSoftSerial altSerial;
#defineOBD_SERIAL altSerial
#else
#defineOBD_SERIAL Serial1
#endif
#defineOBD_RX_PIN5
#defineOBD_TX_PIN4voidsetup() {
Serial.begin(115200);
KLine.setSerial(OBD_SERIAL);
KLine.setPins(OBD_RX_PIN, OBD_TX_PIN);
KLine.setDebug(Serial); // View communication logs
KLine.setProtocol(Automatic); // Automatic, ISO9141, ISO14230, KW1281, DS2, KW82, Custom
Serial.println("OBD2 System Starting...");
}
voidloop() {
if (!KLine.isConnected() && !KLine.connect()) return;
float rpm = KLine.getLiveData(0x0C); // PID 0x0C: Engine RPMfloat coolant = KLine.getLiveData(0x05); // PID 0x05: Coolant Tempfloat speed = KLine.getLiveData(0x0D); // PID 0x0D: Vehicle Speed
Serial.print("RPM: "); Serial.println(rpm);
Serial.print("Temp: "); Serial.print(coolant); Serial.println(" C");
Serial.print("Speed: "); Serial.print(speed); Serial.println(" km/h");
}

🛠️ Schematics for Communication

K-Line operates at different voltage/signal levels than microcontroller pins. These circuits provide level shifting and protection for safe, stable operation. Pick the approach that suits your project:

🔹 Transistor-based

Simple, low-cost discrete-transistor interface for basic builds and prototyping. R6 is sized for 3.3V MCUs — for a 5V MCU, change R6 to 5.3 kΩ.

🔹 Comparator-based

Uses a cheap comparator IC (e.g. LM393) for a clean digital level — better noise immunity and well-defined thresholds than the transistor design, at a slightly higher component count.

🔹 Dedicated automotive IC

L9637DMC33290

Si9241SN65HVDA195

Purpose-built K-Line / ISO 9141 transceiver ICs (L9637D, MC33290, Si9241, SN65HVDA195, etc.) with built-in level shifting and protection — highest reliability, recommended for production-grade designs.

📷 Gallery

Custom PCBs designed for this library:

🛠️ Custom hardware & PCBs: looking for ready-to-use devices or custom-made PCBs based on this project? Reach out via email in the Contact section below.

🔗 Related Projects

Part of a full OBD2 / automotive diagnostics ecosystem:

Firmware & ReadersLibrariesManufacturer ProtocolsUI
OBD2 K-line ReaderOBD2 K-Line LibraryBMW I/K BusOBD2 Diagnostic UI
OBD2 CAN Bus ReaderOBD2 CAN Bus LibraryVAG KW1281

☕ Support My Work

If you enjoy my projects and want to support me, you can do so through the links below:

Buy Me A CoffeePayPalGitHub Sponsors


📬 Contact

For information, job offers, collaboration, sponsorship, or purchasing my devices, you can contact me via email.

📧 Email: muksin.muksin04@gmail.com


Created by Muki · If you find this useful, consider giving it a ⭐

About

OBD2 K-Line diagnostics library for Arduino, ESP32 and compatible boards. Supports ISO9141, ISO14230 (KWP2000), KW1281, DS2 and KW82

Topics

Resources

Stars

59 stars

Watchers

2 watching

Forks

Releases

Sponsor this project

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

🚗 OBD2 K-Line Library
(ISO 9141 · KWP2000 · KW1281 · DS2 · KW82)

A professional, high-performance Arduino/ESP32 library for vehicle diagnostics over K-Line — universal OBD-II (ISO 9141-2, ISO 14230-4/KWP2000) plus manufacturer-specific deep access for VAG KW1281, BMW DS2 and Opel KW82.

GitHub forksGitHub Repo starsGitHub Issues or Pull RequestsGitHub LicenseGitHub last commitESP32ArduinoPlatformIO RegistryArduino IDE Library Manager


📌 Overview

OBD2_KLine is a professional, high-performance library for vehicle diagnostics via K-Line, supporting ISO 9141-2, ISO 14230-4 / KWP2000, VAG KW1281, BMW DS2 and Opel KW82. Designed for Arduino, ESP32 and similar microcontrollers, it lets your device talk directly to a vehicle's ECU over the K-Line.

K-Line is a legacy protocol used in many European and Japanese vehicles built between ~1987 and 2010, especially before CAN became mandatory — making this library ideal for both generic OBD-II diagnostics and manufacturer-specific deep system access (VAG, BMW, Opel).

❓ Does Your Vehicle Support K-Line?

Confirm your car speaks K-Line by checking the OBD-II connector pins:

  • Pin 7 connected → K-Line (ISO 9141 / ISO 14230). This library will work.
  • Pins 6 & 14 connected → CAN bus. Use my OBD2 CAN Bus Library instead.

Example OBD-II connectors (left: K-Line with pin 7 · right: CAN with pins 6 & 14):

OBD2 Connector Pin 7 K-LineOBD2 Connector Pin 6 and 14 CAN Bus

🚀 Key Features

  • Universal compatibility — Arduino (Uno, Nano, Mega), ESP32 and other popular MCUs.

  • Six protocols, one API — the packet format is a setting, not a rewrite of your sketch.

    CategorySupported Protocols
    Universal OBD2ISO 9141-2, ISO 14230-4 (KWP2000)
    VAG (VW/Audi/Seat/Škoda)KW1281 (legacy block protocol)
    BMWDS2 (Diagnostic System 2)
    Opel / VauxhallKW82
    Anything elseCustom — define the framing yourself
  • Flexible initialization5-Baud (Slow Init), Fast Init, ping and handshake-free modes, each selectable independently of the protocol.

  • Automatic detection — finds the protocol on its own when you do not yet know what the car speaks.

  • Handles the plumbing — headers, length bytes, checksums and handshake timings are built and verified for you.

  • Developer friendly — integrated debug output showing every byte on the bus.

🔍 What You Can Read & Control

🔹 Standard OBD-II — works on any compliant car

Generic diagnostics defined by SAE J1979. No car-specific configuration needed — plug in and read:

ModeDescription
01Live data — real-time sensor values (RPM, coolant temp, speed, throttle, fuel trims…)
02Freeze frame — the sensor snapshot stored when a fault appeared
03Read stored Diagnostic Trouble Codes (DTCs)
04Clear DTCs and reset the MIL
05Oxygen sensor test results
06On-board monitoring test results
07Read pending Diagnostic Trouble Codes
09Vehicle information — VIN, Calibration IDs, Calibration Verification Numbers

DTCs come back as readable codes (P0123 style), and a supported-PID scan lets you ask the ECU which PIDs it actually implements before requesting them.

🔸 Manufacturer protocols — deeper, car-specific access

The manufacturer protocols reach data and functions that generic OBD-II never exposes:

  • Extended live data — manufacturer measurement blocks carrying far more channels than the standard PIDs, decoded into named values with real units (injection time, ignition advance, idle actuator steps, engine load, lambda, and so on). One request returns the whole block, so a dozen values cost a single message.
  • Vehicle control & actuator tests — command the ECU to drive real hardware: MIL and service lamps, fuel pump relay, A/C relay, throttle actuator, tank vent valve, and per-cylinder ignition coil or injection cut-off.
  • Full ECU identification — VIN, part number, supplier, hardware version, software number and engine code.
  • ECU memory & flash reading — read the ECU's internal memory block by block across the whole flash range, streamed over the debug port so you can capture the dump to a file on your PC for analysis.
  • Raw service access — send any manufacturer service by hand; the library still adds the header, length byte and checksum for you.
  • Discovery tools — scan which identifiers an ECU answers and dump responses as offset tables, so you can map an ECU nobody has documented yet.

💡 Manufacturer-specific access is provided through ECU definition files. The generic OBD-II layer ships with the library; car-specific definitions (Opel Simtec 71 / Bosch M1.5.5 / Bosch ME7.5, BMW Bosch BMS 46 and others) are maintained separately — see the Contact section below.

📊 Typical Data Rates

Real-world throughput measured with this library:

ProtocolAverage responses per second
ISO 9141-2~8–9 responses/sec
ISO 14230-4~9–10 responses/sec

🔎 Actual throughput varies with the ECU's internal processing time, the requested PID type and system latency.

📦 Installation

Arduino Library Manager (recommended)

  1. Open the Arduino IDE.
  2. Go to Sketch → Include Library → Manage Libraries…
  3. Search for "OBD2 K-Line".
  4. Click Install.

Manual

Download this repo as a .zip and add it via Sketch → Include Library → Add .ZIP Library…

⚡ Basic Usage — Read Live Data

Read Engine RPM, Coolant Temperature and Vehicle Speed. The library automatically handles different board architectures (AVR / ESP32):

#include"OBD2_KLine.h"// core: connection + protocol layer
#include"ecus/OBD2_Standard.h"// standard OBD2 diagnostics -> OBD2_KLine
OBD2_KLine KLine;
// Uno / Nano have no spare hardware serial, so they fall back to AltSoftSerial// on its fixed pins (RX 8, TX 9). Every other board uses Serial1.
#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__)
#include<AltSoftSerial.h>
AltSoftSerial altSerial;
#defineOBD_SERIAL altSerial
#else
#defineOBD_SERIAL Serial1
#endif
#defineOBD_RX_PIN5
#defineOBD_TX_PIN4voidsetup() {
Serial.begin(115200);
KLine.setSerial(OBD_SERIAL);
KLine.setPins(OBD_RX_PIN, OBD_TX_PIN);
KLine.setDebug(Serial); // View communication logs
KLine.setProtocol(Automatic); // Automatic, ISO9141, ISO14230, KW1281, DS2, KW82, Custom
Serial.println("OBD2 System Starting...");
}
voidloop() {
if (!KLine.isConnected() && !KLine.connect()) return;
float rpm = KLine.getLiveData(0x0C); // PID 0x0C: Engine RPMfloat coolant = KLine.getLiveData(0x05); // PID 0x05: Coolant Tempfloat speed = KLine.getLiveData(0x0D); // PID 0x0D: Vehicle Speed
Serial.print("RPM: "); Serial.println(rpm);
Serial.print("Temp: "); Serial.print(coolant); Serial.println(" C");
Serial.print("Speed: "); Serial.print(speed); Serial.println(" km/h");
}

🛠️ Schematics for Communication

K-Line operates at different voltage/signal levels than microcontroller pins. These circuits provide level shifting and protection for safe, stable operation. Pick the approach that suits your project:

🔹 Transistor-based

Simple, low-cost discrete-transistor interface for basic builds and prototyping. R6 is sized for 3.3V MCUs — for a 5V MCU, change R6 to 5.3 kΩ.

🔹 Comparator-based

Uses a cheap comparator IC (e.g. LM393) for a clean digital level — better noise immunity and well-defined thresholds than the transistor design, at a slightly higher component count.

🔹 Dedicated automotive IC

L9637DMC33290

Si9241SN65HVDA195

Purpose-built K-Line / ISO 9141 transceiver ICs (L9637D, MC33290, Si9241, SN65HVDA195, etc.) with built-in level shifting and protection — highest reliability, recommended for production-grade designs.

📷 Gallery

Custom PCBs designed for this library:

🛠️ Custom hardware & PCBs: looking for ready-to-use devices or custom-made PCBs based on this project? Reach out via email in the Contact section below.

🔗 Related Projects

Part of a full OBD2 / automotive diagnostics ecosystem:

Firmware & ReadersLibrariesManufacturer ProtocolsUI
OBD2 K-line ReaderOBD2 K-Line LibraryBMW I/K BusOBD2 Diagnostic UI
OBD2 CAN Bus ReaderOBD2 CAN Bus LibraryVAG KW1281

☕ Support My Work

If you enjoy my projects and want to support me, you can do so through the links below:

Buy Me A CoffeePayPalGitHub Sponsors


📬 Contact

For information, job offers, collaboration, sponsorship, or purchasing my devices, you can contact me via email.

📧 Email: muksin.muksin04@gmail.com


Created by Muki · If you find this useful, consider giving it a ⭐

About

OBD2 K-Line diagnostics library for Arduino, ESP32 and compatible boards. Supports ISO9141, ISO14230 (KWP2000), KW1281, DS2 and KW82

Topics

Resources

Stars

59 stars

Watchers

2 watching

Forks

Releases

Sponsor this project

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

🚗 OBD2 K-Line Library
(ISO 9141 · KWP2000 · KW1281 · DS2 · KW82)

A professional, high-performance Arduino/ESP32 library for vehicle diagnostics over K-Line — universal OBD-II (ISO 9141-2, ISO 14230-4/KWP2000) plus manufacturer-specific deep access for VAG KW1281, BMW DS2 and Opel KW82.

GitHub forksGitHub Repo starsGitHub Issues or Pull RequestsGitHub LicenseGitHub last commitESP32ArduinoPlatformIO RegistryArduino IDE Library Manager


📌 Overview

OBD2_KLine is a professional, high-performance library for vehicle diagnostics via K-Line, supporting ISO 9141-2, ISO 14230-4 / KWP2000, VAG KW1281, BMW DS2 and Opel KW82. Designed for Arduino, ESP32 and similar microcontrollers, it lets your device talk directly to a vehicle's ECU over the K-Line.

K-Line is a legacy protocol used in many European and Japanese vehicles built between ~1987 and 2010, especially before CAN became mandatory — making this library ideal for both generic OBD-II diagnostics and manufacturer-specific deep system access (VAG, BMW, Opel).

❓ Does Your Vehicle Support K-Line?

Confirm your car speaks K-Line by checking the OBD-II connector pins:

  • Pin 7 connected → K-Line (ISO 9141 / ISO 14230). This library will work.
  • Pins 6 & 14 connected → CAN bus. Use my OBD2 CAN Bus Library instead.

Example OBD-II connectors (left: K-Line with pin 7 · right: CAN with pins 6 & 14):

OBD2 Connector Pin 7 K-LineOBD2 Connector Pin 6 and 14 CAN Bus

🚀 Key Features

  • Universal compatibility — Arduino (Uno, Nano, Mega), ESP32 and other popular MCUs.

  • Six protocols, one API — the packet format is a setting, not a rewrite of your sketch.

    CategorySupported Protocols
    Universal OBD2ISO 9141-2, ISO 14230-4 (KWP2000)
    VAG (VW/Audi/Seat/Škoda)KW1281 (legacy block protocol)
    BMWDS2 (Diagnostic System 2)
    Opel / VauxhallKW82
    Anything elseCustom — define the framing yourself
  • Flexible initialization5-Baud (Slow Init), Fast Init, ping and handshake-free modes, each selectable independently of the protocol.

  • Automatic detection — finds the protocol on its own when you do not yet know what the car speaks.

  • Handles the plumbing — headers, length bytes, checksums and handshake timings are built and verified for you.

  • Developer friendly — integrated debug output showing every byte on the bus.

🔍 What You Can Read & Control

🔹 Standard OBD-II — works on any compliant car

Generic diagnostics defined by SAE J1979. No car-specific configuration needed — plug in and read:

ModeDescription
01Live data — real-time sensor values (RPM, coolant temp, speed, throttle, fuel trims…)
02Freeze frame — the sensor snapshot stored when a fault appeared
03Read stored Diagnostic Trouble Codes (DTCs)
04Clear DTCs and reset the MIL
05Oxygen sensor test results
06On-board monitoring test results
07Read pending Diagnostic Trouble Codes
09Vehicle information — VIN, Calibration IDs, Calibration Verification Numbers

DTCs come back as readable codes (P0123 style), and a supported-PID scan lets you ask the ECU which PIDs it actually implements before requesting them.

🔸 Manufacturer protocols — deeper, car-specific access

The manufacturer protocols reach data and functions that generic OBD-II never exposes:

  • Extended live data — manufacturer measurement blocks carrying far more channels than the standard PIDs, decoded into named values with real units (injection time, ignition advance, idle actuator steps, engine load, lambda, and so on). One request returns the whole block, so a dozen values cost a single message.
  • Vehicle control & actuator tests — command the ECU to drive real hardware: MIL and service lamps, fuel pump relay, A/C relay, throttle actuator, tank vent valve, and per-cylinder ignition coil or injection cut-off.
  • Full ECU identification — VIN, part number, supplier, hardware version, software number and engine code.
  • ECU memory & flash reading — read the ECU's internal memory block by block across the whole flash range, streamed over the debug port so you can capture the dump to a file on your PC for analysis.
  • Raw service access — send any manufacturer service by hand; the library still adds the header, length byte and checksum for you.
  • Discovery tools — scan which identifiers an ECU answers and dump responses as offset tables, so you can map an ECU nobody has documented yet.

💡 Manufacturer-specific access is provided through ECU definition files. The generic OBD-II layer ships with the library; car-specific definitions (Opel Simtec 71 / Bosch M1.5.5 / Bosch ME7.5, BMW Bosch BMS 46 and others) are maintained separately — see the Contact section below.

📊 Typical Data Rates

Real-world throughput measured with this library:

ProtocolAverage responses per second
ISO 9141-2~8–9 responses/sec
ISO 14230-4~9–10 responses/sec

🔎 Actual throughput varies with the ECU's internal processing time, the requested PID type and system latency.

📦 Installation

Arduino Library Manager (recommended)

  1. Open the Arduino IDE.
  2. Go to Sketch → Include Library → Manage Libraries…
  3. Search for "OBD2 K-Line".
  4. Click Install.

Manual

Download this repo as a .zip and add it via Sketch → Include Library → Add .ZIP Library…

⚡ Basic Usage — Read Live Data

Read Engine RPM, Coolant Temperature and Vehicle Speed. The library automatically handles different board architectures (AVR / ESP32):

#include"OBD2_KLine.h"// core: connection + protocol layer
#include"ecus/OBD2_Standard.h"// standard OBD2 diagnostics -> OBD2_KLine
OBD2_KLine KLine;
// Uno / Nano have no spare hardware serial, so they fall back to AltSoftSerial// on its fixed pins (RX 8, TX 9). Every other board uses Serial1.
#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__)
#include<AltSoftSerial.h>
AltSoftSerial altSerial;
#defineOBD_SERIAL altSerial
#else
#defineOBD_SERIAL Serial1
#endif
#defineOBD_RX_PIN5
#defineOBD_TX_PIN4voidsetup() {
Serial.begin(115200);
KLine.setSerial(OBD_SERIAL);
KLine.setPins(OBD_RX_PIN, OBD_TX_PIN);
KLine.setDebug(Serial); // View communication logs
KLine.setProtocol(Automatic); // Automatic, ISO9141, ISO14230, KW1281, DS2, KW82, Custom
Serial.println("OBD2 System Starting...");
}
voidloop() {
if (!KLine.isConnected() && !KLine.connect()) return;
float rpm = KLine.getLiveData(0x0C); // PID 0x0C: Engine RPMfloat coolant = KLine.getLiveData(0x05); // PID 0x05: Coolant Tempfloat speed = KLine.getLiveData(0x0D); // PID 0x0D: Vehicle Speed
Serial.print("RPM: "); Serial.println(rpm);
Serial.print("Temp: "); Serial.print(coolant); Serial.println(" C");
Serial.print("Speed: "); Serial.print(speed); Serial.println(" km/h");
}

🛠️ Schematics for Communication

K-Line operates at different voltage/signal levels than microcontroller pins. These circuits provide level shifting and protection for safe, stable operation. Pick the approach that suits your project:

🔹 Transistor-based

Simple, low-cost discrete-transistor interface for basic builds and prototyping. R6 is sized for 3.3V MCUs — for a 5V MCU, change R6 to 5.3 kΩ.

🔹 Comparator-based

Uses a cheap comparator IC (e.g. LM393) for a clean digital level — better noise immunity and well-defined thresholds than the transistor design, at a slightly higher component count.

🔹 Dedicated automotive IC

L9637DMC33290

Si9241SN65HVDA195

Purpose-built K-Line / ISO 9141 transceiver ICs (L9637D, MC33290, Si9241, SN65HVDA195, etc.) with built-in level shifting and protection — highest reliability, recommended for production-grade designs.

📷 Gallery

Custom PCBs designed for this library:

🛠️ Custom hardware & PCBs: looking for ready-to-use devices or custom-made PCBs based on this project? Reach out via email in the Contact section below.

🔗 Related Projects

Part of a full OBD2 / automotive diagnostics ecosystem:

Firmware & ReadersLibrariesManufacturer ProtocolsUI
OBD2 K-line ReaderOBD2 K-Line LibraryBMW I/K BusOBD2 Diagnostic UI
OBD2 CAN Bus ReaderOBD2 CAN Bus LibraryVAG KW1281

☕ Support My Work

If you enjoy my projects and want to support me, you can do so through the links below:

Buy Me A CoffeePayPalGitHub Sponsors


📬 Contact

For information, job offers, collaboration, sponsorship, or purchasing my devices, you can contact me via email.

📧 Email: muksin.muksin04@gmail.com


Created by Muki · If you find this useful, consider giving it a ⭐

About

OBD2 K-Line diagnostics library for Arduino, ESP32 and compatible boards. Supports ISO9141, ISO14230 (KWP2000), KW1281, DS2 and KW82

Topics

Resources

Stars

59 stars

Watchers

2 watching

Forks

Releases

Sponsor this project

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

🚗 OBD2 K-Line Library
(ISO 9141 · KWP2000 · KW1281 · DS2 · KW82)

A professional, high-performance Arduino/ESP32 library for vehicle diagnostics over K-Line — universal OBD-II (ISO 9141-2, ISO 14230-4/KWP2000) plus manufacturer-specific deep access for VAG KW1281, BMW DS2 and Opel KW82.

GitHub forksGitHub Repo starsGitHub Issues or Pull RequestsGitHub LicenseGitHub last commitESP32ArduinoPlatformIO RegistryArduino IDE Library Manager


📌 Overview

OBD2_KLine is a professional, high-performance library for vehicle diagnostics via K-Line, supporting ISO 9141-2, ISO 14230-4 / KWP2000, VAG KW1281, BMW DS2 and Opel KW82. Designed for Arduino, ESP32 and similar microcontrollers, it lets your device talk directly to a vehicle's ECU over the K-Line.

K-Line is a legacy protocol used in many European and Japanese vehicles built between ~1987 and 2010, especially before CAN became mandatory — making this library ideal for both generic OBD-II diagnostics and manufacturer-specific deep system access (VAG, BMW, Opel).

❓ Does Your Vehicle Support K-Line?

Confirm your car speaks K-Line by checking the OBD-II connector pins:

  • Pin 7 connected → K-Line (ISO 9141 / ISO 14230). This library will work.
  • Pins 6 & 14 connected → CAN bus. Use my OBD2 CAN Bus Library instead.

Example OBD-II connectors (left: K-Line with pin 7 · right: CAN with pins 6 & 14):

OBD2 Connector Pin 7 K-LineOBD2 Connector Pin 6 and 14 CAN Bus

🚀 Key Features

  • Universal compatibility — Arduino (Uno, Nano, Mega), ESP32 and other popular MCUs.

  • Six protocols, one API — the packet format is a setting, not a rewrite of your sketch.

    CategorySupported Protocols
    Universal OBD2ISO 9141-2, ISO 14230-4 (KWP2000)
    VAG (VW/Audi/Seat/Škoda)KW1281 (legacy block protocol)
    BMWDS2 (Diagnostic System 2)
    Opel / VauxhallKW82
    Anything elseCustom — define the framing yourself
  • Flexible initialization5-Baud (Slow Init), Fast Init, ping and handshake-free modes, each selectable independently of the protocol.

  • Automatic detection — finds the protocol on its own when you do not yet know what the car speaks.

  • Handles the plumbing — headers, length bytes, checksums and handshake timings are built and verified for you.

  • Developer friendly — integrated debug output showing every byte on the bus.

🔍 What You Can Read & Control

🔹 Standard OBD-II — works on any compliant car

Generic diagnostics defined by SAE J1979. No car-specific configuration needed — plug in and read:

ModeDescription
01Live data — real-time sensor values (RPM, coolant temp, speed, throttle, fuel trims…)
02Freeze frame — the sensor snapshot stored when a fault appeared
03Read stored Diagnostic Trouble Codes (DTCs)
04Clear DTCs and reset the MIL
05Oxygen sensor test results
06On-board monitoring test results
07Read pending Diagnostic Trouble Codes
09Vehicle information — VIN, Calibration IDs, Calibration Verification Numbers

DTCs come back as readable codes (P0123 style), and a supported-PID scan lets you ask the ECU which PIDs it actually implements before requesting them.

🔸 Manufacturer protocols — deeper, car-specific access

The manufacturer protocols reach data and functions that generic OBD-II never exposes:

  • Extended live data — manufacturer measurement blocks carrying far more channels than the standard PIDs, decoded into named values with real units (injection time, ignition advance, idle actuator steps, engine load, lambda, and so on). One request returns the whole block, so a dozen values cost a single message.
  • Vehicle control & actuator tests — command the ECU to drive real hardware: MIL and service lamps, fuel pump relay, A/C relay, throttle actuator, tank vent valve, and per-cylinder ignition coil or injection cut-off.
  • Full ECU identification — VIN, part number, supplier, hardware version, software number and engine code.
  • ECU memory & flash reading — read the ECU's internal memory block by block across the whole flash range, streamed over the debug port so you can capture the dump to a file on your PC for analysis.
  • Raw service access — send any manufacturer service by hand; the library still adds the header, length byte and checksum for you.
  • Discovery tools — scan which identifiers an ECU answers and dump responses as offset tables, so you can map an ECU nobody has documented yet.

💡 Manufacturer-specific access is provided through ECU definition files. The generic OBD-II layer ships with the library; car-specific definitions (Opel Simtec 71 / Bosch M1.5.5 / Bosch ME7.5, BMW Bosch BMS 46 and others) are maintained separately — see the Contact section below.

📊 Typical Data Rates

Real-world throughput measured with this library:

ProtocolAverage responses per second
ISO 9141-2~8–9 responses/sec
ISO 14230-4~9–10 responses/sec

🔎 Actual throughput varies with the ECU's internal processing time, the requested PID type and system latency.

📦 Installation

Arduino Library Manager (recommended)

  1. Open the Arduino IDE.
  2. Go to Sketch → Include Library → Manage Libraries…
  3. Search for "OBD2 K-Line".
  4. Click Install.

Manual

Download this repo as a .zip and add it via Sketch → Include Library → Add .ZIP Library…

⚡ Basic Usage — Read Live Data

Read Engine RPM, Coolant Temperature and Vehicle Speed. The library automatically handles different board architectures (AVR / ESP32):

#include"OBD2_KLine.h"// core: connection + protocol layer
#include"ecus/OBD2_Standard.h"// standard OBD2 diagnostics -> OBD2_KLine
OBD2_KLine KLine;
// Uno / Nano have no spare hardware serial, so they fall back to AltSoftSerial// on its fixed pins (RX 8, TX 9). Every other board uses Serial1.
#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__)
#include<AltSoftSerial.h>
AltSoftSerial altSerial;
#defineOBD_SERIAL altSerial
#else
#defineOBD_SERIAL Serial1
#endif
#defineOBD_RX_PIN5
#defineOBD_TX_PIN4voidsetup() {
Serial.begin(115200);
KLine.setSerial(OBD_SERIAL);
KLine.setPins(OBD_RX_PIN, OBD_TX_PIN);
KLine.setDebug(Serial); // View communication logs
KLine.setProtocol(Automatic); // Automatic, ISO9141, ISO14230, KW1281, DS2, KW82, Custom
Serial.println("OBD2 System Starting...");
}
voidloop() {
if (!KLine.isConnected() && !KLine.connect()) return;
float rpm = KLine.getLiveData(0x0C); // PID 0x0C: Engine RPMfloat coolant = KLine.getLiveData(0x05); // PID 0x05: Coolant Tempfloat speed = KLine.getLiveData(0x0D); // PID 0x0D: Vehicle Speed
Serial.print("RPM: "); Serial.println(rpm);
Serial.print("Temp: "); Serial.print(coolant); Serial.println(" C");
Serial.print("Speed: "); Serial.print(speed); Serial.println(" km/h");
}

🛠️ Schematics for Communication

K-Line operates at different voltage/signal levels than microcontroller pins. These circuits provide level shifting and protection for safe, stable operation. Pick the approach that suits your project:

🔹 Transistor-based

Simple, low-cost discrete-transistor interface for basic builds and prototyping. R6 is sized for 3.3V MCUs — for a 5V MCU, change R6 to 5.3 kΩ.

🔹 Comparator-based

Uses a cheap comparator IC (e.g. LM393) for a clean digital level — better noise immunity and well-defined thresholds than the transistor design, at a slightly higher component count.

🔹 Dedicated automotive IC

L9637DMC33290

Si9241SN65HVDA195

Purpose-built K-Line / ISO 9141 transceiver ICs (L9637D, MC33290, Si9241, SN65HVDA195, etc.) with built-in level shifting and protection — highest reliability, recommended for production-grade designs.

📷 Gallery

Custom PCBs designed for this library:

🛠️ Custom hardware & PCBs: looking for ready-to-use devices or custom-made PCBs based on this project? Reach out via email in the Contact section below.

🔗 Related Projects

Part of a full OBD2 / automotive diagnostics ecosystem:

Firmware & ReadersLibrariesManufacturer ProtocolsUI
OBD2 K-line ReaderOBD2 K-Line LibraryBMW I/K BusOBD2 Diagnostic UI
OBD2 CAN Bus ReaderOBD2 CAN Bus LibraryVAG KW1281

☕ Support My Work

If you enjoy my projects and want to support me, you can do so through the links below:

Buy Me A CoffeePayPalGitHub Sponsors


📬 Contact

For information, job offers, collaboration, sponsorship, or purchasing my devices, you can contact me via email.

📧 Email: muksin.muksin04@gmail.com


Created by Muki · If you find this useful, consider giving it a ⭐

About

OBD2 K-Line diagnostics library for Arduino, ESP32 and compatible boards. Supports ISO9141, ISO14230 (KWP2000), KW1281, DS2 and KW82

Topics

Resources

Stars

59 stars

Watchers

2 watching

Forks

Releases

Sponsor this project

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

🚗 OBD2 K-Line Library
(ISO 9141 · KWP2000 · KW1281 · DS2 · KW82)

A professional, high-performance Arduino/ESP32 library for vehicle diagnostics over K-Line — universal OBD-II (ISO 9141-2, ISO 14230-4/KWP2000) plus manufacturer-specific deep access for VAG KW1281, BMW DS2 and Opel KW82.

GitHub forksGitHub Repo starsGitHub Issues or Pull RequestsGitHub LicenseGitHub last commitESP32ArduinoPlatformIO RegistryArduino IDE Library Manager


📌 Overview

OBD2_KLine is a professional, high-performance library for vehicle diagnostics via K-Line, supporting ISO 9141-2, ISO 14230-4 / KWP2000, VAG KW1281, BMW DS2 and Opel KW82. Designed for Arduino, ESP32 and similar microcontrollers, it lets your device talk directly to a vehicle's ECU over the K-Line.

K-Line is a legacy protocol used in many European and Japanese vehicles built between ~1987 and 2010, especially before CAN became mandatory — making this library ideal for both generic OBD-II diagnostics and manufacturer-specific deep system access (VAG, BMW, Opel).

❓ Does Your Vehicle Support K-Line?

Confirm your car speaks K-Line by checking the OBD-II connector pins:

  • Pin 7 connected → K-Line (ISO 9141 / ISO 14230). This library will work.
  • Pins 6 & 14 connected → CAN bus. Use my OBD2 CAN Bus Library instead.

Example OBD-II connectors (left: K-Line with pin 7 · right: CAN with pins 6 & 14):

OBD2 Connector Pin 7 K-LineOBD2 Connector Pin 6 and 14 CAN Bus

🚀 Key Features

  • Universal compatibility — Arduino (Uno, Nano, Mega), ESP32 and other popular MCUs.

  • Six protocols, one API — the packet format is a setting, not a rewrite of your sketch.

    CategorySupported Protocols
    Universal OBD2ISO 9141-2, ISO 14230-4 (KWP2000)
    VAG (VW/Audi/Seat/Škoda)KW1281 (legacy block protocol)
    BMWDS2 (Diagnostic System 2)
    Opel / VauxhallKW82
    Anything elseCustom — define the framing yourself
  • Flexible initialization5-Baud (Slow Init), Fast Init, ping and handshake-free modes, each selectable independently of the protocol.

  • Automatic detection — finds the protocol on its own when you do not yet know what the car speaks.

  • Handles the plumbing — headers, length bytes, checksums and handshake timings are built and verified for you.

  • Developer friendly — integrated debug output showing every byte on the bus.

🔍 What You Can Read & Control

🔹 Standard OBD-II — works on any compliant car

Generic diagnostics defined by SAE J1979. No car-specific configuration needed — plug in and read:

ModeDescription
01Live data — real-time sensor values (RPM, coolant temp, speed, throttle, fuel trims…)
02Freeze frame — the sensor snapshot stored when a fault appeared
03Read stored Diagnostic Trouble Codes (DTCs)
04Clear DTCs and reset the MIL
05Oxygen sensor test results
06On-board monitoring test results
07Read pending Diagnostic Trouble Codes
09Vehicle information — VIN, Calibration IDs, Calibration Verification Numbers

DTCs come back as readable codes (P0123 style), and a supported-PID scan lets you ask the ECU which PIDs it actually implements before requesting them.

🔸 Manufacturer protocols — deeper, car-specific access

The manufacturer protocols reach data and functions that generic OBD-II never exposes:

  • Extended live data — manufacturer measurement blocks carrying far more channels than the standard PIDs, decoded into named values with real units (injection time, ignition advance, idle actuator steps, engine load, lambda, and so on). One request returns the whole block, so a dozen values cost a single message.
  • Vehicle control & actuator tests — command the ECU to drive real hardware: MIL and service lamps, fuel pump relay, A/C relay, throttle actuator, tank vent valve, and per-cylinder ignition coil or injection cut-off.
  • Full ECU identification — VIN, part number, supplier, hardware version, software number and engine code.
  • ECU memory & flash reading — read the ECU's internal memory block by block across the whole flash range, streamed over the debug port so you can capture the dump to a file on your PC for analysis.
  • Raw service access — send any manufacturer service by hand; the library still adds the header, length byte and checksum for you.
  • Discovery tools — scan which identifiers an ECU answers and dump responses as offset tables, so you can map an ECU nobody has documented yet.

💡 Manufacturer-specific access is provided through ECU definition files. The generic OBD-II layer ships with the library; car-specific definitions (Opel Simtec 71 / Bosch M1.5.5 / Bosch ME7.5, BMW Bosch BMS 46 and others) are maintained separately — see the Contact section below.

📊 Typical Data Rates

Real-world throughput measured with this library:

ProtocolAverage responses per second
ISO 9141-2~8–9 responses/sec
ISO 14230-4~9–10 responses/sec

🔎 Actual throughput varies with the ECU's internal processing time, the requested PID type and system latency.

📦 Installation

Arduino Library Manager (recommended)

  1. Open the Arduino IDE.
  2. Go to Sketch → Include Library → Manage Libraries…
  3. Search for "OBD2 K-Line".
  4. Click Install.

Manual

Download this repo as a .zip and add it via Sketch → Include Library → Add .ZIP Library…

⚡ Basic Usage — Read Live Data

Read Engine RPM, Coolant Temperature and Vehicle Speed. The library automatically handles different board architectures (AVR / ESP32):

#include"OBD2_KLine.h"// core: connection + protocol layer
#include"ecus/OBD2_Standard.h"// standard OBD2 diagnostics -> OBD2_KLine
OBD2_KLine KLine;
// Uno / Nano have no spare hardware serial, so they fall back to AltSoftSerial// on its fixed pins (RX 8, TX 9). Every other board uses Serial1.
#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__)
#include<AltSoftSerial.h>
AltSoftSerial altSerial;
#defineOBD_SERIAL altSerial
#else
#defineOBD_SERIAL Serial1
#endif
#defineOBD_RX_PIN5
#defineOBD_TX_PIN4voidsetup() {
Serial.begin(115200);
KLine.setSerial(OBD_SERIAL);
KLine.setPins(OBD_RX_PIN, OBD_TX_PIN);
KLine.setDebug(Serial); // View communication logs
KLine.setProtocol(Automatic); // Automatic, ISO9141, ISO14230, KW1281, DS2, KW82, Custom
Serial.println("OBD2 System Starting...");
}
voidloop() {
if (!KLine.isConnected() && !KLine.connect()) return;
float rpm = KLine.getLiveData(0x0C); // PID 0x0C: Engine RPMfloat coolant = KLine.getLiveData(0x05); // PID 0x05: Coolant Tempfloat speed = KLine.getLiveData(0x0D); // PID 0x0D: Vehicle Speed
Serial.print("RPM: "); Serial.println(rpm);
Serial.print("Temp: "); Serial.print(coolant); Serial.println(" C");
Serial.print("Speed: "); Serial.print(speed); Serial.println(" km/h");
}

🛠️ Schematics for Communication

K-Line operates at different voltage/signal levels than microcontroller pins. These circuits provide level shifting and protection for safe, stable operation. Pick the approach that suits your project:

🔹 Transistor-based

Simple, low-cost discrete-transistor interface for basic builds and prototyping. R6 is sized for 3.3V MCUs — for a 5V MCU, change R6 to 5.3 kΩ.

🔹 Comparator-based

Uses a cheap comparator IC (e.g. LM393) for a clean digital level — better noise immunity and well-defined thresholds than the transistor design, at a slightly higher component count.

🔹 Dedicated automotive IC

L9637DMC33290

Si9241SN65HVDA195

Purpose-built K-Line / ISO 9141 transceiver ICs (L9637D, MC33290, Si9241, SN65HVDA195, etc.) with built-in level shifting and protection — highest reliability, recommended for production-grade designs.

📷 Gallery

Custom PCBs designed for this library:

🛠️ Custom hardware & PCBs: looking for ready-to-use devices or custom-made PCBs based on this project? Reach out via email in the Contact section below.

🔗 Related Projects

Part of a full OBD2 / automotive diagnostics ecosystem:

Firmware & ReadersLibrariesManufacturer ProtocolsUI
OBD2 K-line ReaderOBD2 K-Line LibraryBMW I/K BusOBD2 Diagnostic UI
OBD2 CAN Bus ReaderOBD2 CAN Bus LibraryVAG KW1281

☕ Support My Work

If you enjoy my projects and want to support me, you can do so through the links below:

Buy Me A CoffeePayPalGitHub Sponsors


📬 Contact

For information, job offers, collaboration, sponsorship, or purchasing my devices, you can contact me via email.

📧 Email: muksin.muksin04@gmail.com


Created by Muki · If you find this useful, consider giving it a ⭐

About

OBD2 K-Line diagnostics library for Arduino, ESP32 and compatible boards. Supports ISO9141, ISO14230 (KWP2000), KW1281, DS2 and KW82

Topics

Resources

Stars

59 stars

Watchers

2 watching

Forks

Releases

Sponsor this project

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

🚗 OBD2 K-Line Library
(ISO 9141 · KWP2000 · KW1281 · DS2 · KW82)

A professional, high-performance Arduino/ESP32 library for vehicle diagnostics over K-Line — universal OBD-II (ISO 9141-2, ISO 14230-4/KWP2000) plus manufacturer-specific deep access for VAG KW1281, BMW DS2 and Opel KW82.

GitHub forksGitHub Repo starsGitHub Issues or Pull RequestsGitHub LicenseGitHub last commitESP32ArduinoPlatformIO RegistryArduino IDE Library Manager


📌 Overview

OBD2_KLine is a professional, high-performance library for vehicle diagnostics via K-Line, supporting ISO 9141-2, ISO 14230-4 / KWP2000, VAG KW1281, BMW DS2 and Opel KW82. Designed for Arduino, ESP32 and similar microcontrollers, it lets your device talk directly to a vehicle's ECU over the K-Line.

K-Line is a legacy protocol used in many European and Japanese vehicles built between ~1987 and 2010, especially before CAN became mandatory — making this library ideal for both generic OBD-II diagnostics and manufacturer-specific deep system access (VAG, BMW, Opel).

❓ Does Your Vehicle Support K-Line?

Confirm your car speaks K-Line by checking the OBD-II connector pins:

  • Pin 7 connected → K-Line (ISO 9141 / ISO 14230). This library will work.
  • Pins 6 & 14 connected → CAN bus. Use my OBD2 CAN Bus Library instead.

Example OBD-II connectors (left: K-Line with pin 7 · right: CAN with pins 6 & 14):

OBD2 Connector Pin 7 K-LineOBD2 Connector Pin 6 and 14 CAN Bus

🚀 Key Features

  • Universal compatibility — Arduino (Uno, Nano, Mega), ESP32 and other popular MCUs.

  • Six protocols, one API — the packet format is a setting, not a rewrite of your sketch.

    CategorySupported Protocols
    Universal OBD2ISO 9141-2, ISO 14230-4 (KWP2000)
    VAG (VW/Audi/Seat/Škoda)KW1281 (legacy block protocol)
    BMWDS2 (Diagnostic System 2)
    Opel / VauxhallKW82
    Anything elseCustom — define the framing yourself
  • Flexible initialization5-Baud (Slow Init), Fast Init, ping and handshake-free modes, each selectable independently of the protocol.

  • Automatic detection — finds the protocol on its own when you do not yet know what the car speaks.

  • Handles the plumbing — headers, length bytes, checksums and handshake timings are built and verified for you.

  • Developer friendly — integrated debug output showing every byte on the bus.

🔍 What You Can Read & Control

🔹 Standard OBD-II — works on any compliant car

Generic diagnostics defined by SAE J1979. No car-specific configuration needed — plug in and read:

ModeDescription
01Live data — real-time sensor values (RPM, coolant temp, speed, throttle, fuel trims…)
02Freeze frame — the sensor snapshot stored when a fault appeared
03Read stored Diagnostic Trouble Codes (DTCs)
04Clear DTCs and reset the MIL
05Oxygen sensor test results
06On-board monitoring test results
07Read pending Diagnostic Trouble Codes
09Vehicle information — VIN, Calibration IDs, Calibration Verification Numbers

DTCs come back as readable codes (P0123 style), and a supported-PID scan lets you ask the ECU which PIDs it actually implements before requesting them.

🔸 Manufacturer protocols — deeper, car-specific access

The manufacturer protocols reach data and functions that generic OBD-II never exposes:

  • Extended live data — manufacturer measurement blocks carrying far more channels than the standard PIDs, decoded into named values with real units (injection time, ignition advance, idle actuator steps, engine load, lambda, and so on). One request returns the whole block, so a dozen values cost a single message.
  • Vehicle control & actuator tests — command the ECU to drive real hardware: MIL and service lamps, fuel pump relay, A/C relay, throttle actuator, tank vent valve, and per-cylinder ignition coil or injection cut-off.
  • Full ECU identification — VIN, part number, supplier, hardware version, software number and engine code.
  • ECU memory & flash reading — read the ECU's internal memory block by block across the whole flash range, streamed over the debug port so you can capture the dump to a file on your PC for analysis.
  • Raw service access — send any manufacturer service by hand; the library still adds the header, length byte and checksum for you.
  • Discovery tools — scan which identifiers an ECU answers and dump responses as offset tables, so you can map an ECU nobody has documented yet.

💡 Manufacturer-specific access is provided through ECU definition files. The generic OBD-II layer ships with the library; car-specific definitions (Opel Simtec 71 / Bosch M1.5.5 / Bosch ME7.5, BMW Bosch BMS 46 and others) are maintained separately — see the Contact section below.

📊 Typical Data Rates

Real-world throughput measured with this library:

ProtocolAverage responses per second
ISO 9141-2~8–9 responses/sec
ISO 14230-4~9–10 responses/sec

🔎 Actual throughput varies with the ECU's internal processing time, the requested PID type and system latency.

📦 Installation

Arduino Library Manager (recommended)

  1. Open the Arduino IDE.
  2. Go to Sketch → Include Library → Manage Libraries…
  3. Search for "OBD2 K-Line".
  4. Click Install.

Manual

Download this repo as a .zip and add it via Sketch → Include Library → Add .ZIP Library…

⚡ Basic Usage — Read Live Data

Read Engine RPM, Coolant Temperature and Vehicle Speed. The library automatically handles different board architectures (AVR / ESP32):

#include"OBD2_KLine.h"// core: connection + protocol layer
#include"ecus/OBD2_Standard.h"// standard OBD2 diagnostics -> OBD2_KLine
OBD2_KLine KLine;
// Uno / Nano have no spare hardware serial, so they fall back to AltSoftSerial// on its fixed pins (RX 8, TX 9). Every other board uses Serial1.
#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__)
#include<AltSoftSerial.h>
AltSoftSerial altSerial;
#defineOBD_SERIAL altSerial
#else
#defineOBD_SERIAL Serial1
#endif
#defineOBD_RX_PIN5
#defineOBD_TX_PIN4voidsetup() {
Serial.begin(115200);
KLine.setSerial(OBD_SERIAL);
KLine.setPins(OBD_RX_PIN, OBD_TX_PIN);
KLine.setDebug(Serial); // View communication logs
KLine.setProtocol(Automatic); // Automatic, ISO9141, ISO14230, KW1281, DS2, KW82, Custom
Serial.println("OBD2 System Starting...");
}
voidloop() {
if (!KLine.isConnected() && !KLine.connect()) return;
float rpm = KLine.getLiveData(0x0C); // PID 0x0C: Engine RPMfloat coolant = KLine.getLiveData(0x05); // PID 0x05: Coolant Tempfloat speed = KLine.getLiveData(0x0D); // PID 0x0D: Vehicle Speed
Serial.print("RPM: "); Serial.println(rpm);
Serial.print("Temp: "); Serial.print(coolant); Serial.println(" C");
Serial.print("Speed: "); Serial.print(speed); Serial.println(" km/h");
}

🛠️ Schematics for Communication

K-Line operates at different voltage/signal levels than microcontroller pins. These circuits provide level shifting and protection for safe, stable operation. Pick the approach that suits your project:

🔹 Transistor-based

Simple, low-cost discrete-transistor interface for basic builds and prototyping. R6 is sized for 3.3V MCUs — for a 5V MCU, change R6 to 5.3 kΩ.

🔹 Comparator-based

Uses a cheap comparator IC (e.g. LM393) for a clean digital level — better noise immunity and well-defined thresholds than the transistor design, at a slightly higher component count.

🔹 Dedicated automotive IC

L9637DMC33290

Si9241SN65HVDA195

Purpose-built K-Line / ISO 9141 transceiver ICs (L9637D, MC33290, Si9241, SN65HVDA195, etc.) with built-in level shifting and protection — highest reliability, recommended for production-grade designs.

📷 Gallery

Custom PCBs designed for this library:

🛠️ Custom hardware & PCBs: looking for ready-to-use devices or custom-made PCBs based on this project? Reach out via email in the Contact section below.

🔗 Related Projects

Part of a full OBD2 / automotive diagnostics ecosystem:

Firmware & ReadersLibrariesManufacturer ProtocolsUI
OBD2 K-line ReaderOBD2 K-Line LibraryBMW I/K BusOBD2 Diagnostic UI
OBD2 CAN Bus ReaderOBD2 CAN Bus LibraryVAG KW1281

☕ Support My Work

If you enjoy my projects and want to support me, you can do so through the links below:

Buy Me A CoffeePayPalGitHub Sponsors


📬 Contact

For information, job offers, collaboration, sponsorship, or purchasing my devices, you can contact me via email.

📧 Email: muksin.muksin04@gmail.com


Created by Muki · If you find this useful, consider giving it a ⭐

About

OBD2 K-Line diagnostics library for Arduino, ESP32 and compatible boards. Supports ISO9141, ISO14230 (KWP2000), KW1281, DS2 and KW82

Topics

Resources

Stars

59 stars

Watchers

2 watching

Forks

Releases

Sponsor this project

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

🚗 OBD2 K-Line Library
(ISO 9141 · KWP2000 · KW1281 · DS2 · KW82)

A professional, high-performance Arduino/ESP32 library for vehicle diagnostics over K-Line — universal OBD-II (ISO 9141-2, ISO 14230-4/KWP2000) plus manufacturer-specific deep access for VAG KW1281, BMW DS2 and Opel KW82.

GitHub forksGitHub Repo starsGitHub Issues or Pull RequestsGitHub LicenseGitHub last commitESP32ArduinoPlatformIO RegistryArduino IDE Library Manager


📌 Overview

OBD2_KLine is a professional, high-performance library for vehicle diagnostics via K-Line, supporting ISO 9141-2, ISO 14230-4 / KWP2000, VAG KW1281, BMW DS2 and Opel KW82. Designed for Arduino, ESP32 and similar microcontrollers, it lets your device talk directly to a vehicle's ECU over the K-Line.

K-Line is a legacy protocol used in many European and Japanese vehicles built between ~1987 and 2010, especially before CAN became mandatory — making this library ideal for both generic OBD-II diagnostics and manufacturer-specific deep system access (VAG, BMW, Opel).

❓ Does Your Vehicle Support K-Line?

Confirm your car speaks K-Line by checking the OBD-II connector pins:

  • Pin 7 connected → K-Line (ISO 9141 / ISO 14230). This library will work.
  • Pins 6 & 14 connected → CAN bus. Use my OBD2 CAN Bus Library instead.

Example OBD-II connectors (left: K-Line with pin 7 · right: CAN with pins 6 & 14):

OBD2 Connector Pin 7 K-LineOBD2 Connector Pin 6 and 14 CAN Bus

🚀 Key Features

  • Universal compatibility — Arduino (Uno, Nano, Mega), ESP32 and other popular MCUs.

  • Six protocols, one API — the packet format is a setting, not a rewrite of your sketch.

    CategorySupported Protocols
    Universal OBD2ISO 9141-2, ISO 14230-4 (KWP2000)
    VAG (VW/Audi/Seat/Škoda)KW1281 (legacy block protocol)
    BMWDS2 (Diagnostic System 2)
    Opel / VauxhallKW82
    Anything elseCustom — define the framing yourself
  • Flexible initialization5-Baud (Slow Init), Fast Init, ping and handshake-free modes, each selectable independently of the protocol.

  • Automatic detection — finds the protocol on its own when you do not yet know what the car speaks.

  • Handles the plumbing — headers, length bytes, checksums and handshake timings are built and verified for you.

  • Developer friendly — integrated debug output showing every byte on the bus.

🔍 What You Can Read & Control

🔹 Standard OBD-II — works on any compliant car

Generic diagnostics defined by SAE J1979. No car-specific configuration needed — plug in and read:

ModeDescription
01Live data — real-time sensor values (RPM, coolant temp, speed, throttle, fuel trims…)
02Freeze frame — the sensor snapshot stored when a fault appeared
03Read stored Diagnostic Trouble Codes (DTCs)
04Clear DTCs and reset the MIL
05Oxygen sensor test results
06On-board monitoring test results
07Read pending Diagnostic Trouble Codes
09Vehicle information — VIN, Calibration IDs, Calibration Verification Numbers

DTCs come back as readable codes (P0123 style), and a supported-PID scan lets you ask the ECU which PIDs it actually implements before requesting them.

🔸 Manufacturer protocols — deeper, car-specific access

The manufacturer protocols reach data and functions that generic OBD-II never exposes:

  • Extended live data — manufacturer measurement blocks carrying far more channels than the standard PIDs, decoded into named values with real units (injection time, ignition advance, idle actuator steps, engine load, lambda, and so on). One request returns the whole block, so a dozen values cost a single message.
  • Vehicle control & actuator tests — command the ECU to drive real hardware: MIL and service lamps, fuel pump relay, A/C relay, throttle actuator, tank vent valve, and per-cylinder ignition coil or injection cut-off.
  • Full ECU identification — VIN, part number, supplier, hardware version, software number and engine code.
  • ECU memory & flash reading — read the ECU's internal memory block by block across the whole flash range, streamed over the debug port so you can capture the dump to a file on your PC for analysis.
  • Raw service access — send any manufacturer service by hand; the library still adds the header, length byte and checksum for you.
  • Discovery tools — scan which identifiers an ECU answers and dump responses as offset tables, so you can map an ECU nobody has documented yet.

💡 Manufacturer-specific access is provided through ECU definition files. The generic OBD-II layer ships with the library; car-specific definitions (Opel Simtec 71 / Bosch M1.5.5 / Bosch ME7.5, BMW Bosch BMS 46 and others) are maintained separately — see the Contact section below.

📊 Typical Data Rates

Real-world throughput measured with this library:

ProtocolAverage responses per second
ISO 9141-2~8–9 responses/sec
ISO 14230-4~9–10 responses/sec

🔎 Actual throughput varies with the ECU's internal processing time, the requested PID type and system latency.

📦 Installation

Arduino Library Manager (recommended)

  1. Open the Arduino IDE.
  2. Go to Sketch → Include Library → Manage Libraries…
  3. Search for "OBD2 K-Line".
  4. Click Install.

Manual

Download this repo as a .zip and add it via Sketch → Include Library → Add .ZIP Library…

⚡ Basic Usage — Read Live Data

Read Engine RPM, Coolant Temperature and Vehicle Speed. The library automatically handles different board architectures (AVR / ESP32):

#include"OBD2_KLine.h"// core: connection + protocol layer
#include"ecus/OBD2_Standard.h"// standard OBD2 diagnostics -> OBD2_KLine
OBD2_KLine KLine;
// Uno / Nano have no spare hardware serial, so they fall back to AltSoftSerial// on its fixed pins (RX 8, TX 9). Every other board uses Serial1.
#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__)
#include<AltSoftSerial.h>
AltSoftSerial altSerial;
#defineOBD_SERIAL altSerial
#else
#defineOBD_SERIAL Serial1
#endif
#defineOBD_RX_PIN5
#defineOBD_TX_PIN4voidsetup() {
Serial.begin(115200);
KLine.setSerial(OBD_SERIAL);
KLine.setPins(OBD_RX_PIN, OBD_TX_PIN);
KLine.setDebug(Serial); // View communication logs
KLine.setProtocol(Automatic); // Automatic, ISO9141, ISO14230, KW1281, DS2, KW82, Custom
Serial.println("OBD2 System Starting...");
}
voidloop() {
if (!KLine.isConnected() && !KLine.connect()) return;
float rpm = KLine.getLiveData(0x0C); // PID 0x0C: Engine RPMfloat coolant = KLine.getLiveData(0x05); // PID 0x05: Coolant Tempfloat speed = KLine.getLiveData(0x0D); // PID 0x0D: Vehicle Speed
Serial.print("RPM: "); Serial.println(rpm);
Serial.print("Temp: "); Serial.print(coolant); Serial.println(" C");
Serial.print("Speed: "); Serial.print(speed); Serial.println(" km/h");
}

🛠️ Schematics for Communication

K-Line operates at different voltage/signal levels than microcontroller pins. These circuits provide level shifting and protection for safe, stable operation. Pick the approach that suits your project:

🔹 Transistor-based

Simple, low-cost discrete-transistor interface for basic builds and prototyping. R6 is sized for 3.3V MCUs — for a 5V MCU, change R6 to 5.3 kΩ.

🔹 Comparator-based

Uses a cheap comparator IC (e.g. LM393) for a clean digital level — better noise immunity and well-defined thresholds than the transistor design, at a slightly higher component count.

🔹 Dedicated automotive IC

L9637DMC33290

Si9241SN65HVDA195

Purpose-built K-Line / ISO 9141 transceiver ICs (L9637D, MC33290, Si9241, SN65HVDA195, etc.) with built-in level shifting and protection — highest reliability, recommended for production-grade designs.

📷 Gallery

Custom PCBs designed for this library:

🛠️ Custom hardware & PCBs: looking for ready-to-use devices or custom-made PCBs based on this project? Reach out via email in the Contact section below.

🔗 Related Projects

Part of a full OBD2 / automotive diagnostics ecosystem:

Firmware & ReadersLibrariesManufacturer ProtocolsUI
OBD2 K-line ReaderOBD2 K-Line LibraryBMW I/K BusOBD2 Diagnostic UI
OBD2 CAN Bus ReaderOBD2 CAN Bus LibraryVAG KW1281

☕ Support My Work

If you enjoy my projects and want to support me, you can do so through the links below:

Buy Me A CoffeePayPalGitHub Sponsors


📬 Contact

For information, job offers, collaboration, sponsorship, or purchasing my devices, you can contact me via email.

📧 Email: muksin.muksin04@gmail.com


Created by Muki · If you find this useful, consider giving it a ⭐

About

OBD2 K-Line diagnostics library for Arduino, ESP32 and compatible boards. Supports ISO9141, ISO14230 (KWP2000), KW1281, DS2 and KW82

Topics

Resources

Stars

59 stars

Watchers

2 watching

Forks

Releases

Sponsor this project

Packages

Contributors

Languages