From 6f717841a060369faff19bfddaed5df6eb7b17c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20=C3=96ster?= Date: Mon, 3 Feb 2025 22:14:02 +0200 Subject: [PATCH 1/3] Add 10 temperature sensors to datalayer --- Software/src/battery/BYD-ATTO-3-BATTERY.cpp | 10 ++++++++++ Software/src/datalayer/datalayer_extended.h | 4 +++- .../src/devboard/webserver/advanced_battery_html.cpp | 10 ++++++++++ 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/Software/src/battery/BYD-ATTO-3-BATTERY.cpp b/Software/src/battery/BYD-ATTO-3-BATTERY.cpp index 5c37a74f..50912d1d 100644 --- a/Software/src/battery/BYD-ATTO-3-BATTERY.cpp +++ b/Software/src/battery/BYD-ATTO-3-BATTERY.cpp @@ -147,6 +147,16 @@ void update_values_battery() { //This function maps all the values fetched via datalayer_extended.bydAtto3.SOC_polled = BMS_SOC; datalayer_extended.bydAtto3.voltage_periodic = battery_voltage; datalayer_extended.bydAtto3.voltage_polled = BMS_voltage; + datalayer_extended.bydAtto3.battery_temperatures[0] = battery_daughterboard_temperatures[0]; + datalayer_extended.bydAtto3.battery_temperatures[1] = battery_daughterboard_temperatures[1]; + datalayer_extended.bydAtto3.battery_temperatures[2] = battery_daughterboard_temperatures[2]; + datalayer_extended.bydAtto3.battery_temperatures[3] = battery_daughterboard_temperatures[3]; + datalayer_extended.bydAtto3.battery_temperatures[4] = battery_daughterboard_temperatures[4]; + datalayer_extended.bydAtto3.battery_temperatures[5] = battery_daughterboard_temperatures[5]; + datalayer_extended.bydAtto3.battery_temperatures[6] = battery_daughterboard_temperatures[6]; + datalayer_extended.bydAtto3.battery_temperatures[7] = battery_daughterboard_temperatures[7]; + datalayer_extended.bydAtto3.battery_temperatures[8] = battery_daughterboard_temperatures[8]; + datalayer_extended.bydAtto3.battery_temperatures[9] = battery_daughterboard_temperatures[9]; } void handle_incoming_can_frame_battery(CAN_frame rx_frame) { diff --git a/Software/src/datalayer/datalayer_extended.h b/Software/src/datalayer/datalayer_extended.h index 9b6b1649..5d5802d6 100644 --- a/Software/src/datalayer/datalayer_extended.h +++ b/Software/src/datalayer/datalayer_extended.h @@ -181,7 +181,9 @@ typedef struct { /** uint16_t */ /** Voltage polled OBD2*/ uint16_t voltage_polled = 0; - + /** int16_t */ + /** All the temperature sensors inside the battery pack*/ + int16_t battery_temperatures[10]; } DATALAYER_INFO_BYDATTO3; typedef struct { diff --git a/Software/src/devboard/webserver/advanced_battery_html.cpp b/Software/src/devboard/webserver/advanced_battery_html.cpp index 683f8ae9..29bdfeb5 100644 --- a/Software/src/devboard/webserver/advanced_battery_html.cpp +++ b/Software/src/devboard/webserver/advanced_battery_html.cpp @@ -469,6 +469,16 @@ String advanced_battery_processor(const String& var) { content += "

SOC OBD2: " + String(datalayer_extended.bydAtto3.SOC_polled) + "

"; content += "

Voltage periodic: " + String(datalayer_extended.bydAtto3.voltage_periodic) + "

"; content += "

Voltage OBD2: " + String(datalayer_extended.bydAtto3.voltage_polled) + "

"; + content += "

Temperature sensor 1: " + String(datalayer_extended.bydAtto3.battery_temperatures[0]) + "

"; + content += "

Temperature sensor 2: " + String(datalayer_extended.bydAtto3.battery_temperatures[1]) + "

"; + content += "

Temperature sensor 3: " + String(datalayer_extended.bydAtto3.battery_temperatures[2]) + "

"; + content += "

Temperature sensor 4: " + String(datalayer_extended.bydAtto3.battery_temperatures[3]) + "

"; + content += "

Temperature sensor 5: " + String(datalayer_extended.bydAtto3.battery_temperatures[4]) + "

"; + content += "

Temperature sensor 6: " + String(datalayer_extended.bydAtto3.battery_temperatures[5]) + "

"; + content += "

Temperature sensor 7: " + String(datalayer_extended.bydAtto3.battery_temperatures[6]) + "

"; + content += "

Temperature sensor 8: " + String(datalayer_extended.bydAtto3.battery_temperatures[7]) + "

"; + content += "

Temperature sensor 9: " + String(datalayer_extended.bydAtto3.battery_temperatures[8]) + "

"; + content += "

Temperature sensor 10: " + String(datalayer_extended.bydAtto3.battery_temperatures[9]) + "

"; #endif //BYD_ATTO_3_BATTERY #ifdef TESLA_BATTERY From 0ba4f9e84b276579d5b65f288cbbb18b16adfb2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20=C3=96ster?= Date: Tue, 4 Feb 2025 22:16:08 +0200 Subject: [PATCH 2/3] Add way to omit broken temperature sensor --- Software/src/battery/BYD-ATTO-3-BATTERY.cpp | 25 +++++++++++++++++++-- Software/src/battery/BYD-ATTO-3-BATTERY.h | 2 ++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/Software/src/battery/BYD-ATTO-3-BATTERY.cpp b/Software/src/battery/BYD-ATTO-3-BATTERY.cpp index 50912d1d..29edecb3 100644 --- a/Software/src/battery/BYD-ATTO-3-BATTERY.cpp +++ b/Software/src/battery/BYD-ATTO-3-BATTERY.cpp @@ -135,9 +135,30 @@ void update_values_battery() { //This function maps all the values fetched via datalayer.battery.status.cell_min_voltage_mV = BMS_lowest_cell_voltage_mV; - datalayer.battery.status.temperature_min_dC = BMS_lowest_cell_temperature * 10; // Add decimals + // Initialize min and max variables for temperature calculation + battery_calc_min_temperature = battery_daughterboard_temperatures[0]; + battery_calc_max_temperature = battery_daughterboard_temperatures[0]; - datalayer.battery.status.temperature_max_dC = BMS_highest_cell_temperature * 10; + // Loop through the array of 10x daughterboard temps to find the smallest and largest values + // Note, it is possible for user to skip using a faulty sensor in the .h file + if (SKIP_TEMPERATURE_SENSOR_NUMBER == 1) { //If sensor 1 is skipped, init minmax to sensor 2 + battery_calc_min_temperature = battery_daughterboard_temperatures[1]; + battery_calc_max_temperature = battery_daughterboard_temperatures[1]; + } + for (int i = 1; i < 10; i++) { + if (i == SKIP_TEMPERATURE_SENSOR_NUMBER) { + i++; + } + if (battery_daughterboard_temperatures[i] < battery_calc_min_temperature) { + battery_calc_min_temperature = battery_daughterboard_temperatures[i]; + } + if (battery_daughterboard_temperatures[i] > battery_calc_max_temperature) { + battery_calc_max_temperature = battery_daughterboard_temperatures[i]; + } + } + //Write the result to datalayer + datalayer.battery.status.temperature_min_dC = battery_calc_min_temperature * 10; + datalayer.battery.status.temperature_max_dC = battery_calc_max_temperature * 10; // Update webserver datalayer datalayer_extended.bydAtto3.SOC_method = SOC_method; diff --git a/Software/src/battery/BYD-ATTO-3-BATTERY.h b/Software/src/battery/BYD-ATTO-3-BATTERY.h index 57f943ff..144765a8 100644 --- a/Software/src/battery/BYD-ATTO-3-BATTERY.h +++ b/Software/src/battery/BYD-ATTO-3-BATTERY.h @@ -8,6 +8,8 @@ #define MAXPOWER_CHARGE_W 10000 #define MAXPOWER_DISCHARGE_W 10000 +#define SKIP_TEMPERATURE_SENSOR_NUMBER 0 // Enter incase one of your temperature sensors are broken (1-10) + /* Do not modify the rows below */ #define BATTERY_SELECTED #define MAX_PACK_VOLTAGE_DV 4410 //5000 = 500.0V From 9eed56f7a5ce5f8f23e41b5aa3b7c5d63c7b64a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20=C3=96ster?= Date: Wed, 5 Feb 2025 23:18:33 +0200 Subject: [PATCH 3/3] Fix off by one index --- Software/src/battery/BYD-ATTO-3-BATTERY.cpp | 7 ++++++- Software/src/battery/BYD-ATTO-3-BATTERY.h | 4 +++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/Software/src/battery/BYD-ATTO-3-BATTERY.cpp b/Software/src/battery/BYD-ATTO-3-BATTERY.cpp index 29edecb3..0e855925 100644 --- a/Software/src/battery/BYD-ATTO-3-BATTERY.cpp +++ b/Software/src/battery/BYD-ATTO-3-BATTERY.cpp @@ -135,6 +135,7 @@ void update_values_battery() { //This function maps all the values fetched via datalayer.battery.status.cell_min_voltage_mV = BMS_lowest_cell_voltage_mV; +#ifdef SKIP_TEMPERATURE_SENSOR_NUMBER // Initialize min and max variables for temperature calculation battery_calc_min_temperature = battery_daughterboard_temperatures[0]; battery_calc_max_temperature = battery_daughterboard_temperatures[0]; @@ -146,7 +147,7 @@ void update_values_battery() { //This function maps all the values fetched via battery_calc_max_temperature = battery_daughterboard_temperatures[1]; } for (int i = 1; i < 10; i++) { - if (i == SKIP_TEMPERATURE_SENSOR_NUMBER) { + if (i == (SKIP_TEMPERATURE_SENSOR_NUMBER - 1)) { i++; } if (battery_daughterboard_temperatures[i] < battery_calc_min_temperature) { @@ -159,6 +160,10 @@ void update_values_battery() { //This function maps all the values fetched via //Write the result to datalayer datalayer.battery.status.temperature_min_dC = battery_calc_min_temperature * 10; datalayer.battery.status.temperature_max_dC = battery_calc_max_temperature * 10; +#else //User does not need filtering out a broken sensor, just use the min-max the BMS sends + datalayer.battery.status.temperature_min_dC = BMS_lowest_cell_temperature * 10; + datalayer.battery.status.temperature_max_dC = BMS_highest_cell_temperature * 10; +#endif //!SKIP_TEMPERATURE_SENSOR_NUMBER // Update webserver datalayer datalayer_extended.bydAtto3.SOC_method = SOC_method; diff --git a/Software/src/battery/BYD-ATTO-3-BATTERY.h b/Software/src/battery/BYD-ATTO-3-BATTERY.h index 144765a8..f726ebc6 100644 --- a/Software/src/battery/BYD-ATTO-3-BATTERY.h +++ b/Software/src/battery/BYD-ATTO-3-BATTERY.h @@ -8,7 +8,9 @@ #define MAXPOWER_CHARGE_W 10000 #define MAXPOWER_DISCHARGE_W 10000 -#define SKIP_TEMPERATURE_SENSOR_NUMBER 0 // Enter incase one of your temperature sensors are broken (1-10) +//Uncomment and configure this line, if you want to filter out a broken temperature sensor (1-10) +//Make sure you understand risks associated with disabling. Values can be read via "More Battery info" +//#define SKIP_TEMPERATURE_SENSOR_NUMBER 1 /* Do not modify the rows below */ #define BATTERY_SELECTED