——來(lái)自迪文開發(fā)者論壇
本期為大家推送迪文開發(fā)者論壇獲獎(jiǎng)開源案例——?基于T5L的汽車抬頭顯示器方案?。該方案采用COF智能屏,通過(guò)T5L CAN接口,實(shí)時(shí)獲取汽車OBDII診斷接口的數(shù)據(jù),并將接收到的車速和轉(zhuǎn)速數(shù)據(jù)同步顯示在屏幕上,為駕駛員在行車過(guò)程中提供直觀、便捷的視覺(jué)輔助。
【演示視頻】
視頻由論壇工程師實(shí)拍提供
完整開發(fā)資料含迪文屏DGUS工程資料與C51代碼,獲取方式:
1. 前往迪文開發(fā)者論壇獲?。?span style="font-size: 18px; text-decoration: underline; line-height: 150%; color: rgb(51, 102, 153); background: rgb(255, 255, 255);">http://inforum.dwin.com.cn:20080/forum.php?mod=viewthread&tid=10904&extra=&_dsign=d701329d
2. 微信公眾號(hào)中回復(fù)“汽車抬頭顯示器”獲取。
【UI素材展示】
【GUI工程設(shè)計(jì)】
【程序代碼設(shè)計(jì)】
通過(guò)T5L CAN接口,獲取車速和轉(zhuǎn)速數(shù)據(jù),部分參考代碼如下:
void main(void)
{
T5LInit();
T0_Init(); // 定時(shí)器0初始化
EA = 1;
//等待上電穩(wěn)定
TimerExtDelayMs(2000);
GaugeViewInit();
while (1)
{
//obdii系統(tǒng)進(jìn)入識(shí)別
if (ObdiiSysEnter())
{
break;
}
}
//HUD功能主入口
GaugeViewFunc();
}
void GaugeViewFunc(void)
{
uint8_t rawDataBuff[256];
uint8_t resultBuff[5];
float vehicleSpeed = 0;
float rotateSpeed = 0;
uint32_t tempData = 0;
while (1)
{
memset(rawDataBuff, 0, 256);
// 讀取轉(zhuǎn)速
if (ObdiiReadPid(rawDataBuff, 2, 0x01, 0x0C))
{
ObdiiLdsCalResult(0x0C, rawDataBuff, resultBuff);
tempData = resultBuff[3];
tempData = resultBuff[2] + (tempData << 8);
tempData = resultBuff[1] + (tempData << 8);
tempData = resultBuff[0] + (tempData << 8);
rotateSpeed = (float)tempData;
GaugeViewRotateSpeedSet(rotateSpeed);
}
memset(rawDataBuff, 0, 256);
// 讀取車速
if (ObdiiReadPid(rawDataBuff, 2, 0x01, 0x0D))
{
ObdiiLdsCalResult(0x0D, rawDataBuff, resultBuff);
tempData = resultBuff[3];
tempData = resultBuff[2] + (tempData << 8);
tempData = resultBuff[1] + (tempData << 8);
tempData = resultBuff[0] + (tempData << 8);
vehicleSpeed = (float)tempData;
GaugeViewPointerSet((uint8_t)vehicleSpeed);
GaugeViewVehicleSpeedSet(vehicleSpeed);
}
}
}
void GaugeViewFunc(void)
{
uint8_t rawDataBuff[256];
uint8_t resultBuff[5];
float vehicleSpeed = 0;
float rotateSpeed = 0;
uint32_t tempData = 0;
while (1)
{
memset(rawDataBuff, 0, 256);
// 讀取轉(zhuǎn)速
if (ObdiiReadPid(rawDataBuff, 2, 0x01, 0x0C))
{
ObdiiLdsCalResult(0x0C, rawDataBuff, resultBuff);
tempData = resultBuff[3];
tempData = resultBuff[2] + (tempData << 8);
tempData = resultBuff[1] + (tempData << 8);
tempData = resultBuff[0] + (tempData << 8);
rotateSpeed = (float)tempData;
GaugeViewRotateSpeedSet(rotateSpeed);
}
memset(rawDataBuff, 0, 256);
// 讀取車速
if (ObdiiReadPid(rawDataBuff, 2, 0x01, 0x0D))
{
ObdiiLdsCalResult(0x0D, rawDataBuff, resultBuff);
tempData = resultBuff[3];
tempData = resultBuff[2] + (tempData << 8);
tempData = resultBuff[1] + (tempData << 8);
tempData = resultBuff[0] + (tempData << 8);
vehicleSpeed = (float)tempData;
GaugeViewPointerSet((uint8_t)vehicleSpeed);
GaugeViewVehicleSpeedSet(vehicleSpeed);
}
}
}