Go Down

Topic: Stopuhr mit Max7219 Matrix Display (Read 3532 times) previous topic - next topic

Whandall

#30
Nov 25, 2018, 10:39 pm Last Edit: Nov 25, 2018, 10:45 pm by Whandall
Den richtigen COM Port musst du schon einstellen.

Im Terminafenster unten solltest du eine Liste deiner Ports sehen,
da musst du den richtigen auswählen.

Dass der Arduino neu bootet beim Öffnen des Ports ist normal.

Vielleicht hast du ja auch diese Fonts nicht, eine Liste der Fonts kannst in der Nähe
der Serial Port Liste erzeugen, ist nur auskommentiert.

Code: [Select]
  //printArray(PFont.list());
Ah, this is obviously some strange usage of the word 'safe' that I wasn't previously aware of. (D.Adams)

Whandall

Läuft bei dir denn ein beliebiges anderes Beispiel von Processing?
Ah, this is obviously some strange usage of the word 'safe' that I wasn't previously aware of. (D.Adams)

obeis

Moin

Ja jetzt läuft es. Ich hatte die eins im Sketch stehen gelassen. Allerdings war der Com Port als 0 deklariert.
Jetzt läuft es.
Jetzt hätte ich noch zwei Wünsche:
-  wenn Ich "Reset" drücke sollte die Zeit verschwinden und z.B. Start im Fenster angezeigt werden.
-  kann mann die Ergebnisse (vieleicht die letzten 10) mit Name und Zeit von unten nach oben im Fenster mit anzeigen? Also das immer die neuste Zeit unten drunter geschoben wird?

Ein echt krasses Forum hier.
Vielen Dank schonmal.

Siebo

Whandall

Du hast den Quelltext, tob dich aus.

Der Arduino sendet *Reset wenn die Taste gedrückt wird.

Code: [Select]
*Setup
*Start
0
55
65
75
85
95
105
115
125
177
187
197
207
217
227
237
247
257
267
277
*Stop 280
*Reset


Die Zahlen werden gerundet und angezeigt, *Stop schreibt den Eintrag in die Datei.
Mit der Tastatur kannst du das Team angeben, zum Editieren geht nur Backspace.
Enter übernimmt das Team nach oben in die Anzeige, oder löscht diese wenn nichts eingegeben wurde.

Dateieinträge werden nur geschrieben wenn ein Team angegeben wurde,
die Ergebnis Datei befindet sich im Sketchverzeichnis.

Ah, this is obviously some strange usage of the word 'safe' that I wasn't previously aware of. (D.Adams)

obeis

Code: [Select]
import processing.serial.*;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.util.Date;

Serial myPort;
int whichKey = -1;
String inData;
String selectedTeam = "";
String team = "";
PFont stdFont, bigFont, giantFont;
int currMillis;
int rounded;
boolean debugDisplay = false;

void setup() {
  size(1024, 640);

  stdFont = createFont("DejaVu Sans", 16);
  bigFont = createFont("DejaVu Sans Bold", 64);
  giantFont = createFont("DejaVu Sans Bold", 200);

  //printArray(PFont.list());
  printArray(Serial.list());

  // I know that the first port in the serial list on my mac
  // is always my  FTDI adaptor, so I open Serial.list()[0].
  // In Windows, this usually opens COM1.
  // Open whatever port is the one you're using.
  String portName = Serial.list()[0];
  myPort = new Serial(this, portName, 250000);
  myPort.bufferUntil('\n');
}

void draw() {
  background(0);
  textFont(stdFont);
  text("Ortswehr: " + team, 10, height-20);
  if (debugDisplay) {
    text("Key: " + whichKey, width-100, height-20);
    text("Data: '" + inData +"'", width-280, height-20);
  }
  textFont(bigFont);
  text("Ortswehr  " + selectedTeam, 10, 70);
  textFont(giantFont);
  text(makeTime()+" s", makePos(150), height-300);
}

void serialEvent(Serial myPort) {
  inData = myPort.readString().trim();
  if (inData.charAt(0) >= '0' && inData.charAt(0) <= '9') {
    currMillis = int(inData);
  } else if (inData.startsWith("*Stop")) {
    currMillis = int(inData.substring(6));
    if (selectedTeam != "") {
      Date date = new Date();
      appendTextToFile(sketchPath() + "\\ergebnisse.txt",
        "\"" + selectedTeam + "\", Zeittaktlänge " + makeTime() + ", Zeitstempel \"" + date.toString() + "\"");
        ////toString//" + currMillis + ",
    }
  } else if (inData.startsWith("*Reset")){
    currMillis = int(inData);
  }
   
}

int makePos(int basePos) {
  if (rounded > 9999) {
    return basePos;
  }
  if (rounded > 999) {
    return basePos + 140;
  }
  return basePos + 279;
}

String makeTime() {
  String mt;
  rounded = (currMillis+5)/10;
  int highPart = rounded / 100;
  int lowPart = rounded % 100;
  mt = highPart + ".";
  if (lowPart<10) {
    mt = mt + "0";
  }
  mt = mt + lowPart;
  return mt;
}

void keyPressed() {
  myPort.write(key);
  whichKey = key;
  if (whichKey != 65535) {
    if (whichKey == 10) {
      selectedTeam = team;
      team = "";
    } else if (whichKey == 8) {
      if (team.length()>0) {
        team = team.substring(0, team.length()-1);
      }
    } else {
      team = team + char(whichKey);
    }
  }
}

void appendTextToFile(String filename, String text) {
  try {
    File f = new File(filename);
    if (!f.exists()) {
      if (!f.createNewFile()) {
        println("could not create " + filename);
      }
    }
    PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(f, true)));
    out.println(text);
    out.close();
  }
  catch (IOException e) {
    e.printStackTrace();
  }
}

Ich habe jetzt ein zweites "else if" für den "*Reset" eingefügt. Weil der Reset Taster den Wert im Arduino ja auch gleich auf 0 setzt, wird dann 0,00 s angezeigt.
Kann ich dafür auch irgendwie "Start" einsetzen?
Mit text("Start"); bin ich kläglich gescheitert.
Die 0,00s sind schon nicht schlecht, aber "Start" währe noch besser.

Dann würde ich gerne das Datum/Zeit Format in der Datei anpassen.
Ich brauche nur "Nov 26 00:35" Ich habe versucht aus toString ein substring(5, 12) zu machen, aber da  ging gleich die rote Lampe an.
Werde mich jetzt ins Bett legen und drüber schlafen.

Siebo

Whandall

Code: [Select]
  } else if (inData.startsWith("*Reset")){
    currMillis = int(inData);
  }

Warum willst du den int Wert von "*Reset" ermitteln?
Aber du wolltest ja sowieso was anderes machen.

Setz doch statt dessen einen (globalen) boolean der in draw() die Anzeige der Zahl / deines Textes steuert.
Ob du mit dem riesigen Font da klarkommst wirst du ja sehen, sonst machst du dir einen neuen,
dann käme die Auswahl des Fonts auch noch in das if else des boolean.
Die erste reinkommende Zahl kann den wieder zurücksetzen, fertig.

Ist doch ganz schnucklig was man mit Processing auf die Schnelle so hinzaubern kann, oder?
Ah, this is obviously some strange usage of the word 'safe' that I wasn't previously aware of. (D.Adams)

obeis

Ist doch ganz schnucklig was man mit Processing auf die Schnelle so hinzaubern kann, oder?
Jetzt muss "man" nur noch Ahnung haben.
Das ist echt irre was hier jetzt schon nach meist nur ein paar Minuten läuft. Aber ich komme hier noch nicht weiter. Ich verstehe nicht was du mir da schreibst.
Boolean gibt laut Wiki nur wahr oder falsch zurück. Soll das wie eine If Else Schleife wirken? Ich habe ja nun schon ereicht das der aktuelle Wert von "Datain" angezeigt wird, sobald die "*Reset" Meldung kommt.
Kann ich nicht einfach einen TEXT senden?"man" kann das bestimmt, aber ich leider nicht.
Du hast mir schon sehr geholfen.

Ich würde die Ausgabedatei mit passenden Trennzeichen zu einer csv Datei/Tabelle umstricken. Das ging schon kurz, bis ich die Datei falsch überschrieben habe.
Ist es prinzipiell möglich die letzten 10 Reihen im Fenster mit anzuzeigen?

Siebo

Whandall

Code: [Select]

boolean zeigText = true;

void draw() {
  background(0);
  textFont(stdFont);
  text("Ortswehr: " + team, 10, height-20);
  if (debugDisplay) {
    text("Key: " + whichKey, width-100, height-20);
    text("Data: '" + inData +"'", width-280, height-20);
  }
  textFont(bigFont);
  text("Ortswehr  " + selectedTeam, 10, 70);
  textFont(giantFont);

  if (zeigText) {
    text("LOS !!!", 150, height-300)
  } else {
    text(makeTime()+" s", makePos(150), height-300);
  }
}
Ah, this is obviously some strange usage of the word 'safe' that I wasn't previously aware of. (D.Adams)

Whandall

Das waren viele Fragen, um 0:41 gestellt, aber keine Zeit die Antwort von 0:44 abzuwarten?

Solche Art von Unterhaltung finde ich extrem zäh.
Ah, this is obviously some strange usage of the word 'safe' that I wasn't previously aware of. (D.Adams)

michael_x

Ein Forum ist kein Chat.
Ich finde gut, dass hier wenig Beiträge mit dem Inhalt "Gute Nacht" sind.
Alle Fragen überlegen, eintippen, schlafen gehen und am nächsten Abend schauen was passiert ist, finde ich OK.

Whandall

So unterschiedlich sind die Ansichten.  :D

Ah, this is obviously some strange usage of the word 'safe' that I wasn't previously aware of. (D.Adams)

obeis

Sorry ich möchte hier niemanden mit meinem Unwissen verärgern.
Ich hätte die Antwort heute Nacht schon gestern um kurz nach 22Uhr getippt und bin dann auf dem Sofa eingepennt. Komisch dabei geht der Wecker erst um 5:15 Uhr. Dann bin ich um kurz vor 1 aufgewacht. Dann nir noch Rechner aus, ach ne noch schnell abschicken und dann weiter schlafen.
Ich kenne Foren eigentlich meistens so das sich erst nach Stunden oder Tagen gemeldet wird. Innerhalb von 3 min  mit Codebespiel ist schon echt Irre.
Ich werde mir nachher mehr Zeit nehmen.
Versprochen

Siebo

obeis

Moin.
Nach langer Weihnachtsmarkt und Stress auf der Arbeit Pause steige ich hier mal wieder ein.

Code: [Select]
import processing.serial.*;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.util.Date;

Serial myPort;
int whichKey = -1;
String inData;
String selectedTeam = "";
String team = "";
PFont stdFont, bigFont, giantFont;
int currMillis;
int rounded;
boolean debugDisplay = false;
boolean zeigText = true;

void setup() {
  size(1024, 640);

  stdFont = createFont("DejaVu Sans", 16);
  bigFont = createFont("DejaVu Sans Bold", 64);
  giantFont = createFont("DejaVu Sans Bold", 200);

  //printArray(PFont.list());
  printArray(Serial.list());

  // I know that the first port in the serial list on my mac
  // is always my  FTDI adaptor, so I open Serial.list()[0].
  // In Windows, this usually opens COM1.
  // Open whatever port is the one you're using.
  String portName = Serial.list()[0];
  myPort = new Serial(this, portName, 250000);
  myPort.bufferUntil('\n');
}

void draw() {
  background(0);
  textFont(stdFont);
  text("Ortswehr: " + team, 10, height-20);
  if (debugDisplay) {
    text("Key: " + whichKey, width-100, height-20);
    text("Data: '" + inData +"'", width-280, height-20);
  }
  textFont(bigFont);
  text("Ortswehr  " + selectedTeam, 10, 70);
  textFont(giantFont);

  if (zeigText) {
    text("LOS !!!", 150, height-300);
  } else {
    text(makeTime()+" s", makePos(150), height-300);
  }
}

//void draw() {
//  background(0);
//  textFont(stdFont);
//  text("Ortswehr: " + team, 10, height-20);
//  if (debugDisplay) {
//    text("Key: " + whichKey, width-100, height-20);
//    text("Data: '" + inData +"'", width-280, height-20);
//  }
//  textFont(bigFont);
//  text("Ortswehr  " + selectedTeam, 10, 70);
//  textFont(giantFont);
//  text(makeTime()+" s", makePos(150), height-300);
//}

void serialEvent(Serial myPort) {
  inData = myPort.readString().trim();
  if (inData.charAt(0) >= '0' && inData.charAt(0) <= '9') {
    currMillis = int(inData);
  } else if (inData.startsWith("*Stop")) {
    currMillis = int(inData.substring(6));
    if (selectedTeam != "") {
      Date date = new Date();
      appendTextToFile(sketchPath() + "\\ergebnisse.cvs",
        ";"" + selectedTeam + ";"; Zeittaktlänge " + makeTime() + "");
      appendTextToFile(sketchPath() + "\\ergebnisse.csv",
        ";"" + selectedTeam + ";";" + makeTime() + ";" + date.toString() + ";""); 
        ////toString//" + currMillis + ",
    }
  } else if (inData.startsWith("*Reset")){
    currMillis = int(inData.substring(1));
  }
   
}

int makePos(int basePos) {
  if (rounded > 9999) {
    return basePos;
  }
  if (rounded > 999) {
    return basePos + 140;
  }
  return basePos + 279;
}

String makeTime() {
  String mt;
  rounded = (currMillis+5)/10;
  int highPart = rounded / 100;
  int lowPart = rounded % 100;
  mt = highPart + ".";
  if (lowPart<10) {
    mt = mt + "0";
  }
  mt = mt + lowPart;
  return mt;
}

void keyPressed() {
  myPort.write(key);
  whichKey = key;
  if (whichKey != 65535) {
    if (whichKey == 10) {
      selectedTeam = team;
      team = "";
    } else if (whichKey == 8) {
      if (team.length()>0) {
        team = team.substring(0, team.length()-1);
      }
    } else {
      team = team + char(whichKey);
    }
  }
}

void appendTextToFile(String filename, String text) {
  try {
    File f = new File(filename);
    if (!f.exists()) {
      if (!f.createNewFile()) {
        println("could not create " + filename);
      }
    }
    PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(f, true)));
    out.println(text);
    out.close();
  }
  catch (IOException e) {
    e.printStackTrace();
  }
}


Wenn Ich die Stopuhr verbinde und start drücke läuft die Zeit am Arduino los. per Taste kann ich die Uhr auch stoppen, allerdings zeigt das Progtramm nichts an . Komischerweise speichert das Programm die Zeit in der Datei ab.
Soweit so schick. Aber wie definiere ich jetzt
Code: [Select]
zeigText?
Ich muss dem Programm ja irgendwie sagen das "zeigText" true ist wenn die Uhr noch steht und auf start wartet, oder wenn Reset gedrückt wurde.
Mein Gedanke ist so etwas wie ("zeigText == Reset"(auf der seriellen Leitung)

Siebo

postmaster-ino

Hi

Bin ich blöd, oder ist Da gar kein loop() drin?

... davon ab ...
Was meinst Du mit 'zeigText==Reset' ?? :o

Eine Erklärung für gaaanz dumme wäre vll. hilfreich - momentan verstehe ich Dein Problem zwar (denke ich ... die Zeit wird beim Stoppen oder beim Start, wenn die Uhr nicht (mehr) läuft, nicht angezeigt) - aber Deine Lösungsidee sagt mir ganz und gar Nichts.

MfG

obeis

Ahoi.
Ich fange noch mal an. Wenn Ich die Uhr starte steht Los im Display. Das ist ja auch so gewollt und steht in der IF Abfrage
Code: [Select]
if (zeigText) {
    text("LOS !!!", 150, height-300);
  } else {
    text(makeTime()+" s", makePos(150), height-300);
  }

Allerdings denke ich das da nur Los!! steht und auch stehen bleibt, weil ich am anfang ja schon
Code: [Select]
boolean zeigText = true;
eingetragen habe.
Ich verstehe das jetzt so das ich jetzt erstmal "manuell" die Variable (richtig??) "zeigText" auf true gesetzt habe, was beim Systemstart ja auch sinnvoll ist. Solange zeigText -> true ist steht LOS !! im Monitor. Jetzt muss ich aber ja irgendwie die Variable im Bezug auf den Text/die Zahl verändern, die über den seriellen Port rein kommen.
Solange *Setup oder *Reset und keine Ziffern über den seriellen Port kommen soll "IF" ausgeführt werden.
Sobald Ziffern auf dem Port auftauschen sollte "ELSE" ablaufen.

Ich verstehe aktuell nicht wo oder wie ich "zeigText" eine Bediengung zuweise.


Wo brauche ich den loop()?

Vielen Dank im voraus.

Siebo

Go Up