Ioniq support

This commit is contained in:
Lubos Petrovic
2020-09-17 12:54:28 +02:00
parent ca25133026
commit a3c3c9c7ab
4 changed files with 351 additions and 171 deletions

View File

@@ -52,7 +52,7 @@ String commandQueueHyundaiIoniq[commandQueueCountHyundaiIoniq] = {
}; };
/** /**
* Init command queue Init command queue
*/ */
bool activateCommandQueueForHyundaiIoniq() { bool activateCommandQueueForHyundaiIoniq() {
@@ -78,17 +78,16 @@ bool activateCommandQueueForHyundaiIoniq() {
*/ */
bool parseRowMergedHyundaiIoniq() { bool parseRowMergedHyundaiIoniq() {
// IONIQ OK // VMCU 7e2
if (commandRequest.equals("2101")) { if (commandRequest.equals("2101")) {
params.speedKmh = hexToDec(responseRowMerged.substring(32, 36).c_str(), 2, false) * 0.0155; // / 100.0 *1.609 = real to gps is 1.750 params.speedKmh = hexToDec(responseRowMerged.substring(32, 36).c_str(), 2, false) * 0.0155; // / 100.0 *1.609 = real to gps is 1.750
} }
// IONIQ !!FAILED!! // VMCU 7e2
if (commandRequest.equals("2102")) { if (commandRequest.equals("2102")) {
params.auxPerc = hexToDec(responseRowMerged.substring(50, 52).c_str(), 1, false); params.auxPerc = hexToDec(responseRowMerged.substring(50, 52).c_str(), 1, false);
params.auxCurrentAmp = - hexToDec(responseRowMerged.substring(46, 50).c_str(), 2, true) / 1000.0; params.auxCurrentAmp = - hexToDec(responseRowMerged.substring(46, 50).c_str(), 2, true) / 1000.0;
} }
// Cluster module 7c6 // Cluster module 7c6
// IONIQ OK
if (commandRequest.equals("22B002")) { if (commandRequest.equals("22B002")) {
params.odoKm = float(strtol(responseRowMerged.substring(18, 24).c_str(), 0, 16)); params.odoKm = float(strtol(responseRowMerged.substring(18, 24).c_str(), 0, 16));
} }
@@ -106,28 +105,27 @@ bool parseRowMergedHyundaiIoniq() {
params.coolantTemp2C = (hexToDec(responseRowMerged.substring(16, 18).c_str(), 1, false) / 2) - 40; params.coolantTemp2C = (hexToDec(responseRowMerged.substring(16, 18).c_str(), 1, false) / 2) - 40;
} }
// BMS 7e4 // BMS 7e4
// IONIQ FAILED
if (commandRequest.equals("2101")) { if (commandRequest.equals("2101")) {
params.cumulativeEnergyChargedKWh = float(strtol(responseRowMerged.substring(82, 90).c_str(), 0, 16)) / 10.0; params.cumulativeEnergyChargedKWh = float(strtol(responseRowMerged.substring(80, 88).c_str(), 0, 16)) / 10.0;
if (params.cumulativeEnergyChargedKWhStart == -1) if (params.cumulativeEnergyChargedKWhStart == -1)
params.cumulativeEnergyChargedKWhStart = params.cumulativeEnergyChargedKWh; params.cumulativeEnergyChargedKWhStart = params.cumulativeEnergyChargedKWh;
params.cumulativeEnergyDischargedKWh = float(strtol(responseRowMerged.substring(90, 98).c_str(), 0, 16)) / 10.0; params.cumulativeEnergyDischargedKWh = float(strtol(responseRowMerged.substring(88, 96).c_str(), 0, 16)) / 10.0;
if (params.cumulativeEnergyDischargedKWhStart == -1) if (params.cumulativeEnergyDischargedKWhStart == -1)
params.cumulativeEnergyDischargedKWhStart = params.cumulativeEnergyDischargedKWh; params.cumulativeEnergyDischargedKWhStart = params.cumulativeEnergyDischargedKWh;
params.auxVoltage = hexToDec(responseRowMerged.substring(64, 66).c_str(), 2, true) / 10.0; params.auxVoltage = hexToDec(responseRowMerged.substring(62, 64).c_str(), 2, true) / 10.0;
params.batPowerAmp = - hexToDec(responseRowMerged.substring(26, 30).c_str(), 2, true) / 10.0; params.batPowerAmp = - hexToDec(responseRowMerged.substring(24, 28).c_str(), 2, true) / 10.0;
params.batVoltage = hexToDec(responseRowMerged.substring(30, 34).c_str(), 2, false) / 10.0; params.batVoltage = hexToDec(responseRowMerged.substring(28, 32).c_str(), 2, false) / 10.0;
params.batPowerKw = (params.batPowerAmp * params.batVoltage) / 1000.0; params.batPowerKw = (params.batPowerAmp * params.batVoltage) / 1000.0;
params.batPowerKwh100 = params.batPowerKw / params.speedKmh * 100; params.batPowerKwh100 = params.batPowerKw / params.speedKmh * 100;
params.batCellMaxV = hexToDec(responseRowMerged.substring(52, 54).c_str(), 1, false) / 50.0; params.batCellMaxV = hexToDec(responseRowMerged.substring(50, 52).c_str(), 1, false) / 50.0;
params.batCellMinV = hexToDec(responseRowMerged.substring(56, 58).c_str(), 1, false) / 50.0; params.batCellMinV = hexToDec(responseRowMerged.substring(54, 56).c_str(), 1, false) / 50.0;
params.batModule01TempC = hexToDec(responseRowMerged.substring(38, 40).c_str(), 1, true); params.batModule01TempC = hexToDec(responseRowMerged.substring(36, 38).c_str(), 1, true);
params.batModule02TempC = hexToDec(responseRowMerged.substring(40, 42).c_str(), 1, true); params.batModule02TempC = hexToDec(responseRowMerged.substring(38, 40).c_str(), 1, true);
params.batModule03TempC = hexToDec(responseRowMerged.substring(42, 44).c_str(), 1, true); params.batModule03TempC = hexToDec(responseRowMerged.substring(40, 42).c_str(), 1, true);
params.batModule04TempC = hexToDec(responseRowMerged.substring(44, 46).c_str(), 1, true); params.batModule04TempC = hexToDec(responseRowMerged.substring(42, 44).c_str(), 1, true);
//params.batTempC = hexToDec(responseRowMerged.substring(36, 38).c_str(), 1, true); //params.batTempC = hexToDec(responseRowMerged.substring(34, 36).c_str(), 1, true);
//params.batMaxC = hexToDec(responseRowMerged.substring(34, 36).c_str(), 1, true); //params.batMaxC = hexToDec(responseRowMerged.substring(32, 34).c_str(), 1, true);
//params.batMinC = hexToDec(responseRowMerged.substring(36, 38).c_str(), 1, true); //params.batMinC = hexToDec(responseRowMerged.substring(34, 36).c_str(), 1, true);
// This is more accurate than min/max from BMS. It's required to detect kona/eniro cold gates (min 15C is needed > 43kW charging, min 25C is needed > 58kW charging) // This is more accurate than min/max from BMS. It's required to detect kona/eniro cold gates (min 15C is needed > 43kW charging, min 25C is needed > 58kW charging)
params.batMinC = params.batMaxC = params.batModule01TempC; params.batMinC = params.batMaxC = params.batModule01TempC;
@@ -139,7 +137,7 @@ bool parseRowMergedHyundaiIoniq() {
params.batMaxC = (params.batModule04TempC > params.batMaxC) ? params.batModule04TempC : params.batMaxC; params.batMaxC = (params.batModule04TempC > params.batMaxC) ? params.batModule04TempC : params.batMaxC;
params.batTempC = params.batMinC; params.batTempC = params.batMinC;
params.batInletC = hexToDec(responseRowMerged.substring(50, 52).c_str(), 1, true); params.batInletC = hexToDec(responseRowMerged.substring(48, 50).c_str(), 1, true);
if (params.speedKmh < 15 && params.batPowerKw >= 1 && params.socPerc > 0 && params.socPerc <= 100) { if (params.speedKmh < 15 && params.batPowerKw >= 1 && params.socPerc > 0 && params.socPerc <= 100) {
params.chargingGraphKw[int(params.socPerc)] = params.batPowerKw; params.chargingGraphKw[int(params.socPerc)] = params.batPowerKw;
params.chargingGraphMinTempC[int(params.socPerc)] = params.batMinC; params.chargingGraphMinTempC[int(params.socPerc)] = params.batMinC;
@@ -147,31 +145,27 @@ bool parseRowMergedHyundaiIoniq() {
} }
} }
// BMS 7e4 // BMS 7e4
// IONIQ FAILED if (commandRequest.equals("2102") && responseRowMerged.substring(10, 12) == "FF") {
if (commandRequest.equals("2102") && responseRowMerged.substring(12, 14) == "FF") {
for (int i = 0; i < 32; i++) { for (int i = 0; i < 32; i++) {
params.cellVoltage[i] = hexToDec(responseRowMerged.substring(14 + (i * 2), 14 + (i * 2) + 2).c_str(), 1, false) / 50; params.cellVoltage[i] = hexToDec(responseRowMerged.substring(12 + (i * 2), 12 + (i * 2) + 2).c_str(), 1, false) / 50;
} }
} }
// BMS 7e4 // BMS 7e4
// IONIQ FAILED
if (commandRequest.equals("2103")) { if (commandRequest.equals("2103")) {
for (int i = 0; i < 32; i++) { for (int i = 0; i < 32; i++) {
params.cellVoltage[32 + i] = hexToDec(responseRowMerged.substring(14 + (i * 2), 14 + (i * 2) + 2).c_str(), 1, false) / 50; params.cellVoltage[32 + i] = hexToDec(responseRowMerged.substring(12 + (i * 2), 12 + (i * 2) + 2).c_str(), 1, false) / 50;
} }
} }
// BMS 7e4 // BMS 7e4
// IONIQ FAILED
if (commandRequest.equals("2104")) { if (commandRequest.equals("2104")) {
for (int i = 0; i < 32; i++) { for (int i = 0; i < 32; i++) {
params.cellVoltage[64 + i] = hexToDec(responseRowMerged.substring(14 + (i * 2), 14 + (i * 2) + 2).c_str(), 1, false) / 50; params.cellVoltage[64 + i] = hexToDec(responseRowMerged.substring(12 + (i * 2), 12 + (i * 2) + 2).c_str(), 1, false) / 50;
} }
} }
// BMS 7e4 // BMS 7e4
// IONIQ FAILED
if (commandRequest.equals("2105")) { if (commandRequest.equals("2105")) {
params.sohPerc = hexToDec(responseRowMerged.substring(56, 60).c_str(), 2, false) / 10.0; params.sohPerc = hexToDec(responseRowMerged.substring(54, 58).c_str(), 2, false) / 10.0;
params.socPerc = hexToDec(responseRowMerged.substring(68, 70).c_str(), 1, false) / 2.0; params.socPerc = hexToDec(responseRowMerged.substring(66, 68).c_str(), 1, false) / 2.0;
// Soc10ced table, record x0% CEC/CED table (ex. 90%->89%, 80%->79%) // Soc10ced table, record x0% CEC/CED table (ex. 90%->89%, 80%->79%)
if (oldParams.socPerc - params.socPerc > 0) { if (oldParams.socPerc - params.socPerc > 0) {
@@ -186,10 +180,10 @@ bool parseRowMergedHyundaiIoniq() {
params.soc10time[index] = time_now_epoch; params.soc10time[index] = time_now_epoch;
} }
} }
params.batHeaterC = hexToDec(responseRowMerged.substring(52, 54).c_str(), 1, true); params.batHeaterC = hexToDec(responseRowMerged.substring(50, 52).c_str(), 1, true);
// //
for (int i = 30; i < 32; i++) { // ai/aj position for (int i = 30; i < 32; i++) { // ai/aj position
params.cellVoltage[96 - 30 + i] = hexToDec(responseRowMerged.substring(14 + (i * 2), 14 + (i * 2) + 2).c_str(), 1, false) / 50; params.cellVoltage[96 - 30 + i] = -1;
} }
} }
// BMS 7e4 // BMS 7e4
@@ -212,3 +206,171 @@ bool parseRowMergedHyundaiIoniq() {
return true; return true;
} }
/**
Test data
*/
bool testDataHyundaiIoniq() {
// VMCU atsh7e2
// 2101
commandRequest = "2101";
//eniro = "6101FFF8000009285A3B0648030000B4179D763404080805000000";
responseRowMerged = "6101FFE0000009211222062F03000000001D7734";
parseRowMergedHyundaiIoniq();
// VMCU atsh7e2
// 2102
commandRequest = "2102";
//eniro = "6102F8FFFC000101000000840FBF83BD33270680953033757F59291C76000001010100000007000000";
responseRowMerged = "6102FF80000001010000009311AE8C9839640611887C3900000000";
parseRowMergedHyundaiIoniq();
// "atsh7df",
// 2106
//commandRequest = "2106";
//eniro = "6106FFFF800000000000000200001B001C001C000600060006000E000000010000000000000000013D013D013E013E00";
//parseRowMergedHyundaiIoniq();
// AIRCON / ACU atsh7b3
// 220100
commandRequest = "220100";
//eniro = "6201007E5027C8FF7F765D05B95AFFFF5AFF11FFFFFFFFFFFF6AFFFF2DF0757630FFFF00FFFF000000";
responseRowMerged = "6201007E5007C8FF8A876A011010FFFF10FF10FFFFFFFFFFFFFFFFFF2EEF767D00FFFF00FFFF000000";
parseRowMergedHyundaiIoniq();
// AIRCON / ACU atsh7b3
// 220102
commandRequest = "220102";
responseRowMerged = "620102FF800000A3950000000000002600000000";
parseRowMergedHyundaiIoniq();
// BMS atsh7e4
// 220101
commandRequest = "2101";
//eniro = "620101FFF7E7FFB3000000000300120F9B111011101011000014CC38CB3B00009100003A510000367C000015FB000013D3000690250D018E0000000003E8";
responseRowMerged = "6101FFFFFFFF5026482648A3FFC30D9E181717171718170019B50FB501000090000142230001425F0000771B00007486007815D809015C0000000003E800";
parseRowMergedHyundaiIoniq();
// BMS atsh7e4
// 220102
commandRequest = "2102";
// eniro = "620102FFFFFFFFCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBAAAA";
responseRowMerged = "6102FFFFFFFFB5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5000000";
parseRowMergedHyundaiIoniq();
// BMS atsh7e4
// 220103
commandRequest = "2103";
//eniro = "620103FFFFFFFFCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCACBCACACFCCCBCBCBCBCBCBCBCBAAAA";
responseRowMerged = "6103FFFFFFFFB5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5000000";
parseRowMergedHyundaiIoniq();
// BMS atsh7e4
// 220104
commandRequest = "2104";
//eniro = "620104FFFFFFFFCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBAAAA";
responseRowMerged = "6104FFFFFFFFB5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5000000";
parseRowMergedHyundaiIoniq();
// BMS atsh7e4
// 220105
commandRequest = "2105";
//eniro = "620105003fff9000000000000000000F8A86012B4946500101500DAC03E800000000AC0000C7C701000F00000000AAAA";
responseRowMerged = "6105FFFFFFFF00000000001717171817171726482648000150181703E81A03E801520029000000000000000000000000";
parseRowMergedHyundaiIoniq();
// BMS atsh7e4
// 220106
commandRequest = "2106";
//eniro = "620106FFFFFFFF14001A00240000003A7C86B4B30000000928EA00";
responseRowMerged = "7F2112"; // n/a on ioniq
parseRowMergedHyundaiIoniq();
// 22c002
//commandRequest = "22c002";
// eniro = "62C002FFFF0000D2E84E93D2E84EBBD2DBDACBD2E149F3AAAAAAAA";
//responseRowMerged = "";
//parseRowMergedHyundaiIoniq();
// BCM / TPMS atsh7a0
// 22c00b
commandRequest = "22c00b";
// eniro = "62C00BFFFF0000B93D0100B43E0100B43D0100BB3C0100AAAAAAAA";
responseRowMerged = "62C00BFFFF0000B9510100B9510100B84F0100B54F0100AAAAAAAA";
parseRowMergedHyundaiIoniq();
// atsh7c6
// 22b002
commandRequest = "22b002";
// eniro = "62B002E0000000FFB400330B0000000000000000";
responseRowMerged = "62B002E000000000AD003D2D0000000000000000";
parseRowMergedHyundaiIoniq();
/* params.batModule01TempC = 28;
params.batModule02TempC = 29;
params.batModule03TempC = 28;
params.batModule04TempC = 30;
//params.batTempC = hexToDec(responseRowMerged.substring(36, 38).c_str(), 1, true);
//params.batMaxC = hexToDec(responseRowMerged.substring(34, 36).c_str(), 1, true);
//params.batMinC = hexToDec(responseRowMerged.substring(36, 38).c_str(), 1, true);
// This is more accurate than min/max from BMS. It's required to detect kona/eniro cold gates (min 15C is needed > 43kW charging, min 25C is needed > 58kW charging)
params.batMinC = params.batMaxC = params.batModule01TempC;
params.batMinC = (params.batModule02TempC < params.batMinC) ? params.batModule02TempC : params.batMinC ;
params.batMinC = (params.batModule03TempC < params.batMinC) ? params.batModule03TempC : params.batMinC ;
params.batMinC = (params.batModule04TempC < params.batMinC) ? params.batModule04TempC : params.batMinC ;
params.batMaxC = (params.batModule02TempC > params.batMaxC) ? params.batModule02TempC : params.batMaxC ;
params.batMaxC = (params.batModule03TempC > params.batMaxC) ? params.batModule03TempC : params.batMaxC ;
params.batMaxC = (params.batModule04TempC > params.batMaxC) ? params.batModule04TempC : params.batMaxC ;
params.batTempC = params.batMinC;
//
params.soc10ced[10] = 2200;
params.soc10cec[10] = 2500;
params.soc10odo[10] = 13000;
params.soc10time[10] = 13000;
params.soc10ced[9] = params.soc10ced[10] + 6.4;
params.soc10cec[9] = params.soc10cec[10] + 0;
params.soc10odo[9] = params.soc10odo[10] + 30;
params.soc10time[9] = params.soc10time[10] + 900;
params.soc10ced[8] = params.soc10ced[9] + 6.8;
params.soc10cec[8] = params.soc10cec[9] + 0;
params.soc10odo[8] = params.soc10odo[9] + 30;
params.soc10time[8] = params.soc10time[9] + 900;
params.soc10ced[7] = params.soc10ced[8] + 7.2;
params.soc10cec[7] = params.soc10cec[8] + 0.6;
params.soc10odo[7] = params.soc10odo[8] + 30;
params.soc10time[7] = params.soc10time[8] + 900;
params.soc10ced[6] = params.soc10ced[7] + 6.7;
params.soc10cec[6] = params.soc10cec[7] + 0;
params.soc10odo[6] = params.soc10odo[7] + 30;
params.soc10time[6] = params.soc10time[7] + 900;
params.soc10ced[5] = params.soc10ced[6] + 6.7;
params.soc10cec[5] = params.soc10cec[6] + 0;
params.soc10odo[5] = params.soc10odo[6] + 30;
params.soc10time[5] = params.soc10time[6] + 900;
params.soc10ced[4] = params.soc10ced[5] + 6.4;
params.soc10cec[4] = params.soc10cec[5] + 0.3;
params.soc10odo[4] = params.soc10odo[5] + 30;
params.soc10time[4] = params.soc10time[5] + 900;
params.soc10ced[3] = params.soc10ced[4] + 6.4;
params.soc10cec[3] = params.soc10cec[4] + 0;
params.soc10odo[3] = params.soc10odo[4] + 30;
params.soc10time[3] = params.soc10time[4] + 900;
params.soc10ced[2] = params.soc10ced[3] + 5.4;
params.soc10cec[2] = params.soc10cec[3] + 0.1;
params.soc10odo[2] = params.soc10odo[3] + 30;
params.soc10time[2] = params.soc10time[3] + 900;
params.soc10ced[1] = params.soc10ced[2] + 6.2;
params.soc10cec[1] = params.soc10cec[2] + 0.1;
params.soc10odo[1] = params.soc10odo[2] + 30;
params.soc10time[1] = params.soc10time[2] + 900;
params.soc10ced[0] = params.soc10ced[1] + 2.9;
params.soc10cec[0] = params.soc10cec[1] + 0.5;
params.soc10odo[0] = params.soc10odo[1] + 15;
params.soc10time[0] = params.soc10time[1] + 900;
*/
return true;
}

View File

@@ -202,3 +202,144 @@ bool parseRowMergedKiaENiro() {
return true; return true;
} }
/**
* Test data
*/
bool testDataKiaENiro() {
// 2101
commandRequest = "2101";
responseRowMerged = "6101FFF8000009285A3B0648030000B4179D763404080805000000";
parseRowMergedKiaENiro();
// 2102
commandRequest = "2102";
responseRowMerged = "6102F8FFFC000101000000840FBF83BD33270680953033757F59291C76000001010100000007000000";
responseRowMerged = "6102F8FFFC000101000000931CC77F4C39040BE09BA7385D8158832175000001010100000007000000";
parseRowMergedKiaENiro();
// 2106
commandRequest = "2106";
responseRowMerged = "6106FFFF800000000000000200001B001C001C000600060006000E000000010000000000000000013D013D013E013E00";
parseRowMergedKiaENiro();
// 220100
commandRequest = "220100";
responseRowMerged = "6201007E5027C8FF7F765D05B95AFFFF5AFF11FFFFFFFFFFFF6AFFFF2DF0757630FFFF00FFFF000000";
responseRowMerged = "6201007E5027C8FF867C58121010FFFF10FF8EFFFFFFFFFFFF10FFFF0DF0617900FFFF01FFFF000000";
parseRowMergedKiaENiro();
// 220101
commandRequest = "220101";
responseRowMerged = "620101FFF7E7FF99000000000300B10EFE120F11100F12000018C438C30B00008400003864000035850000153A00001374000647010D017F0BDA0BDA03E8";
responseRowMerged = "620101FFF7E7FFB3000000000300120F9B111011101011000014CC38CB3B00009100003A510000367C000015FB000013D3000690250D018E0000000003E8";
parseRowMergedKiaENiro();
// 220102
commandRequest = "220102";
responseRowMerged = "620102FFFFFFFFCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBAAAA";
parseRowMergedKiaENiro();
// 220103
commandRequest = "220103";
responseRowMerged = "620103FFFFFFFFCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCACBCACACFCCCBCBCBCBCBCBCBCBAAAA";
parseRowMergedKiaENiro();
// 220104
commandRequest = "220104";
responseRowMerged = "620104FFFFFFFFCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBAAAA";
parseRowMergedKiaENiro();
// 220105
commandRequest = "220105";
responseRowMerged = "620105003fff9000000000000000000F8A86012B4946500101500DAC03E800000000AC0000C7C701000F00000000AAAA";
responseRowMerged = "620105003FFF90000000000000000014918E012927465000015013BB03E800000000BB0000CBCB01001300000000AAAA";
parseRowMergedKiaENiro();
// 220106
commandRequest = "220106";
responseRowMerged = "620106FFFFFFFF14001A00240000003A7C86B4B30000000928EA00";
parseRowMergedKiaENiro();
// 22c002
commandRequest = "22c002";
responseRowMerged = "62C002FFFF0000D2E84E93D2E84EBBD2DBDACBD2E149F3AAAAAAAA";
parseRowMergedKiaENiro();
// 22c00b
commandRequest = "22c00b";
responseRowMerged = "62C00BFFFF0000B93D0100B43E0100B43D0100BB3C0100AAAAAAAA";
parseRowMergedKiaENiro();
// 22b002
commandRequest = "22b002";
responseRowMerged = "62B002E0000000FFB400330B0000000000000000";
parseRowMergedKiaENiro();
params.batModule01TempC = 28;
params.batModule02TempC = 29;
params.batModule03TempC = 28;
params.batModule04TempC = 30;
//params.batTempC = hexToDec(responseRowMerged.substring(36, 38).c_str(), 1, true);
//params.batMaxC = hexToDec(responseRowMerged.substring(34, 36).c_str(), 1, true);
//params.batMinC = hexToDec(responseRowMerged.substring(36, 38).c_str(), 1, true);
// This is more accurate than min/max from BMS. It's required to detect kona/eniro cold gates (min 15C is needed > 43kW charging, min 25C is needed > 58kW charging)
params.batMinC = params.batMaxC = params.batModule01TempC;
params.batMinC = (params.batModule02TempC < params.batMinC) ? params.batModule02TempC : params.batMinC ;
params.batMinC = (params.batModule03TempC < params.batMinC) ? params.batModule03TempC : params.batMinC ;
params.batMinC = (params.batModule04TempC < params.batMinC) ? params.batModule04TempC : params.batMinC ;
params.batMaxC = (params.batModule02TempC > params.batMaxC) ? params.batModule02TempC : params.batMaxC ;
params.batMaxC = (params.batModule03TempC > params.batMaxC) ? params.batModule03TempC : params.batMaxC ;
params.batMaxC = (params.batModule04TempC > params.batMaxC) ? params.batModule04TempC : params.batMaxC ;
params.batTempC = params.batMinC;
//
params.soc10ced[10] = 2200;
params.soc10cec[10] = 2500;
params.soc10odo[10] = 13000;
params.soc10time[10] = 13000;
params.soc10ced[9] = params.soc10ced[10] + 6.4;
params.soc10cec[9] = params.soc10cec[10] + 0;
params.soc10odo[9] = params.soc10odo[10] + 30;
params.soc10time[9] = params.soc10time[10] + 900;
params.soc10ced[8] = params.soc10ced[9] + 6.8;
params.soc10cec[8] = params.soc10cec[9] + 0;
params.soc10odo[8] = params.soc10odo[9] + 30;
params.soc10time[8] = params.soc10time[9] + 900;
params.soc10ced[7] = params.soc10ced[8] + 7.2;
params.soc10cec[7] = params.soc10cec[8] + 0.6;
params.soc10odo[7] = params.soc10odo[8] + 30;
params.soc10time[7] = params.soc10time[8] + 900;
params.soc10ced[6] = params.soc10ced[7] + 6.7;
params.soc10cec[6] = params.soc10cec[7] + 0;
params.soc10odo[6] = params.soc10odo[7] + 30;
params.soc10time[6] = params.soc10time[7] + 900;
params.soc10ced[5] = params.soc10ced[6] + 6.7;
params.soc10cec[5] = params.soc10cec[6] + 0;
params.soc10odo[5] = params.soc10odo[6] + 30;
params.soc10time[5] = params.soc10time[6] + 900;
params.soc10ced[4] = params.soc10ced[5] + 6.4;
params.soc10cec[4] = params.soc10cec[5] + 0.3;
params.soc10odo[4] = params.soc10odo[5] + 30;
params.soc10time[4] = params.soc10time[5] + 900;
params.soc10ced[3] = params.soc10ced[4] + 6.4;
params.soc10cec[3] = params.soc10cec[4] + 0;
params.soc10odo[3] = params.soc10odo[4] + 30;
params.soc10time[3] = params.soc10time[4] + 900;
params.soc10ced[2] = params.soc10ced[3] + 5.4;
params.soc10cec[2] = params.soc10cec[3] + 0.1;
params.soc10odo[2] = params.soc10odo[3] + 30;
params.soc10time[2] = params.soc10time[3] + 900;
params.soc10ced[1] = params.soc10ced[2] + 6.2;
params.soc10cec[1] = params.soc10cec[2] + 0.1;
params.soc10odo[1] = params.soc10odo[2] + 30;
params.soc10time[1] = params.soc10time[2] + 900;
params.soc10ced[0] = params.soc10ced[1] + 2.9;
params.soc10cec[0] = params.soc10cec[1] + 0.5;
params.soc10odo[0] = params.soc10odo[1] + 15;
params.soc10time[0] = params.soc10time[1] + 900;
return true;
}

Binary file not shown.

View File

@@ -1,6 +1,6 @@
/* /*
KIA eNiro Dashboard 1.7, 2020-09-16 KIA eNiro Dashboard 1.7, 2020-09-17
!! working only with OBD BLE 4.0 adapters !! working only with OBD BLE 4.0 adapters
!! Supported adapter is Vgate ICar Pro (must be BLE4.0 version) !! Supported adapter is Vgate ICar Pro (must be BLE4.0 version)
!! Not working with standard BLUETOOTH 3 adapters !! Not working with standard BLUETOOTH 3 adapters
@@ -698,14 +698,16 @@ bool drawSceneBatteryCells(bool force) {
// Find min and max val // Find min and max val
float minVal = -1, maxVal = -1; float minVal = -1, maxVal = -1;
for (int i = 0; i < 98; i++) { for (int i = 0; i < 98; i++) {
if (params.cellVoltage[i] < minVal || minVal == -1) if ((params.cellVoltage[i] < minVal || minVal == -1) && params.cellVoltage[i] != -1)
minVal = params.cellVoltage[i]; minVal = params.cellVoltage[i];
if (params.cellVoltage[i] > maxVal || maxVal == -1) if ((params.cellVoltage[i] > maxVal || maxVal == -1) && params.cellVoltage[i] != -1)
maxVal = params.cellVoltage[i]; maxVal = params.cellVoltage[i];
} }
// Draw cell matrix // Draw cell matrix
for (int i = 0; i < 98; i++) { for (int i = 0; i < 98; i++) {
if (params.cellVoltage[i] == -1)
continue;
posx = ((i % 8) * 40) + 4; posx = ((i % 8) * 40) + 4;
posy = ((floor(i / 8)) * 13) + 68; posy = ((floor(i / 8)) * 13) + 68;
sprintf(tmpStr3, "%01.02f", params.cellVoltage[i]); sprintf(tmpStr3, "%01.02f", params.cellVoltage[i]);
@@ -1171,138 +1173,13 @@ bool testData() {
redrawScreen(true); redrawScreen(true);
// 2101 if (settings.carType == CAR_KIA_ENIRO_2020_64 || settings.carType == CAR_HYUNDAI_KONA_2020_64 ||
commandRequest = "2101"; settings.carType == CAR_KIA_ENIRO_2020_39 || settings.carType == CAR_HYUNDAI_KONA_2020_39) {
responseRowMerged = "6101FFF8000009285A3B0648030000B4179D763404080805000000"; testDataKiaENiro();
parseRowMerged(); }
if (settings.carType == CAR_HYUNDAI_IONIQ_2018) {
// 2102 testDataHyundaiIoniq();
commandRequest = "2102"; }
responseRowMerged = "6102F8FFFC000101000000840FBF83BD33270680953033757F59291C76000001010100000007000000";
responseRowMerged = "6102F8FFFC000101000000931CC77F4C39040BE09BA7385D8158832175000001010100000007000000";
parseRowMerged();
// 2106
commandRequest = "2106";
responseRowMerged = "6106FFFF800000000000000200001B001C001C000600060006000E000000010000000000000000013D013D013E013E00";
parseRowMerged();
// 220100
commandRequest = "220100";
responseRowMerged = "6201007E5027C8FF7F765D05B95AFFFF5AFF11FFFFFFFFFFFF6AFFFF2DF0757630FFFF00FFFF000000";
responseRowMerged = "6201007E5027C8FF867C58121010FFFF10FF8EFFFFFFFFFFFF10FFFF0DF0617900FFFF01FFFF000000";
parseRowMerged();
// 220101
commandRequest = "220101";
responseRowMerged = "620101FFF7E7FF99000000000300B10EFE120F11100F12000018C438C30B00008400003864000035850000153A00001374000647010D017F0BDA0BDA03E8";
responseRowMerged = "620101FFF7E7FFB3000000000300120F9B111011101011000014CC38CB3B00009100003A510000367C000015FB000013D3000690250D018E0000000003E8";
parseRowMerged();
// 220102
commandRequest = "220102";
responseRowMerged = "620102FFFFFFFFCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBAAAA";
parseRowMerged();
// 220103
commandRequest = "220103";
responseRowMerged = "620103FFFFFFFFCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCACBCACACFCCCBCBCBCBCBCBCBCBAAAA";
parseRowMerged();
// 220104
commandRequest = "220104";
responseRowMerged = "620104FFFFFFFFCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBAAAA";
parseRowMerged();
// 220105
commandRequest = "220105";
responseRowMerged = "620105003fff9000000000000000000F8A86012B4946500101500DAC03E800000000AC0000C7C701000F00000000AAAA";
responseRowMerged = "620105003FFF90000000000000000014918E012927465000015013BB03E800000000BB0000CBCB01001300000000AAAA";
parseRowMerged();
// 220106
commandRequest = "220106";
responseRowMerged = "620106FFFFFFFF14001A00240000003A7C86B4B30000000928EA00";
parseRowMerged();
// 22c002
commandRequest = "22c002";
responseRowMerged = "62C002FFFF0000D2E84E93D2E84EBBD2DBDACBD2E149F3AAAAAAAA";
parseRowMerged();
// 22c00b
commandRequest = "22c00b";
responseRowMerged = "62C00BFFFF0000B93D0100B43E0100B43D0100BB3C0100AAAAAAAA";
parseRowMerged();
// 22b002
commandRequest = "22b002";
responseRowMerged = "62B002E0000000FFB400330B0000000000000000";
parseRowMerged();
params.batModule01TempC = 28;
params.batModule02TempC = 29;
params.batModule03TempC = 28;
params.batModule04TempC = 30;
//params.batTempC = hexToDec(responseRowMerged.substring(36, 38).c_str(), 1, true);
//params.batMaxC = hexToDec(responseRowMerged.substring(34, 36).c_str(), 1, true);
//params.batMinC = hexToDec(responseRowMerged.substring(36, 38).c_str(), 1, true);
// This is more accurate than min/max from BMS. It's required to detect kona/eniro cold gates (min 15C is needed > 43kW charging, min 25C is needed > 58kW charging)
params.batMinC = params.batMaxC = params.batModule01TempC;
params.batMinC = (params.batModule02TempC < params.batMinC) ? params.batModule02TempC : params.batMinC ;
params.batMinC = (params.batModule03TempC < params.batMinC) ? params.batModule03TempC : params.batMinC ;
params.batMinC = (params.batModule04TempC < params.batMinC) ? params.batModule04TempC : params.batMinC ;
params.batMaxC = (params.batModule02TempC > params.batMaxC) ? params.batModule02TempC : params.batMaxC ;
params.batMaxC = (params.batModule03TempC > params.batMaxC) ? params.batModule03TempC : params.batMaxC ;
params.batMaxC = (params.batModule04TempC > params.batMaxC) ? params.batModule04TempC : params.batMaxC ;
params.batTempC = params.batMinC;
//
params.soc10ced[10] = 2200;
params.soc10cec[10] = 2500;
params.soc10odo[10] = 13000;
params.soc10time[10] = 13000;
params.soc10ced[9] = params.soc10ced[10] + 6.4;
params.soc10cec[9] = params.soc10cec[10] + 0;
params.soc10odo[9] = params.soc10odo[10] + 30;
params.soc10time[9] = params.soc10time[10] + 900;
params.soc10ced[8] = params.soc10ced[9] + 6.8;
params.soc10cec[8] = params.soc10cec[9] + 0;
params.soc10odo[8] = params.soc10odo[9] + 30;
params.soc10time[8] = params.soc10time[9] + 900;
params.soc10ced[7] = params.soc10ced[8] + 7.2;
params.soc10cec[7] = params.soc10cec[8] + 0.6;
params.soc10odo[7] = params.soc10odo[8] + 30;
params.soc10time[7] = params.soc10time[8] + 900;
params.soc10ced[6] = params.soc10ced[7] + 6.7;
params.soc10cec[6] = params.soc10cec[7] + 0;
params.soc10odo[6] = params.soc10odo[7] + 30;
params.soc10time[6] = params.soc10time[7] + 900;
params.soc10ced[5] = params.soc10ced[6] + 6.7;
params.soc10cec[5] = params.soc10cec[6] + 0;
params.soc10odo[5] = params.soc10odo[6] + 30;
params.soc10time[5] = params.soc10time[6] + 900;
params.soc10ced[4] = params.soc10ced[5] + 6.4;
params.soc10cec[4] = params.soc10cec[5] + 0.3;
params.soc10odo[4] = params.soc10odo[5] + 30;
params.soc10time[4] = params.soc10time[5] + 900;
params.soc10ced[3] = params.soc10ced[4] + 6.4;
params.soc10cec[3] = params.soc10cec[4] + 0;
params.soc10odo[3] = params.soc10odo[4] + 30;
params.soc10time[3] = params.soc10time[4] + 900;
params.soc10ced[2] = params.soc10ced[3] + 5.4;
params.soc10cec[2] = params.soc10cec[3] + 0.1;
params.soc10odo[2] = params.soc10odo[3] + 30;
params.soc10time[2] = params.soc10time[3] + 900;
params.soc10ced[1] = params.soc10ced[2] + 6.2;
params.soc10cec[1] = params.soc10cec[2] + 0.1;
params.soc10odo[1] = params.soc10odo[2] + 30;
params.soc10time[1] = params.soc10time[2] + 900;
params.soc10ced[0] = params.soc10ced[1] + 2.9;
params.soc10cec[0] = params.soc10cec[1] + 0.5;
params.soc10odo[0] = params.soc10odo[1] + 15;
params.soc10time[0] = params.soc10time[1] + 900;
redrawScreen(false); redrawScreen(false);
return true; return true;
@@ -1619,7 +1496,7 @@ void setup(void) {
pBLEScan->setActiveScan(true); pBLEScan->setActiveScan(true);
// Skip BLE scan if middle button pressed // Skip BLE scan if middle button pressed
if (digitalRead(BUTTON_MIDDLE) == HIGH) { if (digitalRead(BUTTON_MIDDLE) == HIGH && digitalRead(BUTTON_RIGHT) == HIGH) {
startBleScan(); startBleScan();
} }