Skip to content

Commit

Permalink
Add fake battery skeleton
Browse files Browse the repository at this point in the history
  • Loading branch information
dalathegreat committed Nov 12, 2023
1 parent 8bab9c5 commit 7767d39
Show file tree
Hide file tree
Showing 5 changed files with 143 additions and 0 deletions.
12 changes: 12 additions & 0 deletions Software/Software.ino
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions Software/USER_SETTINGS.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
3 changes: 3 additions & 0 deletions Software/src/battery/BATTERIES.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
81 changes: 81 additions & 0 deletions Software/src/battery/TEST-FAKE-BATTERY.cpp
Original file line number Diff line number Diff line change
@@ -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
}
}
46 changes: 46 additions & 0 deletions Software/src/battery/TEST-FAKE-BATTERY.h
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit 7767d39

Please sign in to comment.