Skip to content

Instantly share code, notes, and snippets.

@ICeZer0
Created October 9, 2019 01:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ICeZer0/865594d7dc416b58b30ae219e44a34b0 to your computer and use it in GitHub Desktop.
Save ICeZer0/865594d7dc416b58b30ae219e44a34b0 to your computer and use it in GitHub Desktop.
Will simulate CAN-BUS messages for a ELM327 OBD sensor to read.
#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