Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/double lilygo #101

Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions Software/src/battery/BATTERIES.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,4 +32,9 @@
#ifdef TEST_FAKE_BATTERY
#include "TEST-FAKE-BATTERY.h" //See this file for more Fake battery settings
#endif

#ifdef SERIAL_LINK_RECEIVER_FROM_BATTERY
#include "SERIAL-LINK-RECEIVER-FROM-BATTERY.h"
#endif

#endif
86 changes: 86 additions & 0 deletions Software/src/battery/SERIAL-LINK-RECEIVER-FROM-BATTERY.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
// SERIAL-LINK-RECEIVER-FROM-BATTERY.cpp

#include "SERIAL-LINK-RECEIVER-FROM-BATTERY.h"

#define INVERTER_SEND_NUM_VARIABLES 3 //--- comment out if nothing to send
#define INVERTER_RECV_NUM_VARIABLES 16

#ifdef INVERTER_SEND_NUM_VARIABLES
const uint8_t sendingNumVariables = INVERTER_SEND_NUM_VARIABLES;
#else
const uint8_t sendingNumVariables = 0;
#endif

// txid,rxid, num_send,num_recv
SerialDataLink dataLinkReceive(Serial2, 0, 0x01, sendingNumVariables,
INVERTER_RECV_NUM_VARIABLES); // ...




void __getData()
{
SOC = (uint16_t) dataLinkReceive.getReceivedData(0);
StateOfHealth = (uint16_t) dataLinkReceive.getReceivedData(1);
battery_voltage = (uint16_t) dataLinkReceive.getReceivedData(2);
battery_current = (uint16_t) dataLinkReceive.getReceivedData(3);
capacity_Wh = (uint16_t) dataLinkReceive.getReceivedData(4);
remaining_capacity_Wh = (uint16_t) dataLinkReceive.getReceivedData(5);
max_target_discharge_power = (uint16_t) dataLinkReceive.getReceivedData(6);
max_target_charge_power = (uint16_t) dataLinkReceive.getReceivedData(7);
bms_status = (uint16_t) dataLinkReceive.getReceivedData(8);
bms_char_dis_status = (uint16_t) dataLinkReceive.getReceivedData(9);
stat_batt_power = (uint16_t) dataLinkReceive.getReceivedData(10);
temperature_min = (uint16_t) dataLinkReceive.getReceivedData(11);
temperature_max = (uint16_t) dataLinkReceive.getReceivedData(12);
cell_max_voltage = (uint16_t) dataLinkReceive.getReceivedData(13);
cell_min_voltage = (uint16_t) dataLinkReceive.getReceivedData(14);
batteryAllowsContactorClosing = (uint16_t) dataLinkReceive.getReceivedData(15);
}

void updateData()
{
// --- update with fresh data
/*
dataLinkReceive.updateData(0,var1);
dataLinkReceive.updateData(1,var2);
dataLinkReceive.updateData(2,var3);
*/
}


/*
* @ 9600bps, assume void manageSerialLinkReceiver()
* is called every 1mS
*/

void manageSerialLinkReceiver()
{
dataLinkReceive.run();
bool readError = dataLinkReceive.checkReadError(true); // check for error & clear error flag
if (dataLinkReceive.checkNewData(true)) // true = clear Flag
{
__getData();
}



#ifdef INVERTER_SEND_NUM_VARIABLES
static bool initLink=false;
static unsigned long updateTime = 0;
if (! initLink)
{
initLink = true;
// sends variables every 5000mS even if no change
dataLinkReceive.setUpdateInterval(5000);
}
unsigned long currentTime = millis();
if (currentTime - updateTime > 100)
{
updateTime = currentTime;
dataLinkReceive.run();
bool sendError = dataLinkReceive.checkTransmissionError(true); // check for error & clear error flag
updateData();
}
#endif
}
51 changes: 51 additions & 0 deletions Software/src/battery/SERIAL-LINK-RECEIVER-FROM-BATTERY.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
// SERIAL-LINK-RECEIVER-FROM-BATTERY.h

#ifndef SERIAL_LINK_RECEIVER_FROM_BATTERY_H
#define SERIAL_LINK_RECEIVER_FROM_BATTERY_H

#include <Arduino.h>
#include "../../USER_SETTINGS.h"
#include "../lib/SerialDataLink/SerialDataLink.h"

// https://github.com/mackelec/SerialDataLink

#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 bool batteryAllowsContactorClosing; //Bool, 1=true, 0=false






void manageSerialLinkReceiver();










#endif
4 changes: 4 additions & 0 deletions Software/src/inverter/INVERTERS.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,4 +29,8 @@
#include "SOLAX-CAN.h"
#endif

#ifdef SERIAL_LINK_TRANSMITTER_INVERTER
#include "SERIAL-LINK-TRANSMITTER-INVERTER.h"
#endif

#endif
81 changes: 81 additions & 0 deletions Software/src/inverter/SERIAL-LINK-TRANSMITTER-INVERTER.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
//SERIAL-LINK-TRANSMITTER-INVERTER.cpp

#include "SERIAL-LINK-TRANSMITTER-INVERTER.h"

/*
* SerialDataLink
* txid=1, rxid=0 gives this the startup transmit priority_queue
* Will transmit max 16 int variable - receive none
*/

#define BATTERY_SEND_NUM_VARIABLES 16
#define BATTERY_RECV_NUM_VARIABLES 3 //--- comment out if nothing to receive

#ifdef BATTERY_RECV_NUM_VARIABLES
const uint8_t receivingNumVariables = BATTERY_RECV_NUM_VARIABLES;
#else
const uint8_t receivingNumVariables = 0;
#endif

// txid,rxid,num_tx,num_rx
SerialDataLink dataLinkTransmit(Serial2, 0x01, 0, BATTERY_SEND_NUM_VARIABLES,
receivingNumVariables );


void _getData()
{
/*
var1 = dataLinkTransmit.getReceivedData(0);
var2 = dataLinkTransmit.getReceivedData(1);
var3 = dataLinkTransmit.getReceivedData(2);
*/
}


void manageSerialLinkTransmitter()
{
static bool initLink=false;
static unsigned long updateTime = 0;

dataLinkTransmit.run();

#ifdef BATTERY_RECV_NUM_VARIABLES
bool readError = dataLinkTransmit.checkReadError(true); // check for error & clear error flag
if (dataLinkTransmit.checkNewData(true)) // true = clear Flag
{
_getData();
}
#endif

if (millis() - updateTime > 100)
{
updateTime = millis();
if (! initLink)
{
initLink = true;
// sends variables every 5000mS even if no change
dataLinkTransmit.setUpdateInterval(5000);
}
bool sendError = dataLinkTransmit.checkTransmissionError(true);
// todo some error management - LEDS etc

dataLinkTransmit.updateData(0,SOC);
dataLinkTransmit.updateData(1,StateOfHealth);
dataLinkTransmit.updateData(2,battery_voltage);
dataLinkTransmit.updateData(3,battery_current);
dataLinkTransmit.updateData(4,capacity_Wh);
dataLinkTransmit.updateData(5,remaining_capacity_Wh);
dataLinkTransmit.updateData(6,max_target_discharge_power);
dataLinkTransmit.updateData(7,max_target_charge_power);
dataLinkTransmit.updateData(8,bms_status);
dataLinkTransmit.updateData(9,bms_char_dis_status);
dataLinkTransmit.updateData(10,stat_batt_power);
dataLinkTransmit.updateData(11,temperature_min);
dataLinkTransmit.updateData(12,temperature_max);
dataLinkTransmit.updateData(13,cell_max_voltage);
dataLinkTransmit.updateData(14,cell_min_voltage);
dataLinkTransmit.updateData(15,batteryAllowsContactorClosing);
}


}
41 changes: 41 additions & 0 deletions Software/src/inverter/SERIAL-LINK-TRANSMITTER-INVERTER.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
//SERIAL-LINK-TRANSMITTER-INVERTER.h

#ifndef SERIAL_LINK_TRANSMITTER_INVERTER_H
#define SERIAL_LINK_TRANSMITTER_INVERTER_H


#include <Arduino.h>
#include "../../USER_SETTINGS.h"
#include "../lib/SerialDataLink/SerialDataLink.h"


// 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 bool batteryAllowsContactorClosing; //Bool, 1=true, 0=false



void manageSerialLinkTransmitter();








#endif
Loading