Hallo Mathias,
ich habe etwas mit Deinem "Dashboard" rumgespielt. Die Idee gefällt mir ganz gut, Daten auf dem PC zu visualisieren und den Arduino zu steuern. Damit lassen sich mit sehr wenig Zeilen Code tolle Dinge umsetzten. Die Oberfläche ist sehr komfortabel. Vor allem während der Entwicklung oder zu Anschauungszwecken ist das Dashboard gut nutzbar. Auch das Beispiel mit dem Roboterarm ist sehr interessant.
Ich habe mit dem Helvepic32 überhaupt keine Probleme gehabt alles hat immer bestens funktioniert.
Komischerweise sendet der Helvepic32 bereits ohne >INIT< das Layout. Keine Ahnung wieso.
Mit dem Helvetino hatte ich den Effekt nicht, der sendet erst wenn das Dashboard bereits ist und ein >INIT< sendet.
Den Code musste ich für den Helvetino etwas anpassen aber es läuft problemlos.
Aus meiner Sicht ist das Dashboard schon sehr gut einsetzbar. Ein einziger Verbesserungsvorschlag hätte ich noch.
Wenn ich den Code im Arduino ändere bleiben die Elemente im Dashboard bestehen, da wäre es gut alles zu initialisieren und
dann die Elemente neu aufzubauen.
Leider kann ich Dir im Python überhaupt nicht helfen da bin totaler Anfänger

Grüsse Reto
P.S.: hier noch der angepasste Helvetino Code:
char* board;
int bufferCount; // Anzahl der eingelesenen Zeichen
char buffer[80]; // Serial Input-Buffer
char temp[80];
int blinkdelay;
boolean dbOpen = false;
int PIN_LED1 = 13;
boolean ledState;
int blink_freq = 200;
unsigned long previousMillis = 0; // will store last time LED was updated
volatile int blink_id;
unsigned long blink_var;
/*void blink_task(int id, void * tptr) {
digitalWrite(PIN_LED1, !digitalRead(PIN_LED1)); // Toggle pin state
}*/
void setup()
{
board = "HELVETINO";
pinMode(PIN_LED1, OUTPUT);
digitalWrite(PIN_LED1,LOW);
Serial.begin(115200);
Serial.println(">READY<");
}
void loop()
{
if (Serial.available()) serialEvent();
unsigned long currentMillis = millis();
if(blink_freq == 0){
digitalWrite(PIN_LED1, LOW);
}else{
if (currentMillis - previousMillis >= blink_freq) {
// save the last time you blinked the LED
previousMillis = currentMillis;
// if the LED is off turn it on and vice-versa:
if (ledState == LOW) {
ledState = HIGH;
} else {
ledState = LOW;
}
// set the LED with the ledState of the variable:
digitalWrite(PIN_LED1, ledState);
}
}
}
void serialEvent(){
char ch = Serial.read();
buffer[bufferCount] = ch;
bufferCount++;
if(ch == 13){
evalSerialData();
}
}
void evalSerialData()
{
int ptr;
int val;
double cT;
strcpy(temp,"");
// delay(20);
if ((buffer[0]=='>')&&(buffer[bufferCount-3]=='<')) {
strncat(temp, buffer, bufferCount-2);
if (strcmp(temp,">INIT<")==0){
// setup the Dashboard
Serial.println(">IFO.Button Demo Sketch 1.0.0<");
Serial.print(">BRD.");
Serial.print(board);
Serial.println("<");
Serial.println(">TTL.Dashboard Demo - Using Slider<");
Serial.println(">TXT001.0020.0040.0200.0025.Use Slider to change LED frequency.e<");
Serial.println(">SLD001.0020.0070.0000.0010.0001.Led Swiper<");
dbOpen = true;
}
if (strcmp(temp,">GoodBye<")==0){
// stop the Dashboard
dbOpen = false;
}
if ((buffer[1]=='S')&&(buffer[2]=='L')&&(buffer[3]=='D')){
ptr = (buffer[5]-48)*10 + (buffer[6]-48);
val = (buffer[8]-48)*1000 + (buffer[9]-48)*100 + (buffer[10]-48)*10 + (buffer[11]-48);
blink_freq = 100*val+100;
}
if ((buffer[1]=='B')&&(buffer[2]=='T')&&(buffer[3]=='N')){
ptr = (buffer[5]-48)*10 + (buffer[6]-48);
val = (buffer[8]-48)*1000 + (buffer[9]-48)*100 + (buffer[10]-48)*10 + (buffer[11]-48);
switch(ptr){
case 1:
blink_freq = 1000;
break;
case 2:
blink_freq = 500;
break;
case 3:
blink_freq = 200;
break;
case 4:
blink_freq = 0;
break;
}
}
}
else {
if ((buffer[4]=='C')&&(buffer[5]=='L')&&(buffer[6]=='E')&&(buffer[7]=='A')&&(buffer[8]=='R')){
Serial.println("Serial Clear");
} else {
strcpy(temp,"BadCmd: ");
strncat(temp, buffer, bufferCount);
Serial.println(temp);
}
}
bufferCount=0;
}