Add fake battery skeleton

This commit is contained in:
Daniel 2023-11-13 00:13:00 +02:00
parent 8bab9c5386
commit 7767d39782
5 changed files with 143 additions and 0 deletions

View file

@ -286,6 +286,9 @@ void inform_user_on_battery() {
#ifdef TESLA_MODEL_3_BATTERY
Serial.println("Tesla Model 3 battery selected");
#endif
#ifdef TEST_FAKE_BATTERY
Serial.println("Test mode with fake battery selected");
#endif
}
// Functions
@ -316,6 +319,9 @@ void receive_can() { // This section checks if we have a complete CAN message i
#endif
#ifdef TESLA_MODEL_3_BATTERY
receive_can_tesla_model_3_battery(rx_frame);
#endif
#ifdef TEST_FAKE_BATTERY
receive_can_test_battery(rx_frame);
#endif
// Inverter
#ifdef BYD_CAN
@ -373,6 +379,9 @@ void send_can() {
#ifdef TESLA_MODEL_3_BATTERY
send_can_tesla_model_3_battery();
#endif
#ifdef TEST_FAKE_BATTERY
send_can_test_battery();
#endif
}
#ifdef DUAL_CAN
@ -562,6 +571,9 @@ void update_values() {
#endif
#ifdef TESLA_MODEL_3_BATTERY
update_values_tesla_model_3_battery(); // Map the values to the correct registers
#endif
#ifdef TEST_FAKE_BATTERY
update_values_test_battery(); // Map the fake values to the correct registers
#endif
// Inverter
#ifdef BYD_CAN

View file

@ -13,6 +13,7 @@
//#define NISSAN_LEAF_BATTERY
//#define RENAULT_ZOE_BATTERY
//#define TESLA_MODEL_3_BATTERY
//#define TEST_FAKE_BATTERY
/* Select inverter communication protocol. See Wiki for which to use with your inverter: https://github.com/dalathegreat/BYD-Battery-Emulator-For-Gen24/wiki */
//#define BYD_CAN //Enable this line to emulate a "BYD Battery-Box Premium HVS" over CAN Bus

View file

@ -29,4 +29,7 @@
#include "TESLA-MODEL-3-BATTERY.h" //See this file for more Tesla battery settings
#endif
#ifdef TEST_FAKE_BATTERY
#include "TEST-FAKE-BATTERY.h" //See this file for more Fake battery settings
#endif
#endif

View file

@ -0,0 +1,81 @@
#include "TEST-FAKE-BATTERY.h"
#include "../lib/miwagner-ESP32-Arduino-CAN/CAN_config.h"
#include "../lib/miwagner-ESP32-Arduino-CAN/ESP32CAN.h"
/* Do not change code below unless you are sure what you are doing */
static unsigned long previousMillis10 = 0; // will store last time a 10ms CAN Message was send
static unsigned long previousMillis100 = 0; // will store last time a 100ms CAN Message was send
static unsigned long previousMillis10s = 0; // will store last time a 1s CAN Message was send
static const int interval10 = 10; // interval (ms) at which send CAN Messages
static const int interval100 = 100; // interval (ms) at which send CAN Messages
static const int interval10s = 10000; // interval (ms) at which send CAN Messages
void print_units(char* header, int value, char* units) {
Serial.print(header);
Serial.print(value);
Serial.print(units);
}
void update_values_test_battery() { /* This function puts fake values onto the parameters sent towards the inverter */
bms_status = ACTIVE; //Always be in Active mode
LEDcolor = GREEN;
SOC = 5000; // 50.00%
StateOfHealth = 9900; // 99.00%
battery_voltage = 3700; // 370.0V
battery_current = 0; // 0 A
capacity_Wh = 30000; // 30kWh
remaining_capacity_Wh = 15000; // 15kWh
cell_max_voltage = 3750;
cell_min_voltage = 3730;
stat_batt_power = 0; // 0W
temperature_min = 50; // 5.0*C
temperature_max = 60; // 6.0*C
max_target_discharge_power = 5000; // 5kW
max_target_charge_power = 5000; // 5kW
/*Finally print out values to serial if configured to do so*/
#ifdef DEBUG_VIA_USB
Serial.println("FAKE Values going to inverter");
print_units("SOH%: ", (StateOfHealth * 0.01), "% ");
print_units(", SOC%: ", (SOC * 0.01), "% ");
print_units(", Voltage: ", (battery_voltage * 0.1), "V ");
print_units(", Max discharge power: ", max_target_discharge_power, "W ");
print_units(", Max charge power: ", max_target_charge_power, "W ");
print_units(", Max temp: ", (temperature_max * 0.1), "°C ");
print_units(", Min temp: ", (temperature_min * 0.1), "°C ");
print_units(", Max cell voltage: ", cell_max_voltage, "mV ");
print_units(", Min cell voltage: ", cell_min_voltage, "mV ");
Serial.println("");
#endif
}
void receive_can_test_battery(CAN_frame_t rx_frame) {
switch (rx_frame.MsgID) {
case 0xABC:
break;
default:
break;
}
}
void send_can_test_battery() {
unsigned long currentMillis = millis();
// Send 100ms CAN Message
if (currentMillis - previousMillis100 >= interval100) {
previousMillis100 = currentMillis;
// Put fake messages here incase you want to test sending CAN
}
}

View file

@ -0,0 +1,46 @@
#ifndef TEST_FAKE_BATTERY_H
#define TEST_FAKE_BATTERY_H
#include <Arduino.h>
#include "../../USER_SETTINGS.h"
#include "../lib/miwagner-ESP32-Arduino-CAN/ESP32CAN.h"
#define ABSOLUTE_MAX_VOLTAGE \
4040 // 404.4V,if battery voltage goes over this, charging is not possible (goes into forced discharge)
#define ABSOLUTE_MIN_VOLTAGE 3100 // 310.0V if battery voltage goes under this, discharging further is disabled
// These parameters need to be mapped for the inverter
extern uint16_t SOC; //SOC%, 0-100.00 (0-10000)
extern uint16_t StateOfHealth; //SOH%, 0-100.00 (0-10000)
extern uint16_t battery_voltage; //V+1, 0-500.0 (0-5000)
extern uint16_t battery_current; //A+1, Goes thru convert2unsignedint16 function (5.0A = 50, -5.0A = 65485)
extern uint16_t capacity_Wh; //Wh, 0-60000
extern uint16_t remaining_capacity_Wh; //Wh, 0-60000
extern uint16_t max_target_discharge_power; //W, 0-60000
extern uint16_t max_target_charge_power; //W, 0-60000
extern uint16_t bms_status; //Enum, 0-5
extern uint16_t bms_char_dis_status; //Enum, 0-2
extern uint16_t stat_batt_power; //W, Goes thru convert2unsignedint16 function (5W = 5, -5W = 65530)
extern uint16_t temperature_min; //C+1, Goes thru convert2unsignedint16 function (15.0C = 150, -15.0C = 65385)
extern uint16_t temperature_max; //C+1, Goes thru convert2unsignedint16 function (15.0C = 150, -15.0C = 65385)
extern uint16_t cell_max_voltage; //mV, 0-4350
extern uint16_t cell_min_voltage; //mV, 0-4350
extern uint8_t batteryAllowsContactorClosing; //Bool, 1=true, 0=false
extern uint8_t LEDcolor; //Enum, 0-2
// Definitions for bms_status
#define STANDBY 0
#define INACTIVE 1
#define DARKSTART 2
#define ACTIVE 3
#define FAULT 4
#define UPDATING 5
// LED colors
#define GREEN 0
#define YELLOW 1
#define RED 2
#define BLUE 3
void update_values_test_battery();
void receive_can_test_battery(CAN_frame_t rx_frame);
void send_can_test_battery();
#endif