diff options
author | Stanley Huang <stanleyhuangyc@gmail.com> | 2016-06-10 09:20:33 +1000 |
---|---|---|
committer | Stanley Huang <stanleyhuangyc@gmail.com> | 2016-06-10 09:20:33 +1000 |
commit | 3436b24cb126c409ceb2bb1be9f2e33fe40f6271 (patch) | |
tree | 13fc26c577f90abea0af920b36cceab562599970 /libraries/OBDUART/OBDUART.h | |
parent | dd793b5b10981cb28ac733b215de7c417f268f75 (diff) | |
download | 2021-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.h | 171 |
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; + } +}; + |