chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

電子發(fā)燒友App

硬聲App

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示
創(chuàng)作
電子發(fā)燒友網(wǎng)>電子資料下載>電子資料>使用Wio終端讀取OBD2

使用Wio終端讀取OBD2

2022-10-26 | zip | 0.19 MB | 次下載 | 免費

資料介紹

描述

根據(jù)研究公司IHS Markit的數(shù)據(jù),“今年美國輕型車輛的平均運行車齡 (VIO) 已上升至 12.1 年,比 2020 年增加了近 2 個月”。如果您關(guān)注我的項目,您就會知道我開的是一輛舊卡車(可能是彎道的那輛)。

你最近看到車價了嗎?現(xiàn)在比以往任何時候都更需要讓這輛卡車?yán)^續(xù)運轉(zhuǎn)。我需要為我的檢查引擎燈亮起做好準(zhǔn)備。正如 Andreas Spiess 所說,“它也可能發(fā)生在你身上”。唯一的問題是OBD-II CAN-BUS 開發(fā)套件缺貨。

經(jīng)過進(jìn)一步研究,我們發(fā)現(xiàn)了具有藍(lán)牙連接功能的ELM 327 V1.5。這里的想法是將 Wio Terminal 無線連接到 ELM 327,這將允許我們連接到發(fā)動機(jī)控制單元 (ECU)。我們對五個參數(shù)感興趣:

  • 電池電壓
  • 發(fā)動機(jī)每分鐘轉(zhuǎn)數(shù) (RPM)
  • 車輛速度
  • 進(jìn)氣溫度
  • 發(fā)動機(jī)冷卻液溫度

第一個可以通過僅連接到 ELM 327 來獲得,但其余參數(shù)需要連接到 ECU,這只能在我的卡車上發(fā)生,當(dāng)點火開關(guān)打開時。

這個項目將比其他類似項目更側(cè)重于解釋代碼。開始前要注意兩句話:

  • 在您了解汽車的反應(yīng)之前,請勿在駕駛時使用此項目。我的卡車不介意在 OBD2 端口插入一些東西,但其他汽車可能會。
  • 我不得不通過替換 'm_semaphoreRegForNotifyEvt.wait("registerForNotify");' 來修改 BLERemoteCharacteristic.cpp 使用 'm_semaphoreRegForNotifyEvt.timedWait("registerForNotify", 1000);'。可能有更好的方法來避免卡在圖書館的這一行。

因此,請確保您首先訪問該頁面。

我們通過準(zhǔn)備好按鈕來開始設(shè)置。

pinMode(WIO_KEY_A, INPUT_PULLUP);
pinMode(WIO_KEY_B, INPUT_PULLUP);
pinMode(WIO_KEY_C, INPUT_PULLUP);

接下來,我們設(shè)置顯示。

tft.init();
tft.setTextWrap(false);
tft.setTextSize(7);
tft.fillScreen(TFT_BLACK);
tft.setTextColor(TFT_BLUE);
tft.setCursor(40, 100);
tft.print("OBD2");

然后在開始時播放音調(diào)。

for (int i = 1000; i <= 3000; i += 500)
{
tone(WIO_BUZZER, i);
delay(50);
noTone(WIO_BUZZER);
delay(50);
}

在這里,我們開始掃描藍(lán)牙設(shè)備。我們引用一個回調(diào)函數(shù)來接收來自所選設(shè)備的數(shù)據(jù)。所選設(shè)備必須具有此處定義的通用唯一標(biāo)識符 (UUID) 的服務(wù)、讀取特性和寫入特性。

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);

?

poYBAGNYfo-Ac2zLAADPokovByE907.png
?

現(xiàn)在我們連接到 ELM 327。我們使用AT 命令重置設(shè)備、關(guān)閉回聲和自動選擇協(xié)議。接下來,我們發(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ù)還是僅顯示一個。

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();
}

在每個屏幕的底部,我們將以秒為單位顯示自開始以來的時間。

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));

為了使這段代碼正常工作,我們需要為每個按鈕定義一個函數(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è)備。類似的項目使用設(shè)備 MAC 地址來選擇一個特定的 ELM 327,但我們希望我們的 Wio 終端無需硬編碼任何設(shè)備特定值即可工作。由于獲取設(shè)備名稱并不容易,我們使用了所有 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);
}
}
};

最后但并非最不重要的一點是,在收到響應(yīng)時顯示值的函數(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);
}
}
?

?


下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評論

查看更多

下載排行

本周

  1. 1NS1081/NS1081S/NS1081Q USB 3.0閃存數(shù)據(jù)手冊
  2. 0.40 MB   |  4次下載  |  2 積分
  3. 2光伏并網(wǎng)逆變器原理
  4. 7.31 MB   |  3次下載  |  2 積分
  5. 3T20電烙鐵原理圖資料
  6. 0.27 MB   |  2次下載  |  免費
  7. 4PL83081 雙路恒流同步降壓轉(zhuǎn)換器技術(shù)手冊
  8. 3.34 MB   |  1次下載  |  免費
  9. 5PL88052 4.8V至60V輸入,5A,同步降壓轉(zhuǎn)換器技術(shù)手冊
  10. 3.36 MB   |  1次下載  |  免費
  11. 6LX8201微孔霧化驅(qū)動芯片電路圖資料
  12. 0.15 MB   |  1次下載  |  免費
  13. 7PC6200_7V直流電機(jī)驅(qū)動器技術(shù)手冊
  14. 0.47 MB   |  次下載  |  免費
  15. 8恒溫晶體振蕩器(OCXO)FOC-2D:20.6×20.6mm在通信基站和測試設(shè)備中的應(yīng)用參數(shù)規(guī)格
  16. 485.75 KB  |  次下載  |  免費

本月

  1. 1如何看懂電子電路圖
  2. 12.88 MB   |  329次下載  |  免費
  3. 2RK3588數(shù)據(jù)手冊
  4. 2.24 MB   |  14次下載  |  免費
  5. 3PC5502負(fù)載均流控制電路數(shù)據(jù)手冊
  6. 1.63 MB   |  12次下載  |  免費
  7. 4STM32F10x參考手冊資料
  8. 13.64 MB   |  12次下載  |  1 積分
  9. 5OAH0428 V1.0英文規(guī)格書
  10. 5.86 MB   |  8次下載  |  免費
  11. 6NS1081/NS1081S/NS1081Q USB 3.0閃存數(shù)據(jù)手冊
  12. 0.40 MB   |  4次下載  |  2 積分
  13. 7PID控制算法學(xué)習(xí)筆記資料
  14. 3.43 MB   |  3次下載  |  2 積分
  15. 8光伏并網(wǎng)逆變器原理
  16. 7.31 MB   |  3次下載  |  2 積分

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935132次下載  |  10 積分
  3. 2開源硬件-PMP21529.1-4 開關(guān)降壓/升壓雙向直流/直流轉(zhuǎn)換器 PCB layout 設(shè)計
  4. 1.48MB  |  420064次下載  |  10 積分
  5. 3Altium DXP2002下載入口
  6. 未知  |  233089次下載  |  10 積分
  7. 4電路仿真軟件multisim 10.0免費下載
  8. 340992  |  191415次下載  |  10 積分
  9. 5十天學(xué)會AVR單片機(jī)與C語言視頻教程 下載
  10. 158M  |  183349次下載  |  10 積分
  11. 6labview8.5下載
  12. 未知  |  81599次下載  |  10 積分
  13. 7Keil工具M(jìn)DK-Arm免費下載
  14. 0.02 MB  |  73818次下載  |  10 積分
  15. 8LabVIEW 8.6下載
  16. 未知  |  65990次下載  |  10 積分