Hallo miteinannder, ich hab da ein problem und bekomms einfach nicht gelöst, ich bin auch recht neu in sachen Arduino.
nun zu dem Problem, ich tu über canbus daten von einer BMS abgreifen die dann auf den Nextion angezeigt werden sollen, soweit funktioniert es auch, nur extrem langsam und verzögert, ist da was mit dem speicher faul oder wieso ist das so. Dazu kommen noch weitere Daten von einem Motorcontroller, dem man sagen kann, ob mehr leistung oder weniger, mehr rekuparation oder auch weniger, ist ein elektroautoprojekt. 3 Tasten für Leistungsmodi hab ich belegt, nur muß man öffter draufdrücken bis es ankommt. Das ganze hab ich auch erstmal auf 12 Zellen beschränkt bis der code läuft, dann werden 96 Zellen abgerufen, was noch mehr daten bedeutet.
Anbei der code und ein paar bilder damit sich das etwas vorstellen kann, ich nutze den Teensy 4.0
#include <FlexCAN_T4.h>
FlexCAN_T4<CAN1, RX_SIZE_256, TX_SIZE_16> can1;
int incomingByte = 0;
static CAN_message_t rxmsg, txmsg;
unsigned int CELL_id, Volt, SOC, hTMP, lTMP, PACKi, iTMP, LV, CELLb, BALL, isoDC, isoWAV, CELLDIFF, avr,
flag, tmp_id, cell_tmp, hCELL, lCELL, pCURR, POWER, health, maxCCL, maxDCL, low_tmp, high_tmp, res, tmpm, tmphs, power;
void setup() {
Serial2.begin(115200);
can1.begin();
can1.setBaudRate(500000);
txmsg.id = 0x601;
txmsg.len = 8;
txmsg.buf[0] = 0x23;
txmsg.buf[1] = 0x00;
txmsg.buf[2] = 0x20;
txmsg.buf[3] = 0x31;
txmsg.buf[4] = 0x00;
txmsg.buf[5] = 0x2A;
txmsg.buf[6] = 0x00;
txmsg.buf[7] = 0x00;
can1.write(txmsg);
}
void loop(void) {
if (can1.read(rxmsg)) {
switch (rxmsg.id) {
case 0x36:
CELL_id = (word(rxmsg.buf[0]));
Volt = (word(rxmsg.buf[1], rxmsg.buf[2]));
Volt = (Volt / 10);
break;
case 0x200:
flag = (word(rxmsg.buf[0]));
break;
case 0x581:
power = (word(rxmsg.buf[5], rxmsg.buf[6]));
power = power / 32;
power = power * 0.4;
power = power * 1.36;
break;
case 0x602:
tmphs = (rxmsg.buf[0]);
tmpm = (rxmsg.buf[1]);
break;
case 0x640:
SOC = (word(rxmsg.buf[0]));
res = (word(rxmsg.buf[1], rxmsg.buf[2]));
health = (word(rxmsg.buf[3]));
hCELL = (word(rxmsg.buf[4], rxmsg.buf[5]));
lCELL = (word(rxmsg.buf[6], rxmsg.buf[7]));
CELLDIFF = (hCELL - lCELL);
break;
case 0x641:
hTMP = (word(rxmsg.buf[0], rxmsg.buf[1]));
lTMP = (word(rxmsg.buf[2], rxmsg.buf[3]));
iTMP = (word(rxmsg.buf[4], rxmsg.buf[5]));
break;
case 0x642:
isoDC = (word(rxmsg.buf[0], rxmsg.buf[1]));
isoWAV = (word(rxmsg.buf[2], rxmsg.buf[3]));
avr = (word(rxmsg.buf[4], rxmsg.buf[5]));
break;
case 0x643:
maxDCL = (word(rxmsg.buf[0], rxmsg.buf[1]));
maxCCL = (word(rxmsg.buf[2], rxmsg.buf[3]));
pCURR = (word(rxmsg.buf[4], rxmsg.buf[5]));
PACKi = (word(rxmsg.buf[6], rxmsg.buf[7]));
pCURR = pCURR - 32767;
break;
case 0x1838F380:
tmp_id = (word(rxmsg.buf[0], rxmsg.buf[1]));
cell_tmp = (word(rxmsg.buf[2]));
low_tmp = (word(rxmsg.buf[4]));
high_tmp = (word(rxmsg.buf[5]));
break;
}
}
//cell_voltage
switch (CELL_id) {
case 0:
{
Serial2.print("x201.val=");
break;
}
case 1:
{
Serial2.print("x202.val=");
break;
}
case 2:
{
Serial2.print("x203.val=");
break;
}
case 3:
{
Serial2.print("x204.val=");
break;
}
case 4:
{
Serial2.print("x205.val=");
break;
}
case 5:
{
Serial2.print("x206.val=");
break;
}
case 6:
{
Serial2.print("x207.val=");
break;
}
case 7:
{
Serial2.print("x208.val=");
break;
}
case 8:
{
Serial2.print("x209.val=");
break;
}
case 9:
{
Serial2.print("x210.val=");
break;
}
case 10:
{
Serial2.print("x211.val=");
break;
}
case 11:
{
Serial2.print("x212.val=");
break;
}
}
Serial2.print(Volt);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
//temperatur
switch (tmp_id) {
case 0:
{
Serial2.print("x301.val=");
break;
}
case 1:
{
Serial2.print("x302.val=");
break;
}
case 2:
{
Serial2.print("x303.val=");
break;
}
case 3:
{
Serial2.print("x304.val=");
break;
}
case 4:
{
Serial2.print("x305.val=");
break;
}
case 5:
{
Serial2.print("x306.val=");
break;
}
case 6:
{
Serial2.print("x307.val=");
break;
}
case 7:
{
Serial2.print("x308.val=");
break;
}
case 8:
{
Serial2.print("x309.val=");
break;
}
case 9:
{
Serial2.print("x310.val=");
break;
}
case 10:
{
Serial2.print("x311.val=");
break;
}
case 11:
{
Serial2.print("x312.val=");
break;
}
case 12:
{
Serial2.print("x313.val=");
break;
}
}
Serial2.print(cell_tmp * 10);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
switch (flag) {
case 0x00:
{
Serial2.print("p61.aph=0"); //mil
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.print("p60.aph=0"); //balance
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.print("t60.pco=33808"); //ready grau
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.print("t61.pco=33808"); //charge grau
break;
}
case 0x08:
{
Serial2.print("p61.aph=0"); //mil
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.print("p60.aph=0"); //balance
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.print("t60.pco=2016"); //ready grün
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.print("t61.pco=33808"); //charge grau
break;
}
}
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
if (Serial2.available() > 0) {
incomingByte = Serial2.read();
if (incomingByte == '1') {
txmsg.id = 0x601;
txmsg.len = 8;
txmsg.buf[0] = 0x23;
txmsg.buf[1] = 0x00;
txmsg.buf[2] = 0x20;
txmsg.buf[3] = 0x31;
txmsg.buf[4] = 0x00;
txmsg.buf[5] = 0x2A;
txmsg.buf[6] = 0x00;
txmsg.buf[7] = 0x00;
can1.write(txmsg);
} else if (incomingByte == '2') {
txmsg.id = 0x601;
txmsg.len = 8;
txmsg.buf[0] = 0x23;
txmsg.buf[1] = 0x00;
txmsg.buf[2] = 0x20;
txmsg.buf[3] = 0x31;
txmsg.buf[4] = 0x00;
txmsg.buf[5] = 0x4A;
txmsg.buf[6] = 0x00;
txmsg.buf[7] = 0x00;
can1.write(txmsg);
} else if (incomingByte == '3') {
txmsg.id = 0x601;
txmsg.len = 8;
txmsg.buf[0] = 0x23;
txmsg.buf[1] = 0x00;
txmsg.buf[2] = 0x20;
txmsg.buf[3] = 0x31;
txmsg.buf[4] = 0x00;
txmsg.buf[5] = 0x7D;
txmsg.buf[6] = 0x00;
txmsg.buf[7] = 0x00;
can1.write(txmsg);
} else {
txmsg.id = 0x601;
txmsg.len = 8;
txmsg.buf[0] = 0x40;
txmsg.buf[1] = 0x00;
txmsg.buf[2] = 0x20;
txmsg.buf[3] = 0x31;
txmsg.buf[4] = 0x00;
txmsg.buf[5] = 0x00;
txmsg.buf[6] = 0x00;
txmsg.buf[7] = 0x00;
can1.write(txmsg);
}
Serial2.print("x06.val=");
Serial2.print(hTMP * 10);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.print("x07.val=");
Serial2.print(lTMP * 10);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.print("x333.val=");
Serial2.print(avr * 10);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.print("n0.val=");
Serial2.print(SOC);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.print("n1.val=");
Serial2.print(PACKi / 10);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.print("x02.val=");
Serial2.print(hCELL / 100);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.print("x297.val=");
Serial2.print(hCELL / 10);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.print("x03.val=");
Serial2.print(lCELL / 100);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.print("x298.val=");
Serial2.print(lCELL / 10);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.print("x299.val=");
Serial2.print(CELLDIFF / 10);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.print("n2.val=");
Serial2.print(pCURR * PACKi / 1000);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.print("x06.val=");
Serial2.print(hTMP * 10);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.print("x07.val=");
Serial2.print(lTMP * 10);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.print("x04.val=");
Serial2.print(LV);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.print("n60.val=");
Serial2.print(maxDCL);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.print("n61.val=");
Serial2.print(maxCCL);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.print("n63.val=");
Serial2.print(health);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.print("x701.val=");
Serial2.print(isoDC);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.print("x702.val=");
Serial2.print(isoWAV);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.print("x05.val=");
Serial2.print(iTMP * 10);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.print("x401.val=");
Serial2.print(tmphs * 10);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.print("x402.val=");
Serial2.print(tmpm * 10);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.print("n502.val=");
Serial2.print(power);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
}
}


