diff options
author | Stanley Huang <stanleyhuangyc@live.com> | 2016-06-26 20:53:03 +0800 |
---|---|---|
committer | Stanley Huang <stanleyhuangyc@live.com> | 2016-06-26 20:53:03 +0800 |
commit | 243b5fa4ddd06b845a68abccb0a109584cf0fa38 (patch) | |
tree | 853ff2c83711e6ef0b55b919ec54b195aa49a739 /libraries | |
parent | 80112f02d05aed34035534b342b320854d445cba (diff) | |
download | 2021-arduino-obd-243b5fa4ddd06b845a68abccb0a109584cf0fa38.tar.gz 2021-arduino-obd-243b5fa4ddd06b845a68abccb0a109584cf0fa38.tar.bz2 2021-arduino-obd-243b5fa4ddd06b845a68abccb0a109584cf0fa38.zip |
Library and examples for OBD-II UART Adapter MK2
Diffstat (limited to 'libraries')
-rw-r--r-- | libraries/OBD2UART/OBD2UART.cpp (renamed from libraries/OBDUART/OBDUART.cpp) | 63 | ||||
-rw-r--r-- | libraries/OBD2UART/OBD2UART.h (renamed from libraries/OBDUART/OBDUART.h) | 4 | ||||
-rw-r--r-- | libraries/OBD2UART/examples/obd_uart_test/obd_uart_test.ino | 105 | ||||
-rw-r--r-- | libraries/OBD2UART/examples/rpm_led_uart/rpm_led_uart.ino | 30 |
4 files changed, 176 insertions, 26 deletions
diff --git a/libraries/OBDUART/OBDUART.cpp b/libraries/OBD2UART/OBD2UART.cpp index f91c7ea..78954c4 100644 --- a/libraries/OBDUART/OBDUART.cpp +++ b/libraries/OBD2UART/OBD2UART.cpp @@ -5,7 +5,7 @@ * (C)2012-2016 Stanley Huang <stanleyhuangyc@gmail.com> *************************************************************************/ -#include "OBDUART.h" +#include "OBD2UART.h" //#define DEBUG Serial @@ -54,14 +54,14 @@ byte hex2uint8(const char *p) * OBD-II UART Adapter *************************************************************************/ -byte COBDUART::sendCommand(const char* cmd, char* buf, byte bufsize, int timeout) +byte COBD2UART::sendCommand(const char* cmd, char* buf, byte bufsize, int timeout) { write(cmd); dataIdleLoop(); return receive(buf, bufsize, timeout); } -void COBDUART::sendQuery(byte pid) +void COBD2UART::sendQuery(byte pid) { char cmd[8]; sprintf(cmd, "%02X%02X\r", dataMode, pid); @@ -71,7 +71,7 @@ void COBDUART::sendQuery(byte pid) write(cmd); } -bool COBDUART::readPID(byte pid, int& result) +bool COBD2UART::readPID(byte pid, int& result) { // send a query command sendQuery(pid); @@ -79,14 +79,14 @@ bool COBDUART::readPID(byte pid, int& result) return getResult(pid, result); } -byte COBDUART::readPID(const byte pid[], byte count, int result[]) +byte COBD2UART::readPID(const byte pid[], byte count, int result[]) { // send a multiple query command char buffer[128]; char *p = buffer; byte results = 0; for (byte n = 0; n < count; n++) { - p += sprintf(p, "%02X%02X\r\n", dataMode, pid[n]); + p += sprintf(p, "%02X%02X\r", dataMode, pid[n]); } write(buffer); // receive and parse the response @@ -98,19 +98,19 @@ byte COBDUART::readPID(const byte pid[], byte count, int result[]) return results; } -void COBDUART::clearDTC() +void COBD2UART::clearDTC() { char buffer[32]; write("04\r"); receive(buffer, sizeof(buffer)); } -void COBDUART::write(const char* s) +void COBD2UART::write(const char* s) { OBDUART.write(s); } -int COBDUART::normalizeData(byte pid, char* data) +int COBD2UART::normalizeData(byte pid, char* data) { int result; switch (pid) { @@ -194,7 +194,7 @@ int COBDUART::normalizeData(byte pid, char* data) return result; } -char* COBDUART::getResponse(byte& pid, char* buffer, byte bufsize) +char* COBD2UART::getResponse(byte& pid, char* buffer, byte bufsize) { while (receive(buffer, bufsize) > 0) { char *p = buffer; @@ -213,7 +213,7 @@ char* COBDUART::getResponse(byte& pid, char* buffer, byte bufsize) return 0; } -bool COBDUART::getResult(byte& pid, int& result) +bool COBD2UART::getResult(byte& pid, int& result) { char buffer[64]; char* data = getResponse(pid, buffer, sizeof(buffer)); @@ -226,7 +226,7 @@ bool COBDUART::getResult(byte& pid, int& result) return true; } -bool COBDUART::setProtocol(OBD_PROTOCOLS h) +bool COBD2UART::setProtocol(OBD_PROTOCOLS h) { char buf[32]; if (h == PROTO_AUTO) { @@ -241,22 +241,37 @@ bool COBDUART::setProtocol(OBD_PROTOCOLS h) return false; } -void COBDUART::sleep() +void COBD2UART::sleep() { char buf[32]; sendCommand("ATLP\r", buf, sizeof(buf)); } -float COBDUART::getVoltage() +char* COBD2UART::getResultValue(char* buf) +{ + char* p = buf; + for (;;) { + if (isdigit(*p)) { + return p; + } + p = strchr(p, '\r'); + if (!p) break; + if (*(++p) == '\n') p++; + } + return 0; +} + +float COBD2UART::getVoltage() { char buf[32]; if (sendCommand("ATRV\r", buf, sizeof(buf)) > 0) { - return atof(buf); + char* p = getResultValue(buf); + if (p) return atof(p); } return 0; } -bool COBDUART::getVIN(char* buffer, byte bufsize) +bool COBD2UART::getVIN(char* buffer, byte bufsize) { if (sendCommand("0902\r", buffer, bufsize)) { char *p = strstr(buffer, "0: 49 02"); @@ -276,7 +291,7 @@ bool COBDUART::getVIN(char* buffer, byte bufsize) return false; } -bool COBDUART::isValidPID(byte pid) +bool COBD2UART::isValidPID(byte pid) { if (pid >= 0x7f) return true; @@ -286,7 +301,7 @@ bool COBDUART::isValidPID(byte pid) return pidmap[i] & b; } -void COBDUART::begin() +void COBD2UART::begin() { OBDUART.begin(OBD_SERIAL_BAUDRATE); #ifdef DEBUG @@ -295,7 +310,7 @@ void COBDUART::begin() recover(); } -byte COBDUART::receive(char* buffer, byte bufsize, int timeout) +byte COBD2UART::receive(char* buffer, byte bufsize, int timeout) { unsigned char n = 0; unsigned long startTime = millis(); @@ -328,13 +343,13 @@ byte COBDUART::receive(char* buffer, byte bufsize, int timeout) return n; } -void COBDUART::recover() +void COBD2UART::recover() { char buf[16]; sendCommand("AT\r", buf, sizeof(buf)); } -bool COBDUART::init(OBD_PROTOCOLS protocol) +bool COBD2UART::init(OBD_PROTOCOLS protocol) { const char *initcmd[] = {"ATZ\r","ATE0\r","ATL1\r","0100\r"}; char buffer[64]; @@ -391,13 +406,13 @@ bool COBDUART::init(OBD_PROTOCOLS protocol) return true; } -void COBDUART::end() +void COBD2UART::end() { m_state = OBD_DISCONNECTED; OBDUART.end(); } -bool COBDUART::setBaudRate(unsigned long baudrate) +bool COBD2UART::setBaudRate(unsigned long baudrate) { OBDUART.print("ATBR1 "); OBDUART.print(baudrate); @@ -411,7 +426,7 @@ bool COBDUART::setBaudRate(unsigned long baudrate) #ifdef DEBUG -void COBDUART::debugOutput(const char *s) +void COBD2UART::debugOutput(const char *s) { DEBUG.print('['); DEBUG.print(millis()); diff --git a/libraries/OBDUART/OBDUART.h b/libraries/OBD2UART/OBD2UART.h index eb9fad5..618b8c6 100644 --- a/libraries/OBDUART/OBDUART.h +++ b/libraries/OBD2UART/OBD2UART.h @@ -95,10 +95,10 @@ typedef enum { uint16_t hex2uint16(const char *p); uint8_t hex2uint8(const char *p); -class COBDUART +class COBD2UART { public: - COBDUART():dataMode(1),errors(0),m_state(OBD_DISCONNECTED) {} + COBD2UART():dataMode(1),errors(0),m_state(OBD_DISCONNECTED) {} // begin serial UART virtual void begin(); // initialize OBD-II connection diff --git a/libraries/OBD2UART/examples/obd_uart_test/obd_uart_test.ino b/libraries/OBD2UART/examples/obd_uart_test/obd_uart_test.ino new file mode 100644 index 0000000..bd1c618 --- /dev/null +++ b/libraries/OBD2UART/examples/obd_uart_test/obd_uart_test.ino @@ -0,0 +1,105 @@ +/************************************************************************* +* Testing sketch for Freematics OBD-II UART Adapter +* Reads and prints several OBD-II PIDs value +* Distributed under GPL v2.0 +* Visit http://freematics.com for more information +* Written by Stanley Huang <stanleyhuangyc@gmail.com> +*************************************************************************/ + +#include <SoftwareSerial.h> +#include <OBD2UART.h> + +// On Arduino Leonardo, Micro, MEGA or DUE, hardware serial can be used for output +// as OBD-II UART adapter connects to Serial1, otherwise we use software serial +SoftwareSerial mySerial(A2, A3); +//#define mySerial Serial + +COBD obd; + +void testOut() +{ + static const char cmds[][6] = {"ATZ\r", "ATL1\r", "ATH0\r", "ATRV\r", "0100\r", "010C\r", "0902\r"}; + char buf[128]; + + for (byte i = 0; i < sizeof(cmds) / sizeof(cmds[0]); i++) { + const char *cmd = cmds[i]; + mySerial.print("Sending "); + mySerial.println(cmd); + if (obd.sendCommand(cmd, buf, sizeof(buf))) { + char *p = strstr(buf, cmd); + if (p) + p += strlen(cmd); + else + p = buf; + while (*p == '\r') p++; + while (*p) { + mySerial.write(*p); + if (*p == '\r' && *(p + 1) != '\r') + mySerial.write('\n'); + p++; + } + } else { + mySerial.println("Timeout"); + } + delay(1000); + } + mySerial.println(); +} + +void readPIDSingle() +{ + int value; + mySerial.print('['); + mySerial.print(millis()); + mySerial.print(']'); + mySerial.print("RPM="); + if (obd.readPID(PID_RPM, value)) { + mySerial.print(value); + } + mySerial.println(); +} + +void readPIDMultiple() +{ + static const byte pids[] = {PID_SPEED, PID_ENGINE_LOAD, PID_THROTTLE, PID_COOLANT_TEMP, PID_INTAKE_TEMP}; + int values[sizeof(pids)]; + if (obd.readPID(pids, sizeof(pids), values) == sizeof(pids)) { + for (byte i = 0; i < sizeof(pids) ; i++) { + mySerial.print('['); + mySerial.print(millis()); + mySerial.print(']'); + mySerial.print((int)pids[i] | 0x100, HEX); + mySerial.print('='); + mySerial.println(values[i]); + } + } +} + +void setup() +{ + delay(500); + mySerial.begin(115200); + // this will begin serial + obd.begin(); + + // send some commands for testing and show response + testOut(); + + // initialize OBD-II adapter + do { + mySerial.println("Init..."); + } while (!obd.init()); + + char buf[64]; + if (obd.getVIN(buf, sizeof(buf))) { + mySerial.print("VIN:"); + mySerial.println(buf); + } + delay(1000); +} + +void loop() +{ + readPIDSingle(); + readPIDMultiple(); +} diff --git a/libraries/OBD2UART/examples/rpm_led_uart/rpm_led_uart.ino b/libraries/OBD2UART/examples/rpm_led_uart/rpm_led_uart.ino new file mode 100644 index 0000000..3e80ae3 --- /dev/null +++ b/libraries/OBD2UART/examples/rpm_led_uart/rpm_led_uart.ino @@ -0,0 +1,30 @@ +/************************************************************************* +* Sample sketch based on OBD-II library for Arduino +* Distributed under GPL v2.0 +* Visit http://freematics.com for more information +* (C)2012-2014 Stanley Huang <stanleyhuangyc@gmail.com> +*************************************************************************/ + +#include <OBD2UART.h> + +COBD obd; + +void setup() +{ + // we'll use the debug LED as output + pinMode(13, OUTPUT); + // start communication with OBD-II UART adapter + obd.begin(); + // initiate OBD-II connection until success + while (!obd.init()); +} + +void loop() +{ + int value; + if (obd.readPID(PID_RPM, value)) { + // RPM is successfully read and its value stored in variable 'value' + // light on LED when RPM exceeds 3000 + digitalWrite(13, value > 3000 ? HIGH : LOW); + } +} |