Hallo Frage an Euch, vielleicht wisst ihr wie "verbessern".
Ich habe nun auf 2 Seiten je einmal die Werte von dem BMS und einmal vom ESC.
Das klappt. Ich verwende hierfür Sprites, welche ich dann über den einen Button schalte.
Leider flackert es jetzt doch - wo ist mein Logikfehler, ist der Fehler vielleicht, dass ich für jeden CAN eine eigene Funktion aufrufe, diese dann wiederum eine Sprite erzeugt....
Ich poste mal den Code:
#include <FlexCAN_T4.h>
#include <TFT_eSPI.h>
#include "SPI.h"
#include <SoftwareSerial.h>
#include <Streaming.h>
#define WHITE 0xFFFF
#define BLACK 0x0000
#define BLUE 0x001F
#define RED 0xF800
#define MAGENTA 0xF81F
#define GREEN 0x07E0
#define CYAN 0x7FFF
#define YELLOW 0xFFE0
#define SCREEN_WIDTH 240
#define SCREEN_HEIGHT 320
#define RST_PIN 9
#define DC_PIN 15
#define CS_PIN 10
#define MOSI_PIN 11
#define SCLK_PIN 13
TFT_eSPI tft = TFT_eSPI();
// Umschalten Pages = Sprites
TFT_eSprite img = TFT_eSprite(&tft);
TFT_eSprite img2 = TFT_eSprite(&tft);
FlexCAN_T4<CAN1, RX_SIZE_256, TX_SIZE_16> can1;
FlexCAN_T4<CAN2, RX_SIZE_256, TX_SIZE_16> can2;
CAN_message_t msg;
long unsigned int rxId;
long unsigned int rxId_EMUS;
struct CANDATA
{
//MGM Compro ESC Variablen
uint16_t batVoltage;
uint16_t batCurrent;
int32_t rpm;
int16_t motoTemp;
int16_t escTemp;
int16_t externTemp;
int16_t pwmOut;
int16_t pwmIn;
uint32_t error;
uint32_t warning;
uint32_t notice;
uint16_t escInit;
uint16_t bVoltage;
uint16_t feedVoltage;
uint16_t phaseCurrent;
uint16_t avarangeCurrent;
uint8_t busVoltage;
uint8_t mosfetTemp;
//EMUS BMS Variablen
uint8_t emusMinCellTemp;
uint8_t emusMaxCellTemp;
uint8_t emusAvgCellTemp;
uint16_t emusMinCellVolt;
uint16_t emusMaxCellVolt;
uint16_t emusAvgCellVolt;
uint32_t emusTotCellVolt;
};
CANDATA candata;
CANDATA olddata;
bool isNew;
// Umschalten Pages Variablen
int chosenOne=0;
int dbounce=0;
void setup(void) {
//Serial.begin(115200); // auskommentiert
Serial.begin(115200);
Serial.println(F("Start...."));
tft.init();
tft.setRotation(2);
// SPRITE EMUS, MGM, später noch GPS
img.createSprite(240, 240);
img2.createSprite(240, 240);
tft.fillScreen(BLACK);
tft.setCursor(0, 10);
tft.setTextColor(WHITE);
tft.setTextSize(1);
tft.setTextWrap(true);
tft.print(F("Start"));
for (byte b = 0; b < 4; b++)
{
delay(100);
tft.print('.');
}
delay(200);
can1.begin();
can1.setBaudRate(500000);
can2.begin();
can2.setBaudRate(125000);
tft.fillScreen(BLACK);
//Umschalten Pages PIN aktivieren
pinMode(5,INPUT_PULLUP);
}
void tftData_EMUS()
{
int x = 145; // Abstand von Links für den Wert
int y = 0; // Abstand von Links für Beschriftung
int o = 35; // Offset-Wert
img.setTextDatum(L_BASELINE);
img.drawString((static_cast < float > (candata.emusMinCellVolt) * 0.01 + 2), x, 1*o, 2);
img.drawString("Cmin [ V]", y , 1*o , 4);
img.drawString((static_cast < float > (candata.emusMaxCellVolt) * 0.01 + 2), x, 2*o, 2);
img.drawString("Cmax [ V]", y , 2*o , 4);
img.drawString((static_cast < float > (candata.emusTotCellVolt) / 100 ), x, 3*o, 2);
img.drawString("Ubat [ V]", y , 3*o , 4);
img.drawString(static_cast < float > ((candata.emusMinCellTemp) - 100), x, 4*o, 2);
img.drawString("Tmin [ °C]", y , 4*o , 4);
img.drawString(static_cast < float > ((candata.emusMaxCellTemp) - 100), x, 5*o, 2);
img.drawString("Tmax [°C]", y , 5*o , 4);
img.pushSprite(0, 40);
}
void tftData_MGM()
{
int x = 145; // Abstand von Links für den Wert
int y = 0; // Abstand von Links für Beschriftung
int o = 35; // Offset-Wert
img2.setTextDatum(L_BASELINE);
img2.drawString(((candata.batVoltage) * 0.1), x, 1*o, 2);
img2.drawString("BATT [V]", y, 1*o, 4);
img2.drawString((static_cast < float > (candata.batCurrent) * 0.1), x, 2*o, 2);
img2.drawString("BATT [A]", y, 2*o, 4);
img2.drawString((static_cast < float > (candata.rpm)), x, 3*o, 2);
img2.drawString("RPM [1/min]", y, 3*o, 4);
img2.pushSprite(0, 40);
}
void loop() {
// SPRITE füllen mit Background-Farbe
img.fillSprite(BLACK);
img2.fillSprite(BLACK);
//can1.setMBFilter(0, 0x001); // Set mailbox 6 to allow CAN ID 0x123 to be collected - aus Flexcan
if ( can1.read(msg) ) {
rxId = (msg.id);
//can1.read - MGM
Serial.print(msg.mb);
Serial.print(" ID: 0x");
Serial.print(msg.id, HEX ); // von Sparkfun switch (rxId) reinbekommen und auslesen
Serial.print(" DATA: ");
for ( uint8_t i = 0; i < 8; i++ ) {
Serial.print(msg.buf[i]); Serial.print(" ");
}
Serial.print(" TS: ");
Serial.println(msg.timestamp);
//auskommentieren
switch (rxId)
{
case 0x1:
//candata.batVoltage = msg.buf[0] | msg.buf[1]; //wird durch 2 Zeilen ersetzt welche analog zur Beschreibung aufsummiert werden
candata.batVoltage = msg.buf[0];
candata.batVoltage += static_cast < uint32_t > (msg.buf[1]) << 8;
//candata.batCurrent = msg.buf[2] | msg.buf[3]; //wird durch 2 Zeilen ersetzt welche analog zur Beschreibung aufsummiert werden
candata.batCurrent = msg.buf[2];
candata.batCurrent += static_cast < uint32_t > (msg.buf[3]) << 8;
candata.rpm = msg.buf[4];
candata.rpm += static_cast < uint32_t > (msg.buf[5]) << 8; // += aufsummieren & 1<<1 ist 2 & 1<<2 ist 4 1<<3 ist 8 & 1<<8 ist 256 also 1<<8 ist gleich 2hoch8
candata.rpm += static_cast < uint32_t > (msg.buf[6]) << 16;
candata.rpm += static_cast < uint32_t > (msg.buf[7]) << 24;
break;
case 0x2:
candata.motoTemp = msg.buf[0] | msg.buf[1];
candata.escTemp = msg.buf[2];
candata.escTemp += static_cast < uint32_t > (msg.buf[3]) << 8;
candata.externTemp = msg.buf[6] | msg.buf[7];
break;
case 0x3:
candata.pwmOut = msg.buf[0];
candata.pwmOut += static_cast < uint32_t > (msg.buf[1]) << 8;
candata.pwmIn = msg.buf[2];
candata.pwmIn += static_cast < uint32_t > (msg.buf[3]) << 8;
break;
case 0x4:
candata.error = msg.buf[0];
candata.error += static_cast < uint32_t > (msg.buf[1]) << 8;
candata.error += static_cast < uint32_t > (msg.buf[2]) << 16;
candata.error += static_cast < uint32_t > (msg.buf[3]) << 24;
candata.warning = msg.buf[4];
candata.warning += static_cast < uint32_t > (msg.buf[5]) << 8;
candata.warning += static_cast < uint32_t > (msg.buf[6]) << 16;
candata.warning += static_cast < uint32_t > (msg.buf[7]) << 24;
break;
case 0x5:
candata.notice = msg.buf[0];
candata.notice += static_cast < uint32_t > (msg.buf[1]) << 8;
candata.notice += static_cast < uint32_t > (msg.buf[2]) << 16;
candata.notice += static_cast < uint32_t > (msg.buf[3]) << 24;
candata.escInit = msg.buf[6] | msg.buf[7];;
break;
case 0x6:
candata.bVoltage = msg.buf[0];
candata.bVoltage += static_cast < uint32_t > (msg.buf[1]) << 8;
candata.feedVoltage = msg.buf[2];
candata.feedVoltage += static_cast < uint32_t > (msg.buf[3]) << 8;
candata.phaseCurrent = msg.buf[4];
candata.phaseCurrent += static_cast < uint32_t > (msg.buf[5]) << 8;
candata.avarangeCurrent = msg.buf[6];
candata.avarangeCurrent += static_cast < uint32_t > (msg.buf[7]) << 8;
break;
case 0x7:
candata.busVoltage = msg.buf[4] | msg.buf[5];
candata.mosfetTemp = msg.buf[6] | msg.buf[7];
break;
}
}
else if ( can2.read(msg) ) {
rxId_EMUS = (msg.id);
Serial.print("CAN2 ");
Serial.print("MB: "); Serial.print(msg.mb);
Serial.print(" ID: 0x"); Serial.print(msg.id, HEX );
Serial.print(" EXT: "); Serial.print(msg.flags.extended );
Serial.print(" LEN: "); Serial.print(msg.len);
Serial.print(" DATA: ");
for ( uint8_t i = 0; i < 8; i++ ) {
Serial.print(msg.buf[i]); Serial.print(" ");
}
Serial.print(" TS: "); Serial.println(msg.timestamp);
switch (rxId_EMUS)
{
case 0x19B50001: //Battery Voltage Overall Parameters 189 191 190 21 89 0 0 0
candata.emusMinCellVolt = msg.buf[0];
candata.emusMaxCellVolt = msg.buf[1];
candata.emusAvgCellVolt = msg.buf[2];
candata.emusTotCellVolt = msg.buf[4];
candata.emusTotCellVolt += static_cast < uint32_t > (msg.buf[3]) << 8;
candata.emusTotCellVolt += static_cast < uint32_t > (msg.buf[6]) << 16;
candata.emusTotCellVolt += static_cast < uint32_t > (msg.buf[5]) << 24;
break;
case 0x19B50002: // Cell Module Temperature Overall Parameters 119 120 119 0 0 0 0 0
candata.emusMinCellTemp = msg.buf[0];
candata.emusMaxCellTemp = msg.buf[1];
candata.emusAvgCellTemp = msg.buf[2];
break;
}
}
//Umschalten Pages
if(digitalRead(5)==0) //12
{
if(dbounce==0)
{
dbounce=1;
chosenOne++;
if(chosenOne>=2)
chosenOne=0;
}
}else dbounce=0;
if(chosenOne==0)
tftData_EMUS();
tft.fillScreen(BLACK);
if(chosenOne==1)
tftData_MGM();
tft.fillScreen(BLACK);
if(chosenOne==2)
tftData_EMUS();
tft.fillScreen(BLACK);
}