DIY: Getting data from Holley CAN BUS
You problem is that there is nothing on the receiving end of the canbus wires. Hook something up that expects the same speed and protocol and it should go away. I tested this with my current J1939 CANBUS encoder project.
What does that gear indicator cost anyway? Their we site seems to be hacked or someting.
BTW, I'm working with a canbus display device, that can not only display what gear you are in, but has a touch screen and dial that has advanced haptic inputs like touch and swipe. It has a GUI builder that lets you put in any graphics or text and any number of screens. All kinds of canbus controlled stuff like screen dimming, progress bars, gauges, etc. It's a Grayhill Touch encoder. A single hole with a locking nut mounts it.
I added some of your code to mine to check the error message. Here is a little routine that send a request to the encoder to see what screen it's on every half a second. I use this to see when the encoder finally boots up (takes a few seconds) before I send it more data and also to make sure we haven't lost communication. The encoder then sends back a response and if I don't get the screen number back, I'll know it's FUBAR.
Your code looks fine otherwise
Last edited by LSswap; Jan 21, 2025 at 07:07 PM.
That looks like an industrialized intelligent display similar to the 7" one in my setup (post 78 in this thread) only it talks canbus instead of a simple serial interface and it doesn't have a touch screen. Probably a bit brighter which is a plus.
A CANBUS interface is great for industrial apps because of it's inherent noise immunity, but for simplicity of interfacing a serial one is simpler.
The code in your intermediary processor will have to translate the can data from the source can input (or just from sensors) and decide how often to update the can display so as not to overload it. In my touch screen, there are about 7000 lines of code that are for the most part dedicated to the display. Doesn't need to be that complicated for just displaying data but mine has full live editing capability, and is more of a user interface than just a display.
Almost all of these new intelligent devices, like this display, and the touch encoder and my 7" touch screen have a GUI that runs on a PC to help set up the graphics and the location and the appearance of each of the variables you will need to address on the screen. That makes the setup of the display easier.
Maybe post the actual link to this display so we can look at the details.
Last edited by LSswap; Feb 6, 2025 at 08:13 AM.
However if then interface is like the on in the Grayhill Touch encoder I played with, it expects the messages with specific addresses and specific contents and I don't believe it can be trained to understand foreign commands other than the specific ones defined in the documents Here is the Grahill Touch Encoder CAN protocol
Last edited by LSswap; Feb 6, 2025 at 11:29 AM.
The Best V8 Stories One Small Block at Time
Couple of takeaways. It says it has a capacitive touchscreen. It got lots of other interface options like rs232 and more. It says 250k is default, but no way to change it.
They even hard arduino code examples for it: https://github.com/Smart-Display-Ser...duino_Examples
Digikey does not stock it. They also make one in 7"
Couple of takeaways. It says it has a capacitive touchscreen. It got lots of other interface options like rs232 and more. It says 250k is default, but no way to change it.
They even hard arduino code examples for it: https://github.com/Smart-Display-Ser...duino_Examples
Digikey does not stock it. They also make one in 7"
Andrew
Just wanted to say thank you for this post. I've been wanting to make a gas mileage computer for my Holley Sniper for a few years now and finally took on the project.
With the help of this post in particular, I was able to finally crack the Holley Sniper with my Arduino and get live data from the ECU.
Extremely exciting and rewarding to see the numbers that pop up in the Serial Monitor match the values that are on the handheld display!
Not sure how to post the code as it says it's too long.
#include <mcp_can.h>
float RPM, pulseWidth, dutyCycle, closedLoopComp, targetAFR, AFR, lbPerHour, timing, IAC, MAP, TPS, MAT, CTS, battery;
union CANData
{
unsigned char arr[4];
float value;
};
MCP_CAN CANBus(53); //CS Pin. 10 for UNO
int CANStatus;
void setup()
{
Serial.begin(115200);
Initialize();
}
void loop()
{
if (CANStatus == CAN_OK)
{
CheckForCANMessage();
Serial.println("RPM: " + String(RPM) + " MAP: " + String(MAP) + " CTS: " + String(CTS));
}
}
void Initialize()
{
CANStatus = CANBus.begin(MCP_ANY, CAN_1000KBPS, MCP_8MHZ);
if (CANStatus == CAN_OK)
{
pinMode(2, INPUT);
CANBus.setMode(MCP_NORMAL);
}
else
{
Serial.println("Init fail: " + String(CANStatus));
}
}
void CheckForCANMessage()
{
if (!digitalRead(2))
{
unsigned long int ID;
unsigned char len;
unsigned char buff[8];
CANBus.readMsgBuf(&ID, &len, buff);
ID = ID & 0xFFFFF800;
union CANData val;
val.arr[3] = buff[0];
val.arr[2] = buff[1];
val.arr[1] = buff[2];
val.arr[0] = buff[3];
float newVal = (float)(val.value);
switch (ID)
{
case 0x9E005000: RPM = newVal; break;
case 0x9E009000: pulseWidth = newVal; break;
case 0x9E00D000: dutyCycle = newVal; break;
case 0x9E011000: closedLoopComp = newVal; break;
case 0x9E015000: targetAFR = newVal; break;
case 0x9E019000: AFR = newVal; break;
case 0x9E039000: lbPerHour = newVal; break;
case 0x9E049000: timing = newVal; break;
case 0x9E059000: IAC = newVal; break;
case 0x9E05D000: MAP = newVal; break;
case 0x9E061000: TPS = newVal; break;
case 0x9E065000: MAT = newVal; break;
case 0x9E069000: CTS = newVal; break;
case 0x9E06D000: battery = newVal; break;
}
}
}
Holley's documentation doesn't seem to line up, but the main thing that I discerned from their documentation is that the value for the Sniper CAN Bus data is that it's a float. Once it's cast to a float, everything works as it should.
This code is set up for a Mega 2560 board, so the Chip Select (CS) pin is set for 53. An UNO would need it set to 10.
Holley's documentation doesn't seem to line up, but the main thing that I discerned from their documentation is that the value for the Sniper CAN Bus data is that it's a float. Once it's cast to a float, everything works as it should.
This code is set up for a Mega 2560 board, so the Chip Select (CS) pin is set for 53. An UNO would need it set to 10.
I built an engine simulator, so I can plug this in the Holley to test out the code.
The power and ground aren't needed for this setup as everything is already powered. Just need the High / Low to the CAN Bus transceiver.
The power and ground aren't needed for this setup as everything is already powered. Just need the High / Low to the CAN Bus transceiver.
Couple of takeaways. It says it has a capacitive touchscreen. It got lots of other interface options like rs232 and more. It says 250k is default, but no way to change it.
They even hard arduino code examples for it: https://github.com/Smart-Display-Ser...duino_Examples
Digikey does not stock it. They also make one in 7"








