DWIN Display for OBD-II Gauge - Serial data not being read.

Dink1000

Member
Hi Everyone

I'm looking to build a Car display Gauge using a DWIN Display and a teensy 4.0

I've kind of figured out how to send and receive the can messages from the OBD port.

Then figured out that the display needed a solder bridge to actually send and receive serial data.

What i'm stuggling with is to get the can data to change with the display. The display is a touch screen that you can switch pages to display what you need.

The display transmits data on pressing the touch point (data format is 0x5A 0xA5 0x06 0x83 0x30 0x00 0x01 0x00 0x01) the 5AA5 is the header, 06 is the number of bytes after this byte, 83 is read data (82 is write), 3000 is the variable address (i believe) 01 is length and 0001 is the value (Programmed as page 1, 02 as page 2 and 03 as page 3).

What i'm trying to achieve is that the teensy basically sends/reads can data every 250ms and spends the rest of the time monitoring the serial port for data.

This is what i've written so far but for the life of me i cannot get it to work. I kind of got it working using delay but was very hit and miss (mainy miss lol). so added elapsedMillis and now it seems to complete ignore the display

i'm guessing i have a massive noob error some

Code:
#include <FlexCAN_T4.h>
unsigned char Buffer[9];
unsigned char PageBuff[10];
FlexCAN_T4<CAN1, RX_SIZE_256, TX_SIZE_128> can2;

CAN_message_t msg1;
CAN_message_t msg2;
CAN_message_t msg3;
elapsedMillis timing;
const int waitT = 150;

word intakeT = 0;
word coolT = 0;

word RPM = 0;
word Eload = 0;
word Tpos = 0;
word Timadv = 0;


int PageId = 1;
void setup() {
  Serial.begin(9600);
  Serial2.begin(115200);
  can2.begin();
  can2.setBaudRate(500000);
  msg1.id = 0x7DF;
  msg1.len = 8;
  msg1.buf[0] = 0x02;
  msg1.buf[1] = 0x01;
  msg1.buf[3] = 0xCC;
  msg1.buf[4] = 0xCC;
  msg1.buf[5] = 0xCC;
  msg1.buf[6] = 0xCC;
  msg1.buf[7] = 0xCC;
}

void loop(){
  if (timing < 250){
     if (Serial2.available()){
           for (int i = 0; i <= 8; i++) //this loop will store whole frame in buffer array.
          {
           Buffer[i] = Serial2.read();
          }
 
          if (Buffer[0] == 0x5A && Buffer[4] == 0x30)
          {
             switch (Buffer[8])
                  {
               case 0x01:   //for servo
                PageId = 1;
                break;
 
               case 0x02:   //for red
                PageId = 2;
                break;
 
               case 0x03:   //for green
                PageId = 3;
                break;
          
               default:
                Missed();
                break;
                   }
            }
        }
  } else{
    if(PageId == 1)
    {
      PageNo1();
    } else if (PageId == 2)
    {
      PageNo2();
    } else if (PageId == 3)
    {
      PageNo3();
    }
    Serial.println(timing);
    timing = 0;
    Serial.println(timing);
  }
 }
  
void intake(){
  msg1.buf[2] = 0x0F;
  can2.write(msg1);
  can2.read(msg2);
  if (msg2.id == 0x7E8 && msg2.buf[2] == 0x0F){
    intakeT = msg2.buf[3] - 40;
  }
}

void coolant(){
  msg1.buf[2] = 0x05;
  can2.write(msg1);
  can2.read(msg3);
  if (msg3.id == 0x7E8 && msg3.buf[2] == 0x05){
    coolT = msg3.buf[3] - 40;
  }
}
void revs(){
  msg1.buf[2] = 0x0C;
  can2.write(msg1);
  can2.read(msg3);
  if (msg3.id == 0x7E8 && msg3.buf[2] == 0x0C){
    RPM = (msg3.buf[3]*256 + msg3.buf[4])/4;
  }
}
void EngLoad(){
  msg1.buf[2] = 0x04;
  can2.write(msg1);
  can2.read(msg3);
  if (msg3.id == 0x7E8 && msg3.buf[2] == 0x04){
    Eload = ((100/255)*msg3.buf[3]);
  }
}
void TimeAdv(){
  msg1.buf[2] = 0x0E;
  can2.write(msg1);
  can2.read(msg3);
  if (msg3.id == 0x7E8 && msg3.buf[2] == 0x0E){
    RPM = msg3.buf[3] / 2 - 64;
  }
}
void ThrotPos(){
  msg1.buf[2] = 0x11;
  can2.write(msg1);
  can2.read(msg3);
  if (msg3.id == 0x7E8 && msg3.buf[2] == 0x11){
    RPM = ((100/255)*msg3.buf[3]);
  }
}
void PageNo1(){
   revs();
   byte dwin1[] = {0x5A, 0xA5, 0x05, 0x82, 0x20, 0x00, highByte(RPM), lowByte(RPM)};
   EngLoad();
   byte dwin2[] = {0x5A, 0xA5, 0x05, 0x82, 0x20, 0x04, highByte(Eload), lowByte(Eload)};
   Serial2.write(dwin1, sizeof(dwin1));
   Serial2.write(dwin2, sizeof(dwin2));
   Serial.println("Page 1 running");
   //delay(250);
}

void PageNo2(){
   coolant();
   byte dwin3[] = {0x5A, 0xA5, 0x05, 0x82, 0x20, 0x08, highByte(coolT), lowByte(coolT)};
   intake();
   byte dwin4[] = {0x5A, 0xA5, 0x05, 0x82, 0x20, 0x0A, highByte(intakeT), lowByte(intakeT)};
   Serial2.write(dwin3, sizeof(dwin3));
   Serial2.write(dwin4, sizeof(dwin4));
   Serial.println("Page 2 running");
   //delay(250);
}

void PageNo3(){
   ThrotPos();
   byte dwin5[] = {0x5A, 0xA5, 0x05, 0x82, 0x20, 0x0C, highByte(Tpos), lowByte(Tpos)};
   TimeAdv();
   byte dwin6[] = {0x5A, 0xA5, 0x05, 0x82, 0x20, 0x0E, highByte(Timadv), lowByte(Timadv)};
   Serial2.write(dwin5, sizeof(dwin5));
   Serial2.write(dwin6, sizeof(dwin6));
   Serial.println("Page 3 running");
   //delay(250);
}

void Missed(){
  Serial.println("Hello");
  byte pageRead[] = {0x5A, 0xA5, 0x04, 0x83, 0x30, 0x00, 0x01};
  Serial2.write(pageRead, sizeof(pageRead));
     if (Serial2.available())
          {
            for (int i = 0; i <= 8; i++) //this loop will store whole frame in buffer array.
            {
              PageBuff[i] = Serial2.read();
              Serial.println(PageBuff[i], HEX);
             }
       
              if (PageBuff[0] == 0x5A)
                {
                  switch (PageBuff[8])
                     {
                     case 0x01:   //for servo
                     Serial.println("Read Page 1");
                     PageId = 1;
                     break;
 
                     case 0x02:   //for red
                     Serial.println("Read Page 2");
                     PageId = 2;
                     break;
 
                     case 0x03:   //for green
                     Serial.println("Read Page 3");
                     PageId = 3;
                     break;
                     }
                }
            }
            }

20230830_190023.jpg
 
Back
Top