Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 19 additions & 14 deletions examples/Car Specific/Honda/Honda.ino
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,11 @@ void setup() {
KLine.setInterByteTimeout(60); // Optional: sets the maximum inter-byte timeout (ms) while receiving data
KLine.setReadTimeout(1000); // Optional: maximum time (ms) to wait for a response after sending a request

//KLine.setInitAddress(0x33); // Optional: Sets the target ECU address used during the 5-baud Slow Init sequence.
//KLine.setISO9141Header(0x68, 0x6A, 0xF1); // Optional: Configures the 3-byte header (Priority, Receiver, Transmitter) for ISO9141.
//KLine.setISO14230Header(0xC0, 0x33, 0xF1); // Optional: Configures the 3-byte header (Format, Receiver, Transmitter) for KWP2000.
//KLine.setLengthMode(true); // Optional: Defines if data length is embedded in the header or sent as a separate byte.

Serial.println("Honda Code.");
}

Expand All @@ -29,19 +34,19 @@ void loop() {

void Honda_Simulator() {
if (KLine.readData()) {
if (KLine.compareData(hondaEngine, sizeof(hondaEngine))) KLine.writeRawData(hondaEngine_Response, sizeof(hondaEngine_Response), 0);
else if (KLine.compareData(hondaEngine2, sizeof(hondaEngine2))) KLine.writeRawData(hondaEngine_Response, sizeof(hondaEngine_Response), 0);
else if (KLine.compareData(hondaEngine_LiveData1, sizeof(hondaEngine_LiveData1))) KLine.writeRawData(hondaEngine_LiveData1_R, sizeof(hondaEngine_LiveData1_R), 0);
else if (KLine.compareData(hondaEngine_LiveData2, sizeof(hondaEngine_LiveData2))) KLine.writeRawData(hondaEngine_LiveData2_R, sizeof(hondaEngine_LiveData2_R), 3);
else if (KLine.compareData(hondaEngine_LiveData3, sizeof(hondaEngine_LiveData3))) KLine.writeRawData(hondaEngine_LiveData3_R, sizeof(hondaEngine_LiveData3_R), 0);
else if (KLine.compareData(hondaEngine_LiveData4, sizeof(hondaEngine_LiveData4))) KLine.writeRawData(hondaEngine_LiveData4_R, sizeof(hondaEngine_LiveData4_R), 0);
else if (KLine.compareData(hondaEngine_LiveData5, sizeof(hondaEngine_LiveData5))) KLine.writeRawData(hondaEngine_LiveData5_R, sizeof(hondaEngine_LiveData5_R), 0);
else if (KLine.compareData(hondaEngine_LiveData6, sizeof(hondaEngine_LiveData6))) KLine.writeRawData(hondaEngine_LiveData6_R, sizeof(hondaEngine_LiveData6_R), 0);
else if (KLine.compareData(hondaEngine_LiveData7, sizeof(hondaEngine_LiveData7))) KLine.writeRawData(hondaEngine_LiveData7_R, sizeof(hondaEngine_LiveData7_R), 0);
else if (KLine.compareData(hondaEngine_LiveData8, sizeof(hondaEngine_LiveData8))) KLine.writeRawData(hondaEngine_LiveData8_R, sizeof(hondaEngine_LiveData8_R), 0);
else if (KLine.compareData(hondaEngine_LiveData9, sizeof(hondaEngine_LiveData9))) KLine.writeRawData(hondaEngine_LiveData9_R, sizeof(hondaEngine_LiveData9_R), 0);
else if (KLine.compareData(hondaEngine_ReadDTCs, sizeof(hondaEngine_ReadDTCs))) KLine.writeRawData(hondaEngine_ReadDTCs_R, sizeof(hondaEngine_ReadDTCs_R), 0);
else if (KLine.compareData(hondaEngine_ClearDTCs, sizeof(hondaEngine_ClearDTCs))) KLine.writeRawData(hondaEngine_ClearDTCs_R, sizeof(hondaEngine_ClearDTCs_R), 0);
//else if (KLine.compareData(hondaABS, sizeof(hondaABS))) KLine.writeRawData(hondaABS_Response, sizeof(hondaABS_Response), false);
if (KLine.compareData(hondaEngine)) KLine.writeRawData(hondaEngine_Response, 0);
else if (KLine.compareData(hondaEngine2)) KLine.writeRawData(hondaEngine_Response, 0);
else if (KLine.compareData(hondaEngine_LiveData1)) KLine.writeRawData(hondaEngine_LiveData1_R, 0);
else if (KLine.compareData(hondaEngine_LiveData2)) KLine.writeRawData(hondaEngine_LiveData2_R, 3);
else if (KLine.compareData(hondaEngine_LiveData3)) KLine.writeRawData(hondaEngine_LiveData3_R, 0);
else if (KLine.compareData(hondaEngine_LiveData4)) KLine.writeRawData(hondaEngine_LiveData4_R, 0);
else if (KLine.compareData(hondaEngine_LiveData5)) KLine.writeRawData(hondaEngine_LiveData5_R, 0);
else if (KLine.compareData(hondaEngine_LiveData6)) KLine.writeRawData(hondaEngine_LiveData6_R, 0);
else if (KLine.compareData(hondaEngine_LiveData7)) KLine.writeRawData(hondaEngine_LiveData7_R, 0);
else if (KLine.compareData(hondaEngine_LiveData8)) KLine.writeRawData(hondaEngine_LiveData8_R, 0);
else if (KLine.compareData(hondaEngine_LiveData9)) KLine.writeRawData(hondaEngine_LiveData9_R, 0);
else if (KLine.compareData(hondaEngine_ReadDTCs)) KLine.writeRawData(hondaEngine_ReadDTCs_R, 0);
else if (KLine.compareData(hondaEngine_ClearDTCs)) KLine.writeRawData(hondaEngine_ClearDTCs_R, 0);
//else if (KLine.compareData(hondaABS)) KLine.writeRawData(hondaABS_Response, false);
}
}
65 changes: 35 additions & 30 deletions examples/Car Specific/Opel/Opel.ino
Original file line number Diff line number Diff line change
Expand Up @@ -17,33 +17,38 @@ int kw81_Stage = 0;
void setup() {
Serial.begin(115200); // Start the default serial (for logging/debugging)

KLine.setDebug(Serial); // Optional: outputs debug messages to the selected serial port
//KLine.setProtocol("ISO14230_Fast"); // Optional: communication protocol (default: Automatic; supported: ISO9141, ISO14230_Slow, ISO14230_Fast, Automatic)
KLine.setByteWriteInterval(5); // Optional: delay (ms) between bytes when writing
KLine.setInterByteTimeout(60); // Optional: sets the maximum inter-byte timeout (ms) while receiving data
KLine.setReadTimeout(1000); // Optional: maximum time (ms) to wait for a response after sending a request
KLine.setDebug(Serial); // Optional: outputs debug messages to the selected serial port
KLine.setProtocol("ISO14230_Fast"); // Optional: communication protocol (default: Automatic; supported: ISO9141, ISO14230_Slow, ISO14230_Fast, Automatic)
KLine.setByteWriteInterval(5); // Optional: delay (ms) between bytes when writing
KLine.setInterByteTimeout(60); // Optional: sets the maximum inter-byte timeout (ms) while receiving data
KLine.setReadTimeout(1000); // Optional: maximum time (ms) to wait for a response after sending a request

//KLine.setInitAddress(0x33); // Optional: Sets the target ECU address used during the 5-baud Slow Init sequence.
//KLine.setISO9141Header(0x68, 0x6A, 0xF1); // Optional: Configures the 3-byte header (Priority, Receiver, Transmitter) for ISO9141.
KLine.setISO14230Header(0x80, 0x11, 0xF1); // Optional: Configures the 3-byte header (Format, Receiver, Transmitter) for KWP2000.
//KLine.setLengthMode(true); // Optional: Defines if data length is embedded in the header or sent as a separate byte.

Serial.println("Opel Code.");
}

void loop() {
//Opel_Vectra_Test1();
//KLine.read5baud();
Opel_Vectra_Test1();
//Opel_Vectra_Test2();

Opel_Vectra_Simulator1();
//Opel_Vectra_Simulator1(); //Engine and Immobilizer
//Opel_Vectra_Simulator2(); //Instrument Cluster Simulator (Select 4800 Baud)
}

void Opel_Vectra_Test1() {
if (KLine.initOBD2()) {
KLine.writeRawData(imoKeepalive, sizeof(imoKeepalive), 2), KLine.readData();
KLine.writeRawData(imoReadLiveData, sizeof(imoReadLiveData), 2), KLine.readData();

KLine.writeRawData(imoKeepalive, sizeof(imoKeepalive), 2), KLine.readData();
KLine.writeRawData(imoReadDTCs, sizeof(imoReadDTCs), 2), KLine.readData();
KLine.writeRawData(engineReadLiveData1, 2), KLine.readData();
KLine.writeRawData(engineReadLiveData2, 2), KLine.readData();
KLine.writeRawData(engineReadLiveData3, 2), KLine.readData();

KLine.writeRawData(imoKeepalive, sizeof(imoKeepalive), 2), KLine.readData();
KLine.writeRawData(imoClearDTCs, sizeof(imoClearDTCs), 2), KLine.readData();
// KLine.writeRawData(imoReadLiveData, 2), KLine.readData();
// KLine.writeRawData(imoReadDTCs, 2), KLine.readData();
// KLine.writeRawData(imoClearDTCs, 2), KLine.readData();
}
}

Expand All @@ -56,35 +61,35 @@ void Opel_Vectra_Test2() {

void Opel_Vectra_Simulator1() {
if (KLine.readData()) {
if (KLine.compareData(engineInit0, sizeof(engineInit0)) || KLine.compareData(engineInit, sizeof(engineInit))) KLine.writeRawData(engineInit_Response, sizeof(engineInit_Response), 2);
else if (KLine.compareData(engineCheckConnection, sizeof(engineCheckConnection))) KLine.writeRawData(engineCheckConnection_Response, sizeof(engineCheckConnection_Response), 2);
else if (KLine.compareData(engineReadLiveData1, sizeof(engineReadLiveData1))) KLine.writeRawData(engineReadLiveData1_Response, sizeof(engineReadLiveData1_Response), 2);
else if (KLine.compareData(engineReadLiveData2, sizeof(engineReadLiveData2))) KLine.writeRawData(engineReadLiveData2_Response, sizeof(engineReadLiveData2_Response), 2);
else if (KLine.compareData(engineReadLiveData3, sizeof(engineReadLiveData3))) KLine.writeRawData(engineReadLiveData3_Response, sizeof(engineReadLiveData3_Response), 2);

if (KLine.compareData(imoInit0, sizeof(imoInit0))) KLine.writeRawData(imoInit_Response, sizeof(imoInit_Response), 2);
else if (KLine.compareData(imoKeepalive, sizeof(imoKeepalive))) KLine.writeRawData(imoKeepalive_Response, sizeof(imoKeepalive_Response), 2);
else if (KLine.compareData(imoReadLiveData, sizeof(imoReadLiveData))) KLine.writeRawData(imoReadLiveData_Response, sizeof(imoReadLiveData_Response), 2);
else if (KLine.compareData(imoReadDTCs, sizeof(imoReadDTCs))) KLine.writeRawData(imoReadDTCs_Response, sizeof(imoReadDTCs_Response), 2);
else if (KLine.compareData(imoClearDTCs, sizeof(imoClearDTCs))) KLine.writeRawData(imoClearDTCs_Response2, sizeof(imoClearDTCs_Response2), 2);
if (KLine.compareData(engineInit0) || KLine.compareData(engineInit)) KLine.writeRawData(engineInit_Response, 2);
else if (KLine.compareData(engineCheckConnection)) KLine.writeRawData(engineCheckConnection_Response, 2);
else if (KLine.compareData(engineReadLiveData1)) KLine.writeRawData(engineReadLiveData1_Response, 2);
else if (KLine.compareData(engineReadLiveData2)) KLine.writeRawData(engineReadLiveData2_Response, 2);
else if (KLine.compareData(engineReadLiveData3)) KLine.writeRawData(engineReadLiveData3_Response, 2);

if (KLine.compareData(imoInit0)) KLine.writeRawData(imoInit_Response, 2);
else if (KLine.compareData(imoKeepalive)) KLine.writeRawData(imoKeepalive_Response, 2);
else if (KLine.compareData(imoReadLiveData)) KLine.writeRawData(imoReadLiveData_Response, 2);
else if (KLine.compareData(imoReadDTCs)) KLine.writeRawData(imoReadDTCs_Response, 2);
else if (KLine.compareData(imoClearDTCs)) KLine.writeRawData(imoClearDTCs_Response2, 2);
}
}

void Opel_Vectra_Simulator2() {
if (connectionStatus == false) {
if (KLine.read5baud() == 0x60) {
connectionStatus = true;
KLine.writeRawData(instumentClusterInit_Response, sizeof(instumentClusterInit_Response), 0);
KLine.writeRawData(instumentClusterInit_Response, 0);
}
}
if (connectionStatus == true) {
if (kw81_Stage == 0) KLine.writeRawData(instumentClusterECUID_Response, sizeof(instumentClusterECUID_Response), 0);
else if (kw81_Stage == 1) KLine.writeRawData(instumentClusterLiveData_Response, sizeof(instumentClusterLiveData_Response), 0);
if (kw81_Stage == 0) KLine.writeRawData(instumentClusterECUID_Response, 0);
else if (kw81_Stage == 1) KLine.writeRawData(instumentClusterLiveData_Response, 0);
else if (kw81_Stage == 2) {}

if (KLine.readData()) {
if (KLine.compareData(instumentClusterLiveData, sizeof(instumentClusterLiveData))) kw81_Stage = 1;
else if (KLine.compareData(instumentClusterClearDTC, sizeof(instumentClusterClearDTC))) kw81_Stage = 2;
if (KLine.compareData(instumentClusterLiveData)) kw81_Stage = 1;
else if (KLine.compareData(instumentClusterClearDTC)) kw81_Stage = 2;
}
}
}
7 changes: 6 additions & 1 deletion examples/OBD2 Standard/ClearDTC/ClearDTC.ino
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,18 @@ void setup() {
KLine.setInterByteTimeout(60); // Optional: sets the maximum inter-byte timeout (ms) while receiving data
KLine.setReadTimeout(1000); // Optional: maximum time (ms) to wait for a response after sending a request

KLine.setInitAddress(0x33); // Optional: Sets the target ECU address used during the 5-baud Slow Init sequence.
KLine.setISO9141Header(0x68, 0x6A, 0xF1); // Optional: Configures the 3-byte header (Priority, Receiver, Transmitter) for ISO9141.
KLine.setISO14230Header(0xC0, 0x33, 0xF1); // Optional: Configures the 3-byte header (Format, Receiver, Transmitter) for KWP2000.
KLine.setLengthMode(true); // Optional: Defines if data length is embedded in the header or sent as a separate byte.

Serial.println("OBD2 Starting.");
}

void loop() {
// Attempt to initialize OBD2 communication
if (KLine.initOBD2()) {
KLine.clearDTCs(); // Clear Diagnostic Trouble Codes (DTCs)
KLine.clearDTCs(); // Clear Diagnostic Trouble Codes (DTCs)
delay(1000);
}
}
5 changes: 5 additions & 0 deletions examples/OBD2 Standard/GetFreezeFrame/GetFreezeFrame.ino
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,11 @@ void setup() {
KLine.setInterByteTimeout(60); // Optional: sets the maximum inter-byte timeout (ms) while receiving data
KLine.setReadTimeout(1000); // Optional: maximum time (ms) to wait for a response after sending a request

KLine.setInitAddress(0x33); // Optional: Sets the target ECU address used during the 5-baud Slow Init sequence.
KLine.setISO9141Header(0x68, 0x6A, 0xF1); // Optional: Configures the 3-byte header (Priority, Receiver, Transmitter) for ISO9141.
KLine.setISO14230Header(0xC0, 0x33, 0xF1); // Optional: Configures the 3-byte header (Format, Receiver, Transmitter) for KWP2000.
KLine.setLengthMode(true); // Optional: Defines if data length is embedded in the header or sent as a separate byte.

Serial.println("OBD2 Starting.");
}

Expand Down
5 changes: 5 additions & 0 deletions examples/OBD2 Standard/GetLiveData/GetLiveData.ino
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,11 @@ void setup() {
KLine.setInterByteTimeout(60); // Optional: sets the maximum inter-byte timeout (ms) while receiving data
KLine.setReadTimeout(1000); // Optional: maximum time (ms) to wait for a response after sending a request

KLine.setInitAddress(0x33); // Optional: Sets the target ECU address used during the 5-baud Slow Init sequence.
KLine.setISO9141Header(0x68, 0x6A, 0xF1); // Optional: Configures the 3-byte header (Priority, Receiver, Transmitter) for ISO9141.
KLine.setISO14230Header(0xC0, 0x33, 0xF1); // Optional: Configures the 3-byte header (Format, Receiver, Transmitter) for KWP2000.
KLine.setLengthMode(true); // Optional: Defines if data length is embedded in the header or sent as a separate byte.

Serial.println("OBD2 Starting.");
}

Expand Down
5 changes: 5 additions & 0 deletions examples/OBD2 Standard/GetSupportedPIDs/GetSupportedPIDs.ino
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,11 @@ void setup() {
KLine.setInterByteTimeout(60); // Optional: sets the maximum inter-byte timeout (ms) while receiving data
KLine.setReadTimeout(1000); // Optional: maximum time (ms) to wait for a response after sending a request

KLine.setInitAddress(0x33); // Optional: Sets the target ECU address used during the 5-baud Slow Init sequence.
KLine.setISO9141Header(0x68, 0x6A, 0xF1); // Optional: Configures the 3-byte header (Priority, Receiver, Transmitter) for ISO9141.
KLine.setISO14230Header(0xC0, 0x33, 0xF1); // Optional: Configures the 3-byte header (Format, Receiver, Transmitter) for KWP2000.
KLine.setLengthMode(true); // Optional: Defines if data length is embedded in the header or sent as a separate byte.

Serial.println("OBD2 Starting.");
}

Expand Down
5 changes: 5 additions & 0 deletions examples/OBD2 Standard/GetVehicleInfo/GetVehicleInfo.ino
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,11 @@ void setup() {
KLine.setInterByteTimeout(60); // Optional: sets the maximum inter-byte timeout (ms) while receiving data
KLine.setReadTimeout(1000); // Optional: maximum time (ms) to wait for a response after sending a request

KLine.setInitAddress(0x33); // Optional: Sets the target ECU address used during the 5-baud Slow Init sequence.
KLine.setISO9141Header(0x68, 0x6A, 0xF1); // Optional: Configures the 3-byte header (Priority, Receiver, Transmitter) for ISO9141.
KLine.setISO14230Header(0xC0, 0x33, 0xF1); // Optional: Configures the 3-byte header (Format, Receiver, Transmitter) for KWP2000.
KLine.setLengthMode(true); // Optional: Defines if data length is embedded in the header or sent as a separate byte.

Serial.println("OBD2 Starting.");
}

Expand Down
5 changes: 5 additions & 0 deletions examples/OBD2 Standard/ReadDTC/ReadDTC.ino
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,11 @@ void setup() {
KLine.setInterByteTimeout(60); // Optional: sets the maximum inter-byte timeout (ms) while receiving data
KLine.setReadTimeout(1000); // Optional: maximum time (ms) to wait for a response after sending a request

KLine.setInitAddress(0x33); // Optional: Sets the target ECU address used during the 5-baud Slow Init sequence.
KLine.setISO9141Header(0x68, 0x6A, 0xF1); // Optional: Configures the 3-byte header (Priority, Receiver, Transmitter) for ISO9141.
KLine.setISO14230Header(0xC0, 0x33, 0xF1); // Optional: Configures the 3-byte header (Format, Receiver, Transmitter) for KWP2000.
KLine.setLengthMode(true); // Optional: Defines if data length is embedded in the header or sent as a separate byte.

Serial.println("OBD2 Starting.");
}

Expand Down
34 changes: 34 additions & 0 deletions examples/OBD2 Standard/Sniffer/Sniffer.ino
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
#include "OBD2_KLine.h" // Include the library for OBD2 K-Line communication

#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined(__AVR_ATmega2560__)
#include <AltSoftSerial.h>
AltSoftSerial Alt_Serial;
OBD2_KLine KLine(Alt_Serial, 10400, 8, 9); // Uses AltSoftSerial at 10400 baud, with RX on pin 8 and TX on pin 9.
#elif defined(ESP32)
OBD2_KLine KLine(Serial1, 9600, 10, 11); // Uses Hardware Serial (Serial1) at 10400 baud, with RX on pin 10 and TX on pin 11.
#else
#error "Unsupported board! This library currently supports Arduino Uno, Nano, Mega, and ESP32. Please select a compatible board in your IDE."
#endif

void setup() {
Serial.begin(115200); // Start the default serial (for logging/debugging)
Serial.println("OBD2 K-Line Sniffing Example");

KLine.setDebug(Serial); // Optional: outputs debug messages to the selected serial port
KLine.setByteWriteInterval(5); // Optional: delay (ms) between bytes when writing
KLine.setInterByteTimeout(20); // Optional: sets the maximum inter-byte timeout (ms) while receiving data
KLine.setReadTimeout(1000); // Optional: maximum time (ms) to wait for a response after sending a request

KLine.setInitAddress(0x33); // Optional: Sets the target ECU address used during the 5-baud Slow Init sequence.
KLine.setISO9141Header(0x68, 0x6A, 0xF1); // Optional: Configures the 3-byte header (Priority, Receiver, Transmitter) for ISO9141.
KLine.setISO14230Header(0xC0, 0x33, 0xF1); // Optional: Configures the 3-byte header (Format, Receiver, Transmitter) for KWP2000.
KLine.setLengthMode(true); // Optional: Defines if data length is embedded in the header or sent as a separate byte.

Serial.println("OBD2 Starting.");
}

void loop() {
// int result = KLine.read5baud();
// if (result < 0) KLine.readData();
KLine.readData();
}
Loading