-
-
Save ICeZer0/865594d7dc416b58b30ae219e44a34b0 to your computer and use it in GitHub Desktop.
Will simulate CAN-BUS messages for a ELM327 OBD sensor to read.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <SPI.h> | |
#include <mcp_can_dfs.h> | |
#include "mcp_can.h" | |
#define INT8U unsigned char | |
#define INT32U unsigned char | |
#define CAN_500KBPS 16 | |
#define CAN_ID_PID 0x7DF | |
// the cs pin of the version after v1.1 is default to D9 | |
// v0.9b and v1.0 is default D10 | |
const int SPI_CS_PIN = 9; | |
MCP_CAN CAN(SPI_CS_PIN); // Set CS to pin 10 | |
unsigned char PID_INPUT; | |
unsigned char getPid = 0; | |
unsigned char len = 0; | |
unsigned char buf[8]; | |
char str[20]; | |
String BuildMessage=""; | |
int MSGIdentifier=0; | |
INT32U canId = 0x000; | |
void sendPid(unsigned char __pid) | |
{ | |
unsigned char tmp[8] = {0x02, 0x01, __pid, 0, 0, 0, 0, 0}; | |
Serial.print("SEND PID: 0x"); | |
Serial.println(__pid, HEX); | |
CAN.sendMsgBuf(CAN_ID_PID, 0, 8, tmp); | |
} | |
void setup() { | |
Serial.begin(115200); | |
START_INIT: | |
if(CAN_OK == CAN.begin(CAN_500KBPS)) // init can bus : baudrate = 500k | |
{ | |
Serial.println("CAN BUS Shield init ok!"); | |
} | |
else | |
{ | |
Serial.println("CAN BUS Shield init fail"); | |
Serial.println("Init CAN BUS Shield again"); | |
delay(100); | |
goto START_INIT; | |
} | |
} | |
void loop() | |
{ | |
unsigned char rndCoolantTemp=random(1,200); | |
unsigned char rndRPM=random(1,55); | |
unsigned char rndSpeed=random(0,255); | |
unsigned char rndIAT=random(0,255); | |
unsigned char rndMAF=random(0,255); | |
unsigned char rndAmbientAirTemp=random(0,200); | |
unsigned char rndCAT1Temp=random(1,55); | |
//GENERAL ROUTINE | |
unsigned char SupportedPID[8] = {255, 255, 255, 255, 255, 255, 255, 255}; | |
unsigned char MilCleared[7] = {4, 65, 63, 34, 224, 185, 147}; | |
//SENSORS | |
unsigned char CoolantTemp[7] = {4, 65, 5, rndCoolantTemp, 0, 185, 147}; | |
unsigned char rpm[7] = {4, 65, 12, rndRPM, 224, 185, 147}; | |
unsigned char vspeed[7] = {4, 65, 13, rndSpeed, 224, 185, 147}; | |
unsigned char IATSensor[7] = {4, 65, 15, rndIAT, 0, 185, 147}; | |
unsigned char MAFSensor[7] = {4, 65, 16, rndMAF, 0, 185, 147}; | |
unsigned char AmbientAirTemp[7] = {4, 65, 70, rndAmbientAirTemp, 0, 185, 147}; | |
unsigned char CAT1Temp[7] = {4, 65, 60, rndCAT1Temp, 224, 185, 147}; | |
unsigned char CAT2Temp[7] = {4, 65, 61, rndCAT1Temp, 224, 185, 147}; | |
unsigned char CAT3Temp[7] = {4, 65, 62, rndCAT1Temp, 224, 185, 147}; | |
unsigned char CAT4Temp[7] = {4, 65, 63, rndCAT1Temp, 224, 185, 147}; | |
Serial.println(rndCoolantTemp); | |
if(CAN_MSGAVAIL == CAN.checkReceive()) | |
{ | |
Serial.println("Message Received \n"); | |
CAN.readMsgBuf(&len, buf); | |
canId = CAN.getCanId(); | |
Serial.print("<");Serial.print(canId);Serial.print(","); | |
for(int i = 0; i<len; i++) | |
{ | |
BuildMessage = BuildMessage + buf[i] + ","; | |
} | |
Serial.println(BuildMessage); | |
//Check wich message was received. | |
if(BuildMessage=="2,1,0,0,0,0,0,0,") {CAN.sendMsgBuf(0x7E8, 0, 8, SupportedPID);} | |
if(BuildMessage=="2,1,1,0,0,0,0,0,") {CAN.sendMsgBuf(0x7E8, 0, 7, MilCleared);} | |
//SEND SENSOR STATUSES | |
if(BuildMessage=="2,1,5,0,0,0,0,0,") {CAN.sendMsgBuf(0x7E8, 0, 7, CoolantTemp);} | |
if(BuildMessage=="2,1,12,0,0,0,0,0,"){CAN.sendMsgBuf(0x7E8, 0, 7, rpm);} | |
if(BuildMessage=="2,1,13,0,0,0,0,0,"){CAN.sendMsgBuf(0x7E8, 0, 7, vspeed);} | |
if(BuildMessage=="2,1,15,0,0,0,0,0,"){CAN.sendMsgBuf(0x7E8, 0, 7, IATSensor);} | |
if(BuildMessage=="2,1,16,0,0,0,0,0,"){CAN.sendMsgBuf(0x7E8, 0, 7, MAFSensor);} | |
if(BuildMessage=="2,1,70,0,0,0,0,0,"){CAN.sendMsgBuf(0x7E8, 0, 7, AmbientAirTemp);} | |
if(BuildMessage=="2,1,60,0,0,0,0,0,"){CAN.sendMsgBuf(0x7E8, 0, 7, CAT1Temp);} | |
if(BuildMessage=="2,1,61,0,0,0,0,0,"){CAN.sendMsgBuf(0x7E8, 0, 7, CAT2Temp);} | |
if(BuildMessage=="2,1,62,0,0,0,0,0,"){CAN.sendMsgBuf(0x7E8, 0, 7, CAT3Temp);} | |
if(BuildMessage=="2,1,63,0,0,0,0,0,"){CAN.sendMsgBuf(0x7E8, 0, 7, CAT4Temp);} | |
BuildMessage=""; | |
} | |
} | |
void taskCanRecv() | |
{ | |
unsigned char len = 0; | |
unsigned char buf[8]; | |
if(CAN_MSGAVAIL == CAN.checkReceive()) // check if get data | |
{ | |
CAN.readMsgBuf(&len, buf); // read data, len: data length, buf: data buf | |
Serial.println("\r\n------------------------------------------------------------------"); | |
Serial.print("Get Data From id: 0x"); | |
Serial.println(CAN.getCanId(), HEX); | |
for(int i = 0; i<len; i++) // print the data | |
{ | |
Serial.print("0x"); | |
Serial.print(buf[i], HEX); | |
Serial.print("\t"); | |
} | |
Serial.println(); | |
} | |
} | |
void taskDbg() | |
{ | |
while(Serial.available()) | |
{ | |
char c = Serial.read(); | |
if(c>='0' && c<='9') | |
{ | |
PID_INPUT *= 0x10; | |
PID_INPUT += c-'0'; | |
} | |
else if(c>='A' && c<='F') | |
{ | |
PID_INPUT *= 0x10; | |
PID_INPUT += 10+c-'A'; | |
} | |
else if(c>='a' && c<='f') | |
{ | |
PID_INPUT *= 0x10; | |
PID_INPUT += 10+c-'a'; | |
} | |
else if(c == '\n') // END | |
{ | |
getPid = 1; | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment