資料介紹
描述
根據(jù)研究公司IHS Markit的數(shù)據(jù),“今年美國(guó)輕型車(chē)輛的平均運(yùn)行車(chē)齡 (VIO) 已上升至 12.1 年,比 2020 年增加了近 2 個(gè)月”。如果您關(guān)注我的項(xiàng)目,您就會(huì)知道我開(kāi)的是一輛舊卡車(chē)(可能是彎道的那輛)。
你最近看到車(chē)價(jià)了嗎?現(xiàn)在比以往任何時(shí)候都更需要讓這輛卡車(chē)?yán)^續(xù)運(yùn)轉(zhuǎn)。我需要為我的檢查引擎燈亮起做好準(zhǔn)備。正如 Andreas Spiess 所說(shuō),“它也可能發(fā)生在你身上”。唯一的問(wèn)題是OBD-II CAN-BUS 開(kāi)發(fā)套件缺貨。
經(jīng)過(guò)進(jìn)一步研究,我們發(fā)現(xiàn)了具有藍(lán)牙連接功能的ELM 327 V1.5。這里的想法是將 Wio Terminal 無(wú)線(xiàn)連接到 ELM 327,這將允許我們連接到發(fā)動(dòng)機(jī)控制單元 (ECU)。我們對(duì)五個(gè)參數(shù)感興趣:
- 電池電壓
- 發(fā)動(dòng)機(jī)每分鐘轉(zhuǎn)數(shù) (RPM)
- 車(chē)輛速度
- 進(jìn)氣溫度
- 發(fā)動(dòng)機(jī)冷卻液溫度
第一個(gè)可以通過(guò)僅連接到 ELM 327 來(lái)獲得,但其余參數(shù)需要連接到 ECU,這只能在我的卡車(chē)上發(fā)生,當(dāng)點(diǎn)火開(kāi)關(guān)打開(kāi)時(shí)。
這個(gè)項(xiàng)目將比其他類(lèi)似項(xiàng)目更側(cè)重于解釋代碼。開(kāi)始前要注意兩句話(huà):
- 在您了解汽車(chē)的反應(yīng)之前,請(qǐng)勿在駕駛時(shí)使用此項(xiàng)目。我的卡車(chē)不介意在 OBD2 端口插入一些東西,但其他汽車(chē)可能會(huì)。
- 我不得不通過(guò)替換 'm_semaphoreRegForNotifyEvt.wait("registerForNotify");' 來(lái)修改 BLERemoteCharacteristic.cpp 使用 'm_semaphoreRegForNotifyEvt.timedWait("registerForNotify", 1000);'。可能有更好的方法來(lái)避免卡在圖書(shū)館的這一行。
因此,請(qǐng)確保您首先訪(fǎng)問(wèn)該頁(yè)面。
我們通過(guò)準(zhǔn)備好按鈕來(lái)開(kāi)始設(shè)置。
pinMode(WIO_KEY_A, INPUT_PULLUP);
pinMode(WIO_KEY_B, INPUT_PULLUP);
pinMode(WIO_KEY_C, INPUT_PULLUP);
接下來(lái),我們?cè)O(shè)置顯示。
tft.init();
tft.setTextWrap(false);
tft.setTextSize(7);
tft.fillScreen(TFT_BLACK);
tft.setTextColor(TFT_BLUE);
tft.setCursor(40, 100);
tft.print("OBD2");
然后在開(kāi)始時(shí)播放音調(diào)。
for (int i = 1000; i <= 3000; i += 500)
{
tone(WIO_BUZZER, i);
delay(50);
noTone(WIO_BUZZER);
delay(50);
}
在這里,我們開(kāi)始掃描藍(lán)牙設(shè)備。我們引用一個(gè)回調(diào)函數(shù)來(lái)接收來(lái)自所選設(shè)備的數(shù)據(jù)。所選設(shè)備必須具有此處定義的通用唯一標(biāo)識(shí)符 (UUID) 的服務(wù)、讀取特性和寫(xiě)入特性。
BLEDevice::init("");
BLEScan *ThisBLEScan = BLEDevice::getScan();
ThisBLEScan->setAdvertisedDeviceCallbacks(new AdvertisedDeviceCB());
ThisBLEScan->setActiveScan(true);
ThisBLEScan->start(20);
BLEClient *ThisClient = BLEDevice::createClient();
ThisClient->connect(OBD2Device);
ThisService = ThisClient->getService((BLEUUID)0xfff0);
NotifyCharacteristic = ThisService->getCharacteristic((BLEUUID)0xfff1);
NotifyCharacteristic->registerForNotify(NotifyCB);
WriteCharacteristic = ThisService->getCharacteristic((BLEUUID)0xfff2);
?

現(xiàn)在我們連接到 ELM 327。我們使用AT 命令重置設(shè)備、關(guān)閉回聲和自動(dòng)選擇協(xié)議。接下來(lái),我們發(fā)送參數(shù) ID (PID)以確保我們已連接到 ECU。
WriteCharacteristic->writeValue("AT Z\r");
WriteCharacteristic->writeValue("AT E0\r");
WriteCharacteristic->writeValue("AT SP 0\r");
WriteCharacteristic->writeValue("01 00\r");
while (NewString.substring(0, 12) != "SEARCHING...")
yield();
while (NewString.length() > 0)
{
if (NewString.substring(0, 17) == "UNABLE TO CONNECT")
{
ItemsInArray = 1;
NewString = "";
}
tft.fillScreen(TFT_BLACK);
tft.setCursor(40, 100);
tft.print("OBD2");
delay(10);
}
NewScreen = ItemsInArray;
WriteCharacteristic->writeValue("AT I\r");
while (NewString == "")
yield();
tft.fillScreen(TFT_BLACK);
在設(shè)置中我們需要做的最后一件事是將中斷附加到按鈕上。
attachInterrupt(digitalPinToInterrupt(WIO_KEY_A), ScreenUp, FALLING);
attachInterrupt(digitalPinToInterrupt(WIO_KEY_B), ScreenHome, FALLING);
attachInterrupt(digitalPinToInterrupt(WIO_KEY_C), ScreenDown, FALLING);
我們必須在循環(huán)中確定是顯示所有參數(shù)還是僅顯示一個(gè)。
tft.setCursor(10, -30);
for (I = 0; I < ItemsInArray; I++)
{
if (OldScreen != NewScreen)
{
tft.fillScreen(TFT_BLACK);
OldScreen = NewScreen;
break;
}
if (NewScreen != ItemsInArray && NewScreen != I)
continue;
NewString = "";
WriteCharacteristic->writeValue(CommandArray[I]);
while (NewString == "")
yield();
}
在每個(gè)屏幕的底部,我們將以秒為單位顯示自開(kāi)始以來(lái)的時(shí)間。
tft.setTextSize(3);
tft.fillRect(0, 280, 240, 40, TFT_BLACK);
tft.setCursor(10, 280);
tft.setTextColor(TFT_BLUE);
tft.printf("%d", int(millis() / 1000));
為了使這段代碼正常工作,我們需要為每個(gè)按鈕定義一個(gè)函數(shù)。
void ScreenUp(void)
{
NewScreen--;
NewScreen = constrain(NewScreen, 0, ItemsInArray);
tone(WIO_BUZZER, 2500, 100);
}
void ScreenHome(void)
{
NewScreen = ItemsInArray;
tone(WIO_BUZZER, 2500, 100);
}
void ScreenDown(void)
{
NewScreen++;
NewScreen = constrain(NewScreen, 0, ItemsInArray);
tone(WIO_BUZZER, 2500, 100);
}
之前我們掃描了藍(lán)牙設(shè)備。類(lèi)似的項(xiàng)目使用設(shè)備 MAC 地址來(lái)選擇一個(gè)特定的 ELM 327,但我們希望我們的 Wio 終端無(wú)需硬編碼任何設(shè)備特定值即可工作。由于獲取設(shè)備名稱(chēng)并不容易,我們使用了所有 ELM 327 應(yīng)該通用的其他設(shè)備屬性。
class AdvertisedDeviceCB : public BLEAdvertisedDeviceCallbacks
{
void onResult(BLEAdvertisedDevice advertisedDevice)
{
if (advertisedDevice.haveServiceUUID() && !advertisedDevice.getAddressType() && advertisedDevice.getAppearance() == 576 && advertisedDevice.getServiceUUID().length() == 2)
{
BLEDevice::getScan()->stop();
OBD2Device = new BLEAdvertisedDevice(advertisedDevice);
}
}
};
最后但并非最不重要的一點(diǎn)是,在收到響應(yīng)時(shí)顯示值的函數(shù)。
static void NotifyCB(BLERemoteCharacteristic *pBLERemoteCharacteristic, uint8_t *pData, size_t length, bool isNotify)
{
NewString = (char *)pData;
NewString = NewString.substring(0, max(NewString.indexOf(">"), 0));
NewString.trim();
if (!NewString.length() || I == ItemsInArray)
return;
else
{
if (NewString.substring(0, 2) == "41")
{
unsigned long UnsignedLong = strtoul(NewString.substring(3, 5).c_str(), NULL, 16);
NewString = NewString.substring(6, NewString.length());
NewString.replace(" ", "");
switch (UnsignedLong)
{
case 0x0C:
UnsignedLong = strtoul(NewString.c_str(), NULL, 16) / 4;
break;
case 0x0D:
UnsignedLong = strtoul(NewString.c_str(), NULL, 16) * 0.621371;
break;
case 0x05:
case 0x0F:
UnsignedLong = (strtoul(NewString.c_str(), NULL, 16) - 40) * 9 / 5 + 32;
break;
default:
UnsignedLong = strtoul(NewString.c_str(), NULL, 16);
break;
}
NewString = String(UnsignedLong);
}
if (NewScreen == ItemsInArray)
{
tft.setTextSize(3);
tft.fillRect(0, tft.getCursorY() + 40, 240, 40, TFT_BLACK);
tft.setCursor(10, tft.getCursorY() + 40);
tft.setTextColor(TFT_GREEN);
tft.print(LabelArray[I]);
tft.setTextColor(TFT_RED);
tft.printf(" %s", NewString.c_str());
}
else
{
tft.setTextSize(7);
tft.setCursor(10, 10);
tft.setTextColor(TFT_GREEN);
tft.print(LabelArray[I]);
tft.fillRect(0, 100, 240, 50, TFT_BLACK);
tft.setCursor(10, 100);
tft.setTextColor(TFT_RED);
tft.printf("%s", NewString.c_str());
OldString = NewString;
}
delay(10);
}
}
?
- Seeed Wio終端開(kāi)源分享
- Lyapunov分形與Seeeduino Wio終端開(kāi)源
- 基于OBD2的儀表板
- 使用Seeeduino Wio終端模擬Dadiplus擲骰子
- ISO15765 OBD2 PID故障碼讀取 5次下載
- 在Wio終端上顯示精確的分貝計(jì) 0次下載
- 使用Wio終端擴(kuò)展Arduboy
- 用于維修ECU(Webasto等)的OBD2測(cè)試板
- 用于維修ECU的OBD2測(cè)試板
- OBD_CAN的讀取代碼程序下載 3次下載
- "PIC18F25K80芯片燒錄方案(汽車(chē)診斷儀OBD-II,OBD2,ELM327 V1.5)"
- OBD故障碼讀取和清除方法 87次下載
- OBD2輸出信息的9種診斷模式 108次下載
- 自我診斷OBD2的工作原理 98次下載
- OBD_CAN讀取代碼 68次下載
- MICROSAR Classic OBD方案概覽 456次閱讀
- RFID手持終端使用技巧 308次閱讀
- RFID手持終端功能介紹 299次閱讀
- 示波器如何讀取電壓值 6163次閱讀
- 汽車(chē)OBD是什么?OBD的應(yīng)用場(chǎng)景 1259次閱讀
- 車(chē)輛OBD是什么?全面了解OBD系統(tǒng) 2843次閱讀
- 無(wú)法讀取I2C地址的調(diào)試案例 2292次閱讀
- 帶你全面了解OBD系統(tǒng) 1618次閱讀
- 如何利用TinyML實(shí)現(xiàn)語(yǔ)音識(shí)別機(jī)器人車(chē)的設(shè)計(jì) 2325次閱讀
- 內(nèi)存是怎么讀取數(shù)據(jù)的 5522次閱讀
- 如何使用SFC1讀取PLC時(shí)間 6052次閱讀
- dfrobotDB9 OBD II連接線(xiàn)簡(jiǎn)介 2691次閱讀
- mpu6050對(duì)應(yīng)i2c地址是什么_如何讀取數(shù)據(jù) 2.4w次閱讀
- 分解OBD接口能到采集哪些具體的車(chē)輛數(shù)據(jù) 2.3w次閱讀
- 淺談汽車(chē)故障診斷OBD接口功用和引腳定義 10.2w次閱讀
下載排行
本周
- 1山景DSP芯片AP8248A2數(shù)據(jù)手冊(cè)
- 1.06 MB | 532次下載 | 免費(fèi)
- 2RK3399完整板原理圖(支持平板,盒子VR)
- 3.28 MB | 339次下載 | 免費(fèi)
- 3TC358743XBG評(píng)估板參考手冊(cè)
- 1.36 MB | 330次下載 | 免費(fèi)
- 4DFM軟件使用教程
- 0.84 MB | 295次下載 | 免費(fèi)
- 5元宇宙深度解析—未來(lái)的未來(lái)-風(fēng)口還是泡沫
- 6.40 MB | 227次下載 | 免費(fèi)
- 6迪文DGUS開(kāi)發(fā)指南
- 31.67 MB | 194次下載 | 免費(fèi)
- 7元宇宙底層硬件系列報(bào)告
- 13.42 MB | 182次下載 | 免費(fèi)
- 8FP5207XR-G1中文應(yīng)用手冊(cè)
- 1.09 MB | 178次下載 | 免費(fèi)
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 2555集成電路應(yīng)用800例(新編版)
- 0.00 MB | 33566次下載 | 免費(fèi)
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費(fèi)
- 4開(kāi)關(guān)電源設(shè)計(jì)實(shí)例指南
- 未知 | 21549次下載 | 免費(fèi)
- 5電氣工程師手冊(cè)免費(fèi)下載(新編第二版pdf電子書(shū))
- 0.00 MB | 15349次下載 | 免費(fèi)
- 6數(shù)字電路基礎(chǔ)pdf(下載)
- 未知 | 13750次下載 | 免費(fèi)
- 7電子制作實(shí)例集錦 下載
- 未知 | 8113次下載 | 免費(fèi)
- 8《LED驅(qū)動(dòng)電路設(shè)計(jì)》 溫德?tīng)栔?/a>
- 0.00 MB | 6656次下載 | 免費(fèi)
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費(fèi)
- 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
- 78.1 MB | 537798次下載 | 免費(fèi)
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420027次下載 | 免費(fèi)
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費(fèi)
- 6電路仿真軟件multisim 10.0免費(fèi)下載
- 340992 | 191187次下載 | 免費(fèi)
- 7十天學(xué)會(huì)AVR單片機(jī)與C語(yǔ)言視頻教程 下載
- 158M | 183279次下載 | 免費(fèi)
- 8proe5.0野火版下載(中文版免費(fèi)下載)
- 未知 | 138040次下載 | 免費(fèi)
評(píng)論