#include <esp32_can.h> | |
uint8_t codes[4] = {5, 0xB, 0xC, 0xD}; | |
int idx = 0; | |
uint32_t tick = 0; | |
const int led_pin = 13; | |
char msg_buf[10]; | |
int led_state = 0; | |
int ledState = LOW; // ledState used to set the LED | |
unsigned long previousMillis = 0; // will store last time LED was updated | |
const long interval = 1000; // interval at which to blink (milliseconds) | |
void setup() | |
{ | |
pinMode(led_pin, OUTPUT); | |
digitalWrite(led_pin, LOW); | |
// Start Serial port | |
Serial.begin(115200); | |
CAN0.setCANPins(GPIO_NUM_4, GPIO_NUM_5); | |
CAN0.begin(500000); | |
Serial.println("Ready ...!"); | |
int filter; | |
//extended | |
for (filter = 0; filter < 3; filter++) | |
{ | |
Can0.setRXFilter(filter, 0, 0, false); | |
} | |
} | |
void loop() | |
{ | |
CAN_FRAME incoming; | |
if (Can0.available() > 0) | |
{ | |
Can0.read(incoming); | |
if (incoming.id > 0x7DF && incoming.id < 0x7F0) | |
{ | |
processPID(incoming); | |
} | |
} | |
static unsigned long l = 0; | |
unsigned long t = millis(); | |
if ((t - l) > 50) | |
{ | |
sendPIDRequest(0x7DF, 0xC); | |
sendPIDRequest(0x7DF, 0xD); | |
sendPIDRequest(0x7DF, 5); | |
l = t; | |
} | |
} | |
void sendPIDRequest(uint32_t id, uint8_t PID) | |
{ | |
CAN_FRAME frame; | |
frame.id = id; | |
frame.extended = 0; | |
frame.length = 8; | |
for (int i = 0; i < 8; i++) | |
frame.data.bytes[i] = 0xAA; | |
frame.data.bytes[0] = 2; //2 more bytes to follow | |
frame.data.bytes[1] = 1; | |
frame.data.bytes[2] = PID; | |
Can0.sendFrame(frame); | |
} | |
int lastTemp=-1; | |
float lastpsi=-1; | |
int lastRPM=-1; | |
int lastMPH=-1; | |
void processPID(CAN_FRAME &frame) | |
{ | |
int temperature; | |
float psi; | |
int RPM; | |
int MPH; | |
if (frame.data.bytes[1] != 0x41) | |
return; //not anything we're interested in then | |
switch (frame.data.bytes[2]) | |
{ | |
case 5: | |
temperature = frame.data.bytes[3] - 40; | |
if (temperature!=lastTemp) | |
{ | |
Serial.print("Coolant temperature (C): "); | |
Serial.println(temperature); | |
lastTemp=temperature; | |
} | |
break; | |
case 0xB: | |
psi = frame.data.bytes[3] * 0.145038; //kPA to PSI | |
psi = psi - 14.8; | |
//psi = psi * 100; | |
if (psi!=lastpsi) | |
{ | |
Serial.print("Manifold abs pressure (psi): "); | |
Serial.println(psi); | |
lastpsi=psi; | |
} | |
break; | |
case 0xC: | |
RPM = ((frame.data.bytes[3] * 256) + frame.data.bytes[4]) / 4; | |
if (RPM!=lastRPM) | |
{ | |
Serial.print("Engine RPM: "); | |
Serial.println(RPM); | |
sprintf(msg_buf, "%d", RPM); | |
lastRPM=RPM; | |
} | |
break; | |
case 0xD: | |
MPH = frame.data.bytes[3] * 0.621371; | |
if (MPH!=lastMPH) | |
{ | |
Serial.print("Vehicle Speed (MPH): "); | |
Serial.println(MPH); | |
lastMPH=MPH; | |
} | |
break; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment