summaryrefslogtreecommitdiff
path: root/libraries/OBDUART/OBDUART.h
diff options
context:
space:
mode:
authorStanley Huang <stanleyhuangyc@gmail.com>2016-06-10 09:20:33 +1000
committerStanley Huang <stanleyhuangyc@gmail.com>2016-06-10 09:20:33 +1000
commit3436b24cb126c409ceb2bb1be9f2e33fe40f6271 (patch)
tree13fc26c577f90abea0af920b36cceab562599970 /libraries/OBDUART/OBDUART.h
parentdd793b5b10981cb28ac733b215de7c417f268f75 (diff)
download2021-arduino-obd-3436b24cb126c409ceb2bb1be9f2e33fe40f6271.tar.gz
2021-arduino-obd-3436b24cb126c409ceb2bb1be9f2e33fe40f6271.tar.bz2
2021-arduino-obd-3436b24cb126c409ceb2bb1be9f2e33fe40f6271.zip
Added library for OBD-II UART Adapter MK2
Diffstat (limited to 'libraries/OBDUART/OBDUART.h')
-rw-r--r--libraries/OBDUART/OBDUART.h171
1 files changed, 171 insertions, 0 deletions
diff --git a/libraries/OBDUART/OBDUART.h b/libraries/OBDUART/OBDUART.h
new file mode 100644
index 0000000..eb9fad5
--- /dev/null
+++ b/libraries/OBDUART/OBDUART.h
@@ -0,0 +1,171 @@
+/*************************************************************************
+* Arduino Library for Freematics OBD-II UART Adapter
+* Distributed under BSD License
+* Visit http://freematics.com for more information
+* (C)2012-2016 Stanley Huang <stanleyhuangyc@gmail.com>
+*************************************************************************/
+
+#include <Arduino.h>
+
+#define OBD_TIMEOUT_SHORT 1000 /* ms */
+#define OBD_TIMEOUT_LONG 15000 /* ms */
+#define OBD_TIMEOUT_GPS 200 /* ms */
+#define OBD_SERIAL_BAUDRATE 38400
+
+#ifndef OBDUART
+#if defined(__AVR_ATmega328P__) || defined(__AVR_ATmega168P__)
+#define OBDUART Serial
+#else
+#define OBDUART Serial1
+#endif
+#endif
+
+// Mode 1 PIDs
+#define PID_ENGINE_LOAD 0x04
+#define PID_COOLANT_TEMP 0x05
+#define PID_SHORT_TERM_FUEL_TRIM_1 0x06
+#define PID_LONG_TERM_FUEL_TRIM_1 0x07
+#define PID_SHORT_TERM_FUEL_TRIM_2 0x08
+#define PID_LONG_TERM_FUEL_TRIM_2 0x09
+#define PID_FUEL_PRESSURE 0x0A
+#define PID_INTAKE_MAP 0x0B
+#define PID_RPM 0x0C
+#define PID_SPEED 0x0D
+#define PID_TIMING_ADVANCE 0x0E
+#define PID_INTAKE_TEMP 0x0F
+#define PID_MAF_FLOW 0x10
+#define PID_THROTTLE 0x11
+#define PID_AUX_INPUT 0x1E
+#define PID_RUNTIME 0x1F
+#define PID_DISTANCE_WITH_MIL 0x21
+#define PID_COMMANDED_EGR 0x2C
+#define PID_EGR_ERROR 0x2D
+#define PID_COMMANDED_EVAPORATIVE_PURGE 0x2E
+#define PID_FUEL_LEVEL 0x2F
+#define PID_WARMS_UPS 0x30
+#define PID_DISTANCE 0x31
+#define PID_EVAP_SYS_VAPOR_PRESSURE 0x32
+#define PID_BAROMETRIC 0x33
+#define PID_CATALYST_TEMP_B1S1 0x3C
+#define PID_CATALYST_TEMP_B2S1 0x3D
+#define PID_CATALYST_TEMP_B1S2 0x3E
+#define PID_CATALYST_TEMP_B2S2 0x3F
+#define PID_CONTROL_MODULE_VOLTAGE 0x42
+#define PID_ABSOLUTE_ENGINE_LOAD 0x43
+#define PID_AIR_FUEL_EQUIV_RATIO 0x44
+#define PID_RELATIVE_THROTTLE_POS 0x45
+#define PID_AMBIENT_TEMP 0x46
+#define PID_ABSOLUTE_THROTTLE_POS_B 0x47
+#define PID_ABSOLUTE_THROTTLE_POS_C 0x48
+#define PID_ACC_PEDAL_POS_D 0x49
+#define PID_ACC_PEDAL_POS_E 0x4A
+#define PID_ACC_PEDAL_POS_F 0x4B
+#define PID_COMMANDED_THROTTLE_ACTUATOR 0x4C
+#define PID_TIME_WITH_MIL 0x4D
+#define PID_TIME_SINCE_CODES_CLEARED 0x4E
+#define PID_ETHANOL_FUEL 0x52
+#define PID_FUEL_RAIL_PRESSURE 0x59
+#define PID_HYBRID_BATTERY_PERCENTAGE 0x5B
+#define PID_ENGINE_OIL_TEMP 0x5C
+#define PID_FUEL_INJECTION_TIMING 0x5D
+#define PID_ENGINE_FUEL_RATE 0x5E
+#define PID_ENGINE_TORQUE_DEMANDED 0x61
+#define PID_ENGINE_TORQUE_PERCENTAGE 0x62
+#define PID_ENGINE_REF_TORQUE 0x63
+
+typedef enum {
+ PROTO_AUTO = 0,
+ PROTO_ISO_9141_2 = 3,
+ PROTO_KWP2000_5KBPS = 4,
+ PROTO_KWP2000_FAST = 5,
+ PROTO_CAN_11B_500K = 6,
+ PROTO_CAN_29B_500K = 7,
+ PROTO_CAN_29B_250K = 8,
+ PROTO_CAN_11B_250K = 9,
+} OBD_PROTOCOLS;
+
+// states
+typedef enum {
+ OBD_DISCONNECTED = 0,
+ OBD_CONNECTING = 1,
+ OBD_CONNECTED = 2,
+ OBD_FAILED = 3
+} OBD_STATES;
+
+uint16_t hex2uint16(const char *p);
+uint8_t hex2uint8(const char *p);
+
+class COBDUART
+{
+public:
+ COBDUART():dataMode(1),errors(0),m_state(OBD_DISCONNECTED) {}
+ // begin serial UART
+ virtual void begin();
+ // initialize OBD-II connection
+ virtual bool init(OBD_PROTOCOLS protocol = PROTO_AUTO);
+ // un-initialize OBD-II connection
+ virtual void end();
+ // set serial baud rate
+ virtual bool setBaudRate(unsigned long baudrate);
+ // get connection state
+ virtual OBD_STATES getState() { return m_state; }
+ // read specified OBD-II PID value
+ virtual bool readPID(byte pid, int& result);
+ // read multiple (up to 8) OBD-II PID values, return number of values obtained
+ virtual byte readPID(const byte pid[], byte count, int result[]);
+ // set device into
+ virtual void sleep();
+ // set working protocol (default auto)
+ virtual bool setProtocol(OBD_PROTOCOLS h = PROTO_AUTO);
+ // send AT command and receive response
+ virtual byte sendCommand(const char* cmd, char* buf, byte bufsize, int timeout = OBD_TIMEOUT_LONG);
+ // clear diagnostic trouble code
+ virtual void clearDTC();
+ // get battery voltage (in 0.1V, e.g. 125 for 12.5V, works without ECU)
+ virtual float getVoltage();
+ // get VIN as a string, buffer length should be >= OBD_RECV_BUF_SIZE
+ virtual bool getVIN(char* buffer, byte bufsize);
+ // send query for specified PID
+ virtual void sendQuery(byte pid);
+ // retrive and parse the response of specifie PID
+ virtual bool getResult(byte& pid, int& result);
+ // determine if the PID is supported
+ virtual bool isValidPID(byte pid);
+ // init GPS module
+ // parse GPS data
+ // set current PID mode
+ byte dataMode;
+ // occurrence of errors
+ byte errors;
+ // bit map of supported PIDs
+ byte pidmap[4 * 4];
+ // adapter version
+ byte version;
+protected:
+ virtual char* getResponse(byte& pid, char* buffer, byte bufsize);
+ virtual byte receive(char* buffer, byte bufsize, int timeout = OBD_TIMEOUT_SHORT);
+ virtual void write(const char* s);
+ virtual void dataIdleLoop() {}
+ void recover();
+ void debugOutput(const char* s);
+ int normalizeData(byte pid, char* data);
+ OBD_STATES m_state;
+private:
+ virtual uint8_t getPercentageValue(char* data)
+ {
+ return (uint16_t)hex2uint8(data) * 100 / 255;
+ }
+ virtual uint16_t getLargeValue(char* data)
+ {
+ return hex2uint16(data);
+ }
+ virtual uint8_t getSmallValue(char* data)
+ {
+ return hex2uint8(data);
+ }
+ virtual int16_t getTemperatureValue(char* data)
+ {
+ return (int)hex2uint8(data) - 40;
+ }
+};
+