Zum Beispiel 88,888 oder 88.888 auf 32x8 DOT-Matrix anzeigen lassen

Danke für das Bild, die Anlage ist ja schon etwas größer 8)

Da mußt Du dann aber auch was Schickes Präsentieren!

Benziner:
Fehler 'overload' was not declared in this scope

Setze mal die Funktion overload() vor auswertungZeiten(). Manchmal ist eine bestimmte Reihenfolge erforderlich.

agmue:
Danke für das Bild, die Anlage ist ja schon etwas größer 8)

Da mußt Du dann aber auch was Schickes Präsentieren!
Setze mal die Funktion overload() vor auswertungZeiten(). Manchmal ist eine bestimmte Reihenfolge erforderlich.

Ja, für's Wohnzimmer ist sie ein bissel zu groß :wink:

Das ist mein Ziel, Gehäuse und Frontplatte für das Projekt sind schon fertig.
Ich glaubt's jetzt nicht, habe overload durch over ersetzt.... und nu funktioniert es. overload ist wohl ein interner.

Ach bitte, wie gehst zum Ausgang?
Nu hänge ich im void over() fest.....wie bekomme ich den vorkomma wert zurückgesetzt, das ich wieder daten einlesen kann.

[code]
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Max72xxPanel.h>

const byte pinCS = 10; // Attach CS=10, DIN=11,CLK=13
const byte numberOfHorizontalDisplays = 4;
const byte numberOfVerticalDisplays = 1;
Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays);

String tape = "Du must schon Gas geben, sonst wird das nichts !";
int spacer = 1;
int width = 5 + spacer; // The font width is 5 pixels

void setup() {
  matrix.setIntensity(2); // Use a value between 0 and 15 for brightness
  matrix.setRotation(0, 1);    // The first display is position upside down
  matrix.setRotation(1, 1);    // The first display is position upside down
  matrix.setRotation(2, 1);    // The first display is position upside down
  matrix.setRotation(3, 1);    // The first display is position upside down
  matrix.setCursor(1, 0);
  matrix.print("-----");
  matrix.write();
  delay(1000);
  Serial.begin(9600);


}
void loop() {
  const byte numChars = 40;          //► längster zu erwartender Name, den das Vorsystem ausgeben kann: "F1:Friedhelm Busch;\0"
  static char buf[numChars];         //► lokal genügt
  static uint16_t ndx = 0;
  char rc;
  while (Serial.available() > 0) {
    rc = Serial.read();
    if (rc == ';') {
      buf[ndx] = '\0';               //►► Zeichenkettenendesteuerzeichen, nicht '\n'
      auswertungZeiten(buf);         //► Zeiger auf Zeichenkette übergeben
      ndx = 0;
    }
    else {
      buf[ndx] = rc;
      ndx = (1 + ndx) % numChars;
    }
  }
}
// RZ1:5,888;
void auswertungZeiten(char * buf1) { //► Sternchen für Zeiger

  static unsigned int vorkomma = 0;
  static unsigned int nachkomma = 0;
  char * bez = strtok(buf1, ":");
  char * inh = strtok(NULL, ":");
  char buf2[8];

  matrix.fillScreen(LOW);                  //► einmal genügt
  if (!strncmp(bez, "RZ1", 3)) {
    sscanf(inh, "%i,%s", &vorkomma, buf2); //►► hier die Referenz entfernt
    nachkomma = atoi(buf2);
    matrix.setTextSize(0);
  }
  if (vorkomma > 99) {        //overload
    over();

    //    matrix.setCursor(5, 0);
    //    matrix.print(">100");
  }
  else {
    if (vorkomma < 10) {
      matrix.setCursor(6, 0);
    } else {
      matrix.setCursor(0, 0);
    }
    matrix.print(vorkomma);
    matrix.drawPixel(12, 6, HIGH);       //► als Kommaersatz
    matrix.drawPixel(12, 7, HIGH);
    matrix.setCursor(14, 0);
    if (nachkomma < 100) {
      matrix.print("0");
    }
    if (nachkomma < 10) {
      matrix.print("0");
    }
    matrix.print(nachkomma);
  }
  matrix.write();                       //► einmal genügt
}

void over() {
  for ( int i = 0 ; i < width * tape.length() + matrix.width() - 1 - spacer; i++ ) {

    matrix.fillScreen(LOW);

    int letter = i / width;
    int x = (matrix.width() - 1) - i % width;
    int y = (matrix.height() - 8) / 2; // center the text vertically

    while ( x + width - spacer >= 0 && letter >= 0 ) {
      if ( letter < tape.length() ) {
        matrix.drawChar(x, y, tape[letter], HIGH, LOW, 1);
      }

      letter--;
      x -= width;
    }

    matrix.write(); // Send bitmap to display
    delay(25);
  }
  while (1);
}

[/code]

Ist das while(1) am Ende von over() wirklich gewollt?
Das wäre dann die Sackgasse ohne Ausgang :wink:

Benziner:
Ach bitte, wie gehst zum Ausgang?
Nu hänge ich im void over() fest.....wie bekomme ich den vorkomma wert zurückgesetzt, das ich wieder daten einlesen kann.

Indem Du darauf verzichtest in einer Dauerschleife stehen zu bleiben ohne irgendwas anderes tun zu können.

Merke! Ein while(1) ist ein Rundumschlag aus dem Du nie rauskommst, da es keine Abbruchmöglichkeit gibt.

void over() {

[...]
  while (1);
}

Da war wno158 schneller. Na dann... Ist heute wohl nicht mein Tag... Hast Du meine Erklärung gelesen?

@xy projekt
hab´s mir in die Firma geschickt zum ausdrucken. wahrscheinlich hätte ich dann gewusst das es keinen ausgang nach while(1); gibt. Aber das war ein versuch die Laufschrift nur einmal ausführen zu lassen, ohne while klappt es aber auch nicht, nur wenn ich delay rausnehme. Ich denke hier wäre der zeitpunkt sich mit millis zu beschäftigen.
Oder ist das der flasche ansatzpunkt?

@wno158
gewollt war es nicht.... nach euren Antworten kommt es mir jetzt auch logisch vor.
Besser spät als nie... :confused:

Benziner:
Ich denke hier wäre der zeitpunkt sich mit millis zu beschäftigen.
Oder ist das der flasche ansatzpunkt?

Nein.
Du willst ja keinen statischen Text anzeigen. Also musst Du zum einen "rollen" und zum anderen auch darauf achten, ob die Bedingung zum rollen (noch) erfüllt ist...
Rumpf: (Und nur das ist es)

void over() {
  static unsigned long lastmillis = millis();
  const unsigned long schrittTime = 200; // Zeit in ms
  if (millis() - lastmillis > schrittTime) // alle xx ms - je nach Schrittime
  {
    lastmillis = millis(); // Merke letzten Aufruf
    //und ab hier muss rein, was Du auf dem Display ausgeben willst
    // HINWEIS! das matrix.write() kann entfallen, da es im loop() ausgeführt wird
    /*
      for ( int i = 0 ; i < width * tape.length() + matrix.width() - 1 - spacer; i++ ) {

        matrix.fillScreen(LOW);

        int letter = i / width;
        int x = (matrix.width() - 1) - i % width;
        int y = (matrix.height() - 8) / 2; // center the text vertically

        while ( x + width - spacer >= 0 && letter >= 0 ) {
          if ( letter < tape.length() ) {
            matrix.drawChar(x, y, tape[letter], HIGH, LOW, 1);
          }

          letter--;
          x -= width;
        }

        matrix.write(); // Send bitmap to display
      }
    */
  }
}

Das ist wirklich sehr spartanisch dargestellt....
Du musst Dir die Länge Deiner Ausgabe merken und gleichzeitig auch den Punkt, an dem Du Dich gerade befindest.
Ist das Maimum erreicht, musst Du wieder von vorn anfangen.
Die Lib nimmt dir schon einiges ab, aber das example geht IMHO davon aus, das Du einen statischen Text durchlaufen lässt und nichts weiter machst...

my_xy_projekt:
Nein.
Du willst ja keinen statischen Text anzeigen. Also musst Du zum einen "rollen" und zum anderen auch darauf achten, ob die Bedingung zum rollen (noch) erfüllt ist...
Rumpf: (Und nur das ist es)

Ich hatte eigendlich gedacht das wenn die Bedingung erfüllt ist (im meinem Fall >100) zu void springt, abarbeitet und wieder zum Ursprung zurück springt.

Das ist wirklich sehr spartanisch dargestellt....
Du musst Dir die Länge Deiner Ausgabe merken und gleichzeitig auch den Punkt, an dem Du Dich gerade befindest.
Ist das Maimum erreicht, musst Du wieder von vorn anfangen.
Die Lib nimmt dir schon einiges ab, aber das example geht IMHO davon aus, das Du einen statischen Text durchlaufen lässt und nichts weiter machst...

Das übersteigt gerade meine Fähigkeiten.....das ist zuviel für meine Anfängerkenntnis. Hab´s mal auprobiert der Text fliegt durch die Matrix egal wieviel millis ich einstelle.

Benziner:
Ich hatte eigendlich gedacht das wenn die Bedingung erfüllt ist (im meinem Fall >100) zu void springt, abarbeitet und wieder zum Ursprung zurück springt.

JA! Macht das ja auch.
Aber wenn Du aus der >100 eine Laufschrift maochen willst, dann wird daraus:

  1. springe zu over
  2. Zeige ">100" an
  3. komme zurück
  4. prüfe ob weiterhin over // ich gehe davon aus, das das weiterhin so ist
  5. springe zu over
  6. gehe ein Zeichen weiter
  7. zeige "100>" an
  8. komme zurück
  9. == 4.
  10. == 5.
  11. == 6.
  12. zeige "00>1" an
    und so weiter... Wobei es egal ist, ob das ein Rundlauf(siehe oben) oder ein rauslauf mit Neustart nachdem alle Zeichen durchlaufen sind.

Das Problem dabei ist, das der Aufruf der Funktion schneller erfolgt als Du siehst, was da tatsächlich angezeigt wird.
Nehmen wir an, das jeder loop()-Durchlauf 20ms benötigt. Und das ist als untere Grenze schon zu hoch angesetzt...
Dann ist die Zeichenfolge ">100" in einer Sekunde 50 Mal (1 Sekunde = 1000 ms/20 = 50) angezeigt.
Das Du das nicht siehst, hattest Du an anderer Stelle schon gemerkt :wink:

Also brauchst eine "Zwangspause" die aber den sonstigen Ablauf nicht stört.

Bei einer statischen Anzeige ist das egal. Die macht nichts anderes als nur das anzuzeigen.

Benziner:
Hab´s mal auprobiert der Text fliegt durch die Matrix egal wieviel millis ich einstelle.

Ja.
Darum hatte ich das ab hier auskommentiert:

for ( int i = 0 ; i < width * tape.length() + matrix.width() - 1 - spacer; i++ ) {

Weil diese Geschichte solange abgearbeitet wird, bis das Ende der übergebenen Zeichenkette abgearbeitet ist.

Du musst jetzt aus dem for einen i++ machen.
Las mir mal nen Moment - ich überleg mir was...

my_xy_projekt:
Las mir mal nen Moment - ich überleg mir was...

void over() {
  static unsigned long lastmillis = millis();
  const unsigned long schrittTime = 200; // Zeit in ms
  static unsigned int i = 0;
  if (millis() - lastmillis > schrittTime) // alle xx ms - je nach Schrittime
  {
    lastmillis = millis(); // Merke letzten Aufruf
    //und ab hier muss rein, was Du auf dem Display ausgeben willst
    // HINWEIS! das matrix.write() kann entfallen, da es im loop() ausgeführt wird
    /*
      for ( int i = 0 ; i < width * tape.length() + matrix.width() - 1 - spacer; i++ ) {
    */
    if (i < width * tape.length() + matrix.width() - 1 - spacer)
    {
      i++;
    }
    else
    {
      i = 0;
    }
    matrix.fillScreen(LOW);

    int letter = i / width;
    int x = (matrix.width() - 1) - i % width;
    int y = (matrix.height() - 8) / 2; // center the text vertically

    while ( x + width - spacer >= 0 && letter >= 0 ) {
      if ( letter < tape.length() ) {
        matrix.drawChar(x, y, tape[letter], HIGH, LOW, 1);
      }

      letter--;
      x -= width;
    }
    matrix.write(); // Send bitmap to display
  }
}

Die gesamte void over() ersetzen.
Bescheid geben.
Ist wirklich nur aus dem Bauch raus - ich weiss nicht, was ich da mache....

my_xy_projekt:
Die gesamte void over() ersetzen.
Bescheid geben.
Ist wirklich nur aus dem Bauch raus - ich weiss nicht, was ich da mache....

Gesagt, getan...
Respekt für aus dem Bauch raus - fällt mir schwer Dir das zu glauben... :slight_smile:

Nun wird der Text angezeigt und komme auch sofort wieder raus wenn "vorkomma unter 100 kommt" wie es sein soll, jedoch flackert der Text wenn er angezeigt wird.

Und wieder mal 1000 Danke's Grüße

Benziner:
Gesagt, getan...
Respekt für aus dem Bauch raus - fällt mir schwer Dir das zu glauben... :slight_smile:

Nun wird der Text angezeigt und komme auch sofort wieder raus wenn "vorkomma unter 100 kommt" wie es sein soll, jedoch flackert der Text wenn er angezeigt wird.

Ist wirklich aus dem Bauch.
Die Logik dahinter ist, das die for (###) Konstruktion ja nur dafür sorgt, das über die gesamte Länge hinweg der Text ausgegeben wird - dann wieder von vorn u.s.w.
Ich will aber nicht, das der hintereinander, sondern bei jedem Durchlauf um einen Schritt weiter geht.
Damit muss ich den Schritt - und die Schrittzeit(!) - selbst vorgeben.
Das macht mein ersetzendes Konstrukt.

So!
Und nu zu Deinem flackerndem Display.
Das     matrix.write(); // Send bitmap to display wird jetzt sowohl im loop() als auch im over() ausgeführt.
Wenn jetzt zwischendurch ein .clear drin ist, wird gelöscht und wieder neu geschrieben.
Das ist das blinkeln.

Als erstes das .write aus der cover() löschen - testen und wenns nicht wird, dann mal den kompletten Code.

Kommando zurück!

my_xy_projekt:
Als erstes das .write aus der cover() löschen - testen und wenns nicht wird, dann mal den kompletten Code.

Ich hab mal in den Code zu #22 geschaut und nehm den mal als Ausgangspunkt.

Las das mit dem .write in der over() so wie es ist!

Ändere in der void auswertungZeiten von alt:

    if (nachkomma < 10) {
      matrix.print("0");
    }
    matrix.print(nachkomma);
  }
  matrix.write();                       //► einmal genügt
}

In neu:

    if (nachkomma < 10) {
      matrix.print("0");
    }
    matrix.print(nachkomma);
    matrix.write();
  }
}

Danach bitte unbedingt einmal STRG-T drücken und nachsehen, ob die letzte } wirklich nur einmal da ist.

my_xy_projekt:
Ist wirklich aus dem Bauch.

[sup]In function 'bool over(byte)':
warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         if ( letter < tape.length() ) {
              ~~~~~~~^~~~~~~~~~~~~~~
[/sup]

Wenn Du in over() mit millis() arbeitest, sollte diese Funktion auch genügend häufig aufgerufen werden. Tatsächlich wird sie aber nur einmal bei Erkennen der richtigen Zeichenkette aufgerufen.

Zur Anregung:

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Max72xxPanel.h>

const byte pinCS = 10; // Attach CS=10, DIN=11,CLK=13
const byte numberOfHorizontalDisplays = 4;
const byte numberOfVerticalDisplays = 1;
Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays);

String tape = "Du must schon Gas geben, sonst wird das nichts !";
int spacer = 1;
int width = 5 + spacer; // The font width is 5 pixels

void setup() {
  matrix.setIntensity(2); // Use a value between 0 and 15 for brightness
  matrix.setRotation(0, 1);    // The first display is position upside down
  matrix.setRotation(1, 1);    // The first display is position upside down
  matrix.setRotation(2, 1);    // The first display is position upside down
  matrix.setRotation(3, 1);    // The first display is position upside down
  matrix.setCursor(1, 0);
  matrix.print("-----");
  matrix.write();
  delay(1000);
  Serial.begin(9600);
}

void loop() {
  const byte numChars = 40;
  static char buf[numChars];
  static uint16_t ndx = 0;
  bool neu = false;  // ◄
  char rc;
  while (Serial.available() > 0) {
    rc = Serial.read();
    if (rc == ';') {
      buf[ndx] = '\0';
      over(0);
      neu = auswertungZeiten(buf);  // ◄
      ndx = 0;
    }
    else {
      buf[ndx] = rc;
      ndx = (1 + ndx) % numChars;
    }
  }
  if (over(255)) neu = true;  // ◄
  if (neu) matrix.write(); // Send bitmap to display  // ◄
}
// RZ1:5,888;
bool auswertungZeiten(char * buf1) {  // ◄

  static unsigned int vorkomma = 0;
  static unsigned int nachkomma = 0;
  char * bez = strtok(buf1, ":");
  char * inh = strtok(NULL, ":");
  char buf2[8];

  matrix.fillScreen(LOW);
  if (!strncmp(bez, "RZ1", 3)) {
    sscanf(inh, "%i,%s", &vorkomma, buf2);
    nachkomma = atoi(buf2);
    matrix.setTextSize(0);
  }
  if (vorkomma > 99) {
    over(1);  // ◄

    //    matrix.setCursor(5, 0);
    //    matrix.print(">100");
  }
  else {
    if (vorkomma < 10) {
      matrix.setCursor(6, 0);
    } else {
      matrix.setCursor(0, 0);
    }
    matrix.print(vorkomma);
    matrix.drawPixel(12, 6, HIGH);
    matrix.drawPixel(12, 7, HIGH);
    matrix.setCursor(14, 0);
    if (nachkomma < 100) {
      matrix.print("0");
    }
    if (nachkomma < 10) {
      matrix.print("0");
    }
    matrix.print(nachkomma);
  }
  return true;  // ◄
}

bool over(byte aktion) {  // ◄
  static unsigned long lastmillis = millis();
  const unsigned long schrittTime = 50; // Zeit in ms
  static unsigned int i = 0;
  bool matrix_schreiben = false;  // ◄
  static bool aktiv = false;  // ◄
  if (aktion == 0) aktiv = false;  // ◄
  if (aktion == 1) aktiv = true;  // ◄
  if (aktiv) {  // ◄
    if (millis() - lastmillis > schrittTime) // alle xx ms - je nach Schrittime
    {
      lastmillis = millis(); // Merke letzten Aufruf
      //und ab hier muss rein, was Du auf dem Display ausgeben willst
      // HINWEIS! das matrix.write() kann entfallen, da es im loop() ausgeführt wird
      /*
        for ( int i = 0 ; i < width * tape.length() + matrix.width() - 1 - spacer; i++ ) {
      */
      if (i < width * tape.length() + matrix.width() - 1 - spacer)
      {
        i++;
      }
      else
      {
        i = 0;
      }
      matrix.fillScreen(LOW);

      int letter = i / width;
      int x = (matrix.width() - 1) - i % width;
      int y = (matrix.height() - 8) / 2; // center the text vertically

      while ( x + width - spacer >= 0 && letter >= 0 ) {
        if ( letter < tape.length() ) {
          matrix.drawChar(x, y, tape[letter], HIGH, LOW, 1);
        }

        letter--;
        x -= width;
      }
      matrix_schreiben = true;  // ◄
    }
  }
  return matrix_schreiben;  // ◄
}

agmue:
Wenn Du in over() mit millis() arbeitest, sollte diese Funktion auch genügend häufig aufgerufen werden. Tatsächlich wird sie aber nur einmal bei Erkennen der richtigen Zeichenkette aufgerufen.

Du siehst meine vielen Fragezeichen nicht...
over() wird nur aufgerufen wenn UND solange der andere Zweig nicht erfüllt.

 if (vorkomma > 99) {        //overload
    over();

Also mit jedem Umlauf in void auswertungZeiten
Jetzt aber sehe ich in #22, das da ja kein Umlauf erfolgt, sondern das nur eine Auswertung als Reaktion auf ein Ereignis.

Was hindert daran, das anders zu lösen?
alt

void loop() {
  const byte numChars = 40;          //► längster zu erwartender Name, den das Vorsystem ausgeben kann: "F1:Friedhelm Busch;\0"
  static char buf[numChars];         //► lokal genügt
  static uint16_t ndx = 0;
  char rc;
  while (Serial.available() > 0) {
    rc = Serial.read();
    if (rc == ';') {
      buf[ndx] = '\0';               //►► Zeichenkettenendesteuerzeichen, nicht '\n'
      auswertungZeiten(buf);         //► Zeiger auf Zeichenkette übergeben
      ndx = 0;
    }
    else {
      buf[ndx] = rc;
      ndx = (1 + ndx) % numChars;
    }
  }
}

Neu:

void loop() {
  const byte numChars = 40;          //► längster zu erwartender Name, den das Vorsystem ausgeben kann: "F1:Friedhelm Busch;\0"
  static char buf[numChars];         //► lokal genügt
  static uint16_t ndx = 0;
  char rc;
  while (Serial.available() > 0) {
    rc = Serial.read();
    if (rc == ';') {
      buf[ndx] = '\0';               //►► Zeichenkettenendesteuerzeichen, nicht '\n'
      ndx = 0;
    }
    else {
      buf[ndx] = rc;
      ndx = (1 + ndx) % numChars;
    }
  }
 auswertungZeiten(buf);         //► Zeiger auf Zeichenkette übergeben
}

?

Hintergrund ist, das over() weiterhin nur alle xx ms eine Ausgabe gibt.
Gleichzeitig wird mit jedem Umlauf ausgewertet UND trotzdem gewartet, bis der buffer voll ist...

Guten Morgen zusammen,
sorry bin gestern abend auf dem Sofa eingepennt. War ne harte Woche....
Ohh mein Gott ich weiß garnicht mehr wie ich euch das jemals gut machen kann. Ihr seit echt der wahnsinn,
so nun zu den Ergebnissen..
@ xy projekt
Nun werden die nachkomma nicht mehr angezeigt, bei ereichen von vorkomma 100 springt es auch brav in "over" und wird sauber angezeigt. Kommt dann serial vorkomma <100 bleibt die Anzeige stehen und läuft erst weiter wenn der wert wieder >100 erreicht hat. Hier gibt es kein zurück mehr.
@agmue
Hier sieht es jetzt so aus, als wärst Du ganz nah dran. :slight_smile:
Zeigt bis 100 alles korrekt an, auch der Sprung in und aus over klappt perfekt.
Wenn jedoch der Wert vorkomma >100 mehrmals hintereinander serial reinkommt,flackert die Matrix.
Wäre es jetzt nicht möglich zu sagen, lösche die Matrix nur wenn vorkomma <100 ??
Das wäre jetzt mein Ansatz.....

my_xy_projekt:
Du siehst meine vielen Fragezeichen nicht...

Ich habe Dein Programm getestet und leider wurde bei mir anstelle einer Laufschrift nichts angezeigt. Daher habe ich mich auf die Suche begeben, wo die Ursache sein könnte. Das Ergebnis habe ich aufgeschrieben in der Hoffnung auf Ausrufezeichen!

my_xy_projekt:
Was hindert daran, das anders zu lösen?

Das war eigentlich mein Ziel.

Benziner:
sorry bin gestern abend auf dem Sofa eingepennt. War ne harte Woche....

Ich war gestern auch etwas indisponiert, lag wohl am Wetter ::slight_smile:

Benziner:
Wenn jedoch der Wert vorkomma >100 mehrmals hintereinander serial reinkommt,flackert die Matrix.
Wäre es jetzt nicht möglich zu sagen, lösche die Matrix nur wenn vorkomma <100 ??
Das wäre jetzt mein Ansatz.....

Zeig mal Deinen Ansatz. Eigentlich soll das hier Hilfe zur Selbsthilfe sein!

Weil draußen die Sonne scheint und ich keine Lust auf lange Erklärungen habe, hier eine weitere Anregung:

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Max72xxPanel.h>

const byte pinCS = 10; // Attach CS=10, DIN=11,CLK=13
const byte numberOfHorizontalDisplays = 4;
const byte numberOfVerticalDisplays = 1;
Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays);

String tape = "Du must schon Gas geben, sonst wird das nichts !";
int spacer = 1;
int width = 5 + spacer; // The font width is 5 pixels

void setup() {
  matrix.setIntensity(2); // Use a value between 0 and 15 for brightness
  matrix.setRotation(0, 1);    // The first display is position upside down
  matrix.setRotation(1, 1);    // The first display is position upside down
  matrix.setRotation(2, 1);    // The first display is position upside down
  matrix.setRotation(3, 1);    // The first display is position upside down
  matrix.setCursor(1, 0);
  matrix.print("-----");
  matrix.write();
  delay(1000);
  Serial.begin(9600);
}

void loop() {
  const byte numChars = 40;
  static char buf[numChars];
  static uint16_t ndx = 0;
  bool neu = false;
  char rc;
  while (Serial.available() > 0) {
    rc = Serial.read();
    if (rc == ';') {
      buf[ndx] = '\0';
      neu = auswertungZeiten(buf);
      ndx = 0;
    }
    else {
      buf[ndx] = rc;
      ndx = (1 + ndx) % numChars;
    }
  }
  if (over(255)) neu = true;
  if (neu) matrix.write(); // Send bitmap to display
}
// RZ1:5,888;
bool auswertungZeiten(char * buf1) {
  bool matrix_schreiben = false;
  static unsigned int vorkomma = 0;
  static unsigned int nachkomma = 0;
  char * bez = strtok(buf1, ":");
  char * inh = strtok(NULL, ":");
  char buf2[8];

  if (!strncmp(bez, "RZ1", 3)) {
    sscanf(inh, "%i,%s", &vorkomma, buf2);
    nachkomma = atoi(buf2);
    matrix.setTextSize(0);

    if (vorkomma > 99) {
      over(1);

      //    matrix.setCursor(5, 0);
      //    matrix.print(">100");
    }
    else {
      over(0);
      if (vorkomma < 10) {
        matrix.setCursor(6, 0);
      } else {
        matrix.setCursor(0, 0);
      }
      matrix.fillScreen(LOW);
      matrix.print(vorkomma);
      matrix.drawPixel(12, 6, HIGH);
      matrix.drawPixel(12, 7, HIGH);
      matrix.setCursor(14, 0);
      if (nachkomma < 100) {
        matrix.print("0");
      }
      if (nachkomma < 10) {
        matrix.print("0");
      }
      matrix.print(nachkomma);
      matrix_schreiben = true;
    }
  }
  return matrix_schreiben;
}

bool over(byte aktion) {
  static unsigned long lastmillis = millis();
  const unsigned long schrittTime = 50; // Zeit in ms
  static unsigned int i = 0;
  bool matrix_schreiben = false;
  static bool aktiv = false;
  if (aktion == 0) aktiv = false;
  if (aktion == 1 & !aktiv) {
    aktiv = true;
    i = 0;
  }
  if (aktiv) {
    if (millis() - lastmillis > schrittTime) // alle xx ms - je nach Schrittime
    {
      lastmillis = millis(); // Merke letzten Aufruf
      //und ab hier muss rein, was Du auf dem Display ausgeben willst
      // HINWEIS! das matrix.write() kann entfallen, da es im loop() ausgeführt wird
      /*
        for ( int i = 0 ; i < width * tape.length() + matrix.width() - 1 - spacer; i++ ) {
      */
      if (i < width * tape.length() + matrix.width() - 1 - spacer)
      {
        i++;
      }
      else
      {
        i = 0;
      }
      matrix.fillScreen(LOW);

      int letter = i / width;
      int x = (matrix.width() - 1) - i % width;
      int y = (matrix.height() - 8) / 2; // center the text vertically

      while ( x + width - spacer >= 0 && letter >= 0 ) {
        if ( letter < tape.length() ) {
          matrix.drawChar(x, y, tape[letter], HIGH, LOW, 1);
        }

        letter--;
        x -= width;
      }
      matrix_schreiben = true;
    }
  }
  return matrix_schreiben;
}

Ich hoffe auf ganz viele Ausrufezeichen!!!!

Benziner:
Guten Morgen
Nun werden die nachkomma nicht mehr angezeigt, bei ereichen von vorkomma 100 springt es auch brav in "over" und wird sauber angezeigt.

Ja, da war wohl auch bei mir gestern spät.
Der Puffer wird ja weiter beschrieben, das führt dann zu eigenartigen Effekten.

Ich hab das mal verucht auf eine andere Art zulösen.
Zum Einen wird die RZ jetzt geschrieben, wenn "RZ1" erkannt.
Die gesamte Ausgabe der RZen ist jetzt ausgelagert.

Zum Anderen übergebe ich an over() jetzt ein byte. 0 heisst, das die Laufschrift abgeschaltet wird, 1 macht sie an und jede andere sorgt nur dafür, das die Laufschrift läuft.
Die entscheidenen Zeilen:

  static bool anaus=false;
  if (x==0) anaus=false;
  if (x==1) anaus=true;
  if (anaus==false) return;

Im loop() wird mit over(2) nur dafür gesorgt, das nachgesehen wird, ob die Laufschrift aktiv ist und dann ggfls. weiterläuft.

So zumindest die Theorie.
Was die Warnung bei if ( letter < tape.length() ) { angeht.. Hm. die Codezeile hab ich so bekommen :wink:

Hier in complett...

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Max72xxPanel.h>

const byte pinCS = 10; // Attach CS=10, DIN=11,CLK=13
const byte numberOfHorizontalDisplays = 4;
const byte numberOfVerticalDisplays = 1;
Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays);

String tape = "Du must schon Gas geben, sonst wird das nichts !";
int spacer = 1;
int width = 5 + spacer; // The font width is 5 pixels

void setup() {
  matrix.setIntensity(2); // Use a value between 0 and 15 for brightness
  matrix.setRotation(0, 1);    // The first display is position upside down
  matrix.setRotation(1, 1);    // The first display is position upside down
  matrix.setRotation(2, 1);    // The first display is position upside down
  matrix.setRotation(3, 1);    // The first display is position upside down
  matrix.setCursor(1, 0);
  matrix.print("-----");
  matrix.write();
  delay(1000);
  Serial.begin(115200);
}
void loop() {
  const byte numChars = 40;
  static char buf[numChars];
  static uint16_t ndx = 0;
  char rc;
  while (Serial.available() > 0) {
    rc = Serial.read();
    if (rc == ';') {
      buf[ndx] = '\0';
      ndx = 0;
      auswertungZeiten(buf);
    }
    else {
      buf[ndx] = rc;
      ndx = (1 + ndx) % numChars;
    }
  }
  over(2);
}

void auswertungZeiten(char * buf1) {
  static unsigned int vorkomma = 0;
  static unsigned int nachkomma = 0;
  char * bez = strtok(buf1, ":");
  char * inh = strtok(NULL, ":");
  char buf2[8];

  if (!strncmp(bez, "RZ1", 3)) {
    sscanf(inh, "%i,%s", &vorkomma, buf2);
    nachkomma = atoi(buf2);
    matrix.setTextSize(0);
    ausgabeRZ(vorkomma, nachkomma);
  }
  if (vorkomma > 99) {        //overload
    over(1);
  }
  else over(0);
}

void ausgabeRZ(const int vk, const int nk)
{
  matrix.fillScreen(LOW);
  if (vk < 10) {
    matrix.setCursor(6, 0);
  } else {
    matrix.setCursor(0, 0);
  }
  matrix.print(vk);
  matrix.drawPixel(12, 6, HIGH);
  matrix.drawPixel(12, 7, HIGH);
  matrix.setCursor(14, 0);
  if (nk < 100) {
    matrix.print("0");
  }
  if (nk < 10) {
    matrix.print("0");
  }
  matrix.print(nk);
  matrix.write();
}

void over(byte x) { // x=0 aus, 1=ein, 2=aktuallisieren
  static unsigned long lastmillis = millis();
  const unsigned long schrittTime = 200;
  static unsigned int i = 0;
  static bool anaus=false;
  if (x==0) anaus=false;
  if (x==1) anaus=true;
  if (anaus==false) return;
  if (millis() - lastmillis > schrittTime)
  {
    lastmillis = millis();
    if (i < width * tape.length() + matrix.width() - 1 - spacer)
    {
      i++;
    }
    else
    {
      i = 0;
    }
    matrix.fillScreen(LOW);
    int letter = i / width;
    int x = (matrix.width() - 1) - i % width;
    int y = (matrix.height() - 8) / 2;
    while ( x + width - spacer >= 0 && letter >= 0 ) {
      if ( letter < tape.length() ) {
        matrix.drawChar(x, y, tape[letter], HIGH, LOW, 1);
      }
      letter--;
      x -= width;
    }
    matrix.write();
  }
}

;( Offensichtlich hat agmue eine gleichlautende Idee gehabt.
Na mal sehen, heute Abend komm ich weider an eine portable, dann schmeiss ich mir erstmal die lib rauf...