Deye Hybrid Angebote Deye Zubehör Produkte
Hallo liebes Forum,
ich habe ein DIY Projekt gestartet, um einen eigenen Heimspeicher aus Tesla Batterien zu entwickeln. Dafür habe ich 8 Tesla Model S Module gekauft und deren Temperatur und Spannungswerte über einen Arduino ausgelesen ( https://github.com/collin80/TeslaBMS).
Die Module habe ich seriell verschaltet (175 V) und an den DEYE SUN 50K-SG01 HP3-EU-BM4 Hybrid-Wechselrichter (50KW) angeschlossen. Um das BMS an den Wechselrichter anzuschließen, habe ich einen CAN Tranceiver an den Arduino Due angeschlossen (SN65HVD230) und will dann über das CAN Protokoll am BMS1 die Kommunikation herstellen.
Hier ist der Code, den ich verwende:
#include <due_can.h> // For the Arduino Due built-in CAN controller
void setup() {
Serial.begin(9600);
// Initialize CAN0 at 500 kbps
if (!Can0.begin(CAN_BPS_500K)) {
Serial.println(„Starting CAN0 failed!“);
while (1);
}
// Configure CAN0 for sending
Can0.setNumTXBoxes(3); // Allocate 3 mailboxes for transmitting
Serial.println(„CAN0 initialized successfully!“);
}
void loop() {
// Example battery data (replace with actual values):
float voltage = 180.0; // Battery voltage in volts
int soc = 80; // State of Charge in %
float temperature = 25.0; // Temperature in Celsius
float chargeLimit = 50.0; // Max charge current in amps
float dischargeLimit = 60.0; // Max discharge current in amps
// Convert data to protocol resolution:
int16_t voltageData = voltage * 10; // 0.1 V resolution
uint8_t socByte = map(soc, 0, 100, 0, 255); // 1% resolution
int16_t temperatureData = (temperature + 100) * 10; // 0.1°C resolution with offset
int16_t chargeData = (chargeLimit + 3000) * 10; // 0.1 A resolution with offset
int16_t dischargeData = (dischargeLimit + 3000) * 10; // 0.1 A resolution with offset
// Send Battery Voltage, SOC, and Temperature
CAN_FRAME frame1;
frame1.id = 0x1801F456; // CAN ID for Battery Voltage, SOC, Temperature
frame1.length = 6; // 6 bytes of data
frame1.data[0] = (uint8_t)(voltageData >> 8); // Voltage high byte
frame1.data[1] = (uint8_t)(voltageData & 0xFF); // Voltage low byte
frame1.data[2] = socByte; // SOC byte
frame1.data[3] = (uint8_t)(temperatureData >> 8); // Temperature high byte
frame1.data[4] = (uint8_t)(temperatureData & 0xFF); // Temperature low byte
frame1.data[5] = 0x00; // Reserved
Can0.sendFrame(frame1);
Serial.println(„Battery Voltage, SOC, and Temperature sent.“);
delay(1000);
// Send Charge/Discharge Current Limits
CAN_FRAME frame2;
frame2.id = 0x1802F456; // CAN ID for Charge/Discharge Current Limits
frame2.length = 4; // 4 bytes of data
frame2.data[0] = (uint8_t)(chargeData >> 8); // Charge limit high byte
frame2.data[1] = (uint8_t)(chargeData & 0xFF); // Charge limit low byte
frame2.data[2] = (uint8_t)(dischargeData >> 8); // Discharge limit high byte
frame2.data[3] = (uint8_t)(dischargeData & 0xFF); // Discharge limit low byte
Can0.sendFrame(frame2);
Serial.println(„Charge/Discharge Current Limits sent.“);
delay(1000);
// Send Enable Communication Command
CAN_FRAME frame3;
frame3.id = 0x1803F456; // CAN ID for Enable Communication
frame3.length = 8; // 8 bytes of data
frame3.data[0] = 0xAA; // Enable communication byte
for (int i = 1; i < 8; i++) {
frame3.data[i] = 0x00; // Reserved bytes
}
Can0.sendFrame(frame3);
Serial.println(„Enable communication command sent.“);
delay(1000); // Wait 1 second before the next loop
}
Leider erscheint beim Verbinden des Arduino zum Wechselrichter leider der Fehler F58. Da dieser sehr allgemein ist, komme ich nicht so ganz weiter.
Hat jemand Erfahrung beim Verbinden eines Custom BMS/Arduino zum Wechselrichter über CAN und kann mir da etwas weiterhelfen?
Viele Grüße Luca