Author Topic: Dashboard in python  (Read 10177 times)

MathiasW

  • Global Moderator
  • Hero Member
  • *****
  • Posts: 614
  • Karma: +13/-0
    • my Arduino page
Dashboard in python
« on: September 27, 2016, 05:24:14 PM »
Salut,

vor einiger Zeit hatte ich ein "Arduino Dashboard" in Visual Basic programmiert. Dieses Program habe ich nun begonnen, auf Python zu portieren. Damit läuft es auch unter Linux und MacOS. Es verwendet python3 mit den libraries tk, serial und matplotlib.

Da der Code ein einfaches serielles Protokoll etabliert, ist die Prozessorplatform beliebig, kann also ein Arduino, ein chipKIT, ein ESP8266 oder sonst etwas sein, das mit meiner seriellen Schnittstelle redet. Zum Testen verwende ich ein COM-Port emulator und ein Terminalprogramm.

Der aktuelle Zustand des Codes ist Alpha, da noch einige der Features fehlen. Aber für einen ersten Eindruck und Feedback sollte es reichen. Ich habe auch verschiedene Beispielcodes angehängt. Derzeit funktionieren:
  • LED (RGB)
  • Buttons
  • label und datafileds
  • CheckBox
  • radio Buttons
  • histogram und Timeline
  • Polardaten (im Bau)

Da dies mein erster Code in Python ist, bin ich für Hinweise dankbar, wie man etwas besser programmieren kann. Wenn ich etwas falsch oder ausgesprochen sinnlos programmiert habe, so bitte ich um Nachsicht und ein ++ für den gelungenen Scherz  ;)

Ich habe auch eine Sonderversion für meinen 6 DOF Roboterarm programmiert, die ich auch anhänge. Der Arduino/PIC-Code ist aber noch rudimentär.

Ciao, Mathias

dinoi

  • freakyfriday
  • Sr. Member
  • *
  • Posts: 441
  • Karma: +7/-0
    • Dinoi
Re: Dashboard in python
« Reply #1 on: October 28, 2016, 12:10:31 AM »
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:
Code: [Select]
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;
}

MathiasW

  • Global Moderator
  • Hero Member
  • *****
  • Posts: 614
  • Karma: +13/-0
    • my Arduino page
Re: Dashboard in python
« Reply #2 on: October 28, 2016, 11:49:28 AM »
Salut Reto,

danke fürs Testen! Auf den Liste der ToDo´s ganz oben ist der "Clear" Button: auf dem Dashboard will ich einen Button einfügen, mit dem man die Elemente löschen kann und der Prozessor erhält eine ">INIT<" Aufforderung, die Elemente neu anzumelden. Als zweites möchte ich den Befehl ">CLEAR<" einführen, mit dem der Prozessor das Dashboard löschen kann. Damit kann ich dann mehrseitige Menüs realisieren. Beides sollte in der nächsten Release verfügbar sein, die ich für Ende des nächsten Monats anvisiere.
Dann hoffe ich auch eine Dokumentation im Playground auf die Beine gestellt zu haben

Ciao, Mathias

 

anything