I am working on this project to read car data and sending it to cloud ,and found this library to read car data via OBD. I was wondering about the car data that I recieved my car is a Proton Exora 2014 and the data that I recieved is weird so to say here is the data I recieved https://github.com/coryjfowler/MCP_CAN_lib. I'm using MCP2515 and ESP32 TTGO CALL SIM800 to read and send the data.
And for starters I just wanted to detect Car RPM and I assume that RXid is 0x310 (knowing this is the only value that changes the moment the engine started) which is different from the normal 7DF / 7E8 request
I'm following the example to read RPM from @coryjfowler here is the code
/* OBD2 TACHO
By moty22.co.uk
Lib written By: Cory J. Fowler December 20th, 2016
https://github.com/coryjfowler/MCP_CAN_lib
*/
#include <mcp_can.h>
#include <SPI.h>
#define standard 1 //standard is 11 bits
#define txID 0x310 //0x7E9
unsigned long rxId;
byte len;
byte rxBuf[8];
unsigned char txData[8] = {0x02, 0x01, 0x0C, 0x55, 0x55, 0x55, 0x55, 0x55}; //PID to request 010C
MCP_CAN CAN0(13); // Set CAN0 CS to pin 10
void setup()
{
Serial.begin(115200);
while (!Serial);
// Initialize MCP2515 running at baudrate of 500kb/s . If your can board has 16MHz crystal change the setting.
if (CAN0.begin(MCP_STDEXT, CAN_500KBPS, MCP_8MHZ) == CAN_OK)
Serial.println("Initialized Successfully!");
else
Serial.println("**Error Initializing**");
CAN0.setMode(MCP_NORMAL); // Set operation mode to normal so the MCP2515 sends acks to received data.
}
void loop()
{
byte back = 0;
unsigned int rpm = 100;
delay(500);
CAN0.sendMsgBuf(txID, 8, txData); //request data from ECU
for (byte i = 0; i < 20; ++i)
{ //get 20 times unless reply arrived from the ECU
CAN0.readMsgBuf(&rxId, &len, rxBuf); // Get CAN data - 03 41 0C 3D 0F
if (rxId == 0x310) {
Serial.print(rxId, HEX); //0x7E8
Serial.print("\t");
for (byte i = 0; i < len; i++) // print the data
{
Serial.print(rxBuf[i], HEX);
Serial.print("\t");
}
Serial.println();
back = 1;
}
if (back) {
rpm = (rxBuf[3] * 256 + rxBuf[4]) / 4; //calculate the rpm
Serial.println(rpm);
break;
}
}
}
what I've tried :
using the standard recieve and transfer ID but it is not detecting anything,
changing txid to 0x310 or 0x00 (I use 0x00 from the data that is detected from Can_recieve) and keeping rxid 0x310, I can recieve some data from this but the value is all over the place between 100 to 7000
using txid to 0x310 and rxid 0x310 but changing the txdata from the default {0x02, 0x01, 0x0C, 0x55, 0x55, 0x55, 0x55, 0x55} to {0x02, 0x01, 0x0C, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA} which has the same result
I'm not sure if I define it correctly (which i don't think so) and would like to have a ittle bit of insight on this
this is the Can_recieve code that I use
// CAN Receive Example
//
#include <mcp_can.h>
#include <SPI.h>
long unsigned int rxId;
unsigned char len = 0;
unsigned char rxBuf[8];
char msgString[128]; // Array to store serial string
#define CAN0_INT 18 // Set INT to pin 2
MCP_CAN CAN0(13); // Set CS to pin 10
void setup()
{
Serial.begin(115200);
// Initialize MCP2515 running at 8MHz with a baudrate of 500kb/s and the masks and filters disabled.
if(CAN0.begin(MCP_ANY, CAN_500KBPS, MCP_8MHZ) == CAN_OK)
Serial.println("MCP2515 Initialized Successfully!");
else
Serial.println("Error Initializing MCP2515...");
CAN0.setMode(MCP_NORMAL); // Set operation mode to normal so the MCP2515 sends acks to received data.
pinMode(CAN0_INT, INPUT); // Configuring pin for /INT input
Serial.println("MCP2515 Recieve");
}
void loop()
{
if(!digitalRead(CAN0_INT)) // If CAN0_INT pin is low, read receive buffer
{
CAN0.readMsgBuf(&rxId, &len, rxBuf); // Read data: len = data length, buf = data byte(s)
if((rxId & 0x80000000) == 0x80000000) // Determine if ID is standard (11 bits) or extended (29 bits)
sprintf(msgString, "Extended ID: 0x%.8lX DLC: %1d Data:", (rxId & 0x1FFFFFFF), len);
else
sprintf(msgString, "Standard ID: 0x%.3lX DLC: %1d Data:", rxId, len);
Serial.print(msgString);
if((rxId & 0x40000000) == 0x40000000){ // Determine if message is a remote request frame.
sprintf(msgString, " REMOTE REQUEST FRAME");
Serial.print(msgString);
} else {
for(byte i = 0; i<len; i++){
sprintf(msgString, " 0x%.2X", rxBuf[i]);
Serial.print(msgString);
}
}
Serial.println();
}
}
/*********************************************************************************************************
END FILE
*********************************************************************************************************/
Hello there
I am working on this project to read car data and sending it to cloud ,and found this library to read car data via OBD. I was wondering about the car data that I recieved my car is a Proton Exora 2014 and the data that I recieved is weird so to say here is the data I recieved https://github.com/coryjfowler/MCP_CAN_lib. I'm using MCP2515 and ESP32 TTGO CALL SIM800 to read and send the data.
And for starters I just wanted to detect Car RPM and I assume that RXid is 0x310 (knowing this is the only value that changes the moment the engine started) which is different from the normal 7DF / 7E8 request
I'm following the example to read RPM from @coryjfowler here is the code
what I've tried :
I'm not sure if I define it correctly (which i don't think so) and would like to have a ittle bit of insight on this
this is the Can_recieve code that I use