A few years ago, a friend and I built an Arduino-based dash display for my Miata, using CAN bus and a nextion display. I might have posted about this on GRM before, but if so I cant find it, so I'll post a bit about it here.
I've been tinkering with the Miata for a long time and it's got several pieces of aftermarket electronics in it -- A megasquirt 3 ECU, a RaceLogic Traction Control System and a Race Technologies DL1 datalogger. The Arduino here talks to all of these, in some cases for useful stuff but in other cases just because it can. This is mostly a toy. :)
Let's start with a picture:
The panel itself is a piece of acrylic (I think) that we laser cut and etched using a laser cutter at the (sadly, now defunct) TechShop. My friend did most of that part, so I'm not really familiar with the details.
The Nextion display is in the center. It's a roughly 400x200 pixel touchscreen with its own microprocessor on it and a serial port. You use the Nextion software under Windows to create the screens, text boxes, pictures, etc that you want, compile it, and load the generated data onto the display. After that you can send it commands over the serial port from the Arduino and it will reply back to indicate when buttons have been pressed, etc.
Down the left are 4 LEDs, the bottommost is tied into the RaceLogic TCS (flashes when active), the other three are driven from digital outs on the Arduino.
Two buttons at the top, one of them is a momentary switch to turn on/off datalogging on the DL1 datalogger. The other is currently unassigned.
Two knobs on the bottom, the one on the left controls three boost settings. Low boost cuts power to the boost control solenoid so that it's just running off the spring -- roughly 10 psi. Medium boost enables power so it gets whatever the Megasquirt default boost target is (varies with throttle position, 15 psi at WOT). High boost is wired to the "tableswitch" input on the MS3, and flips it over to around 20 psi.
The other knob controls the RaceLogic TCS, and is a 6-position knob that's wired the same way as the one that is supplied with that unit. It's basically just got a bunch of resistors wired across the back so that the RL can tell what position it's in with 2 wires. The red LED there turns on when the TC is disabled.
Wiring up the back of the faceplate:
The control for all of this is an Arduino 2560 Mega, it lives in a small box.
The actual arduino isn't visible (it's the bluish board on the bottom), the red board is a prototyping breadboard. Soldered onto that are a real-time clock (round blue board on the left), a 12v -> 5v power supply (small square green board), the CAN bus interface (rectangular blue board top right), and three thermocouple reader boards (blue square boards bottom right, two of them are stacked). The wires and pins coming off of it go to a molex 36-pin connector so I can unplug the whole thing.
The software that we wrote for the Arduino receives CAN bus data from the MS3 for things like RPM, MAP, VSS, etc and reads analog inputs connected to the thermocouple drivers for EGT and additional sensors (fuel pressure, oil temperature, etc). It stashes these values in memory, pushing them out to the Nextion display over a serial port as needed. If particular data values go outside of particular ranges then it turns on some of the warning LEDs -- high coolant temps, for example.
The software also periodically transmits the RTC time on the CAN bus over to the MS3 for SD card data logging purposes (the RTC in the MS3 is busted, but the MS software supports a CAN RTC as well). Finally there's another serial port hooked up to the DL1 that receives the NMEA data stream coming off the GPS chip.
Like I said, this is mostly a toy rather than being genuinely useful. The biggest problem with it is that the display is washed out in bright sunlight -- the nextions are designed to be inexpensive and unfortunately they don't offer an anti-glare screen option. It's also small and inconveniently placed for reading while driving on the track. The warning LEDs are the most useful bits, but even they are not well-placed. If I were still using the Miata as my primary track car, I would think about mounting them closer to my line of sight while driving.
Demo video (not all of the data fields were working at this point):