Honda tire pressure monitor light project

I’m actually receiving the error when trying to send CAN messages. Seems like I can send 15 at a time or so.

Just wondering if there is a workaround, would be great to playback the 15 minutes of candump file and watch the gauges move around

Well I did it! Discovered that the arbitration ID for TPMS is 333

I then noticed that the messages go in a pattern like this:

(1476987407.909367) can0 333#0000000000000F
(1476987408.009644) can0 333#0000000000001E
(1476987408.109524) can0 333#0000000000002D
(1476987408.208971) can0 333#0000000000003C

I wrote a script to keep playing those messages via canplayer and the light seems to be staying off!

PS I still want to figure out how to play 15 minutes of a candump file!

Update. So now I verified that it REALLY works. :slight_smile:

I modified the Julien’s minimal transmitting code app and changed the values to the appropriate ones for “working” TPMS in my Honda.
I then disconnected the TPMS module, located just above the accelerator pedal.
I flashed the code to my Particle and so far so good, no TPMS light!
Next step I need to get the Particle to go to sleep when the car is off and do some more testing to make sure this really works.
Below is a snippet of code (changes from Julien’s code) and some pictures. Note that I have a light on for a missing Blind Spot Information System since I took the cluster from a car that had this feature and ours does not. So next I need to reverse engineer this signal!


// A CAN message has an ID that identifies the content inside
message.id = 0x333;

// It can have from 0 to 8 data bytes
message.len = 7;

// Pass the data to be transmitted in the data array
message.data[0] = 0x00;
message.data[1] = 0x00;
message.data[2] = 0x00;
message.data[3] = 0x00;
message.data[4] = 0x00;
message.data[5] = 0x00;
message.data[6] = 0x0F;
// Send the message on the bus!
carloop.can().transmit(message);
message.data[6] = 0x1E;
carloop.can().transmit(message);
message.data[6] = 0x2D;
carloop.can().transmit(message);
message.data[6] = 0x3C;
carloop.can().transmit(message);
lastTransmitTime = now;

}
}

Wow, that’s an impressive accomplishment! Well done! You can put a delay(100); in between each transmit to insert a 100ms pause in between each transmit. The messages you posted above show a delay of 0.1s in between each frame.

I’ll see if I can figure out what the “no buffer space available” message means.

Thought it might be useful to share the message shown when the TPMS Module is reporting low tire pressure:

Where the last digit changes from 0E to 1D to 2C to 3B

333 01 00 00 00 00 00 0E

Not sure if 01 just means “a tire is low” or “1 tire is low”. Pretty clear that in this car the TPMS module does NOT report tire pressure, only if a tire is low.

1 Like

Thought it might be useful to share the message shown when the TPMS Module is reporting low tire pressure:

Where the last digit changes from 0E to 1D to 2C to 3B

333 01 00 00 00 00 00 0E

Has anyone have any insight to the algorithm used to generate the last nibble of the last byte? It does seem like a sum then XOR’d by a value…

For example, sum of (00 00 00 00 00 00) = 00 ^0x0F == 0x0F
sum of (01 00 00 00 00 00) = 00 ^0x0F == 0x0E

But this does not work with much of the data I have traced from a Honda. I mean, I can confirm that there are some messages that are 8 bytes, first seven are 0x00s and the last byte is 0x0F, but that algorithm doesn’t work with everything.