Ausgabe nur bei Änderung

Hi,

Ich versuche gerade etwas. Ich möchte dass Ich etwas nur Seriell ausgebe wenn sich etwas ändert.
Es wird zwar nur etwas ausgegeben wenn ich etwas im Seriellen Monitor eingebe aber wenn ich zwei mal das gleiche eingebe wird das Beides angezeigt. Ich möchte das es nur angezeigt wird wenn sich etwas ändert sprich wenn ich zwei mal das gleiche eingebe soll es das zweite mal nicht angezeigt werden.

Wo liegt mein Fehler?

Mfg

char Eingabe;
String D_Alt;
String D_Neu;

void setup() {
  Serial.begin(9600);
}

void loop()
{
  if (Serial.available() > 0)
  {
    Eingabe = Serial.read();

    D_Neu = Eingabe;

    if (D_Neu != D_Alt)
    {
      Serial.print(D_Neu);

      D_Alt = D_Neu;
    }
  }
}

kontrolliere mal die Einstellungen von deinem Serial.Monitor du schickst sicher Zeilenende-Kennzeichen mit, daher kann was anderes rauskommen als du erwartest.

Gib dir ruhig alles aus was du empfängst:

char Eingabe;
char D_Alt;
char D_Neu;

void setup() {
  Serial.begin(115200);
}

void loop()
{
  if (Serial.available() > 0)
  {
    Eingabe = Serial.read();
    D_Neu = Eingabe;
    Serial.println();
    Serial.print(F("alt=")); Serial.print(D_Alt);Serial.println("|");
    Serial.print(F("neu=")); Serial.print(D_Neu);Serial.println("|");
    if (D_Neu != D_Alt)
    {
      Serial.print(F("nun=")); Serial.println(D_Neu);
      D_Alt = D_Neu;
    }
  }
}

außerdem: Finger weg vom Arduino String Objekt.
Wenns wirklich nicht anders geht, lies dir das mal durch

... und 9600 ist sowas von 1970 ...

Warum benutzt Du String, wenn Du nur 1 Zeichen vergleichst? Da wäre char besser.

Gruß Tommy

Peterss:
Wo liegt mein Fehler?

Interessante Frage. Ich sitze vermutlich dem gleichen Denkfehler auf wie Du. Wie sieht's denn aus, wenn Du char statt String benutzt? Warum überhaupt String?

Gruß

Gregor

Hi,

Okay ich habe im Seriellen Monitor Kein Zeilenende eingestellt jetzt Funkt es.

Frage was hat es mit dem F im Serial.print auf sich?

Serial.print(F("nun="));

Ich muss ehrlich sagen ich bin noch nicht so bewandert mit den Datentypen. Ich wollte aber auch nicht nur ein Zeichen vergleichen sondern alles was ich eingebe.

Also der Plan ist dann für ein Späteres Projekt ein OLED Display zu vergleichen ob sich was ändert bevor ich das Display neu beschreibe.

Mfg

Wenn du ganze Strings einlesen willst bist du so aber auf dem falschen Weg

Wie man eine Zeile von der seriellen Schnittstelle einliest die mit einem Linefeed abgeschlossen ist:
https://forum.arduino.cc/index.php?topic=634159.msg4293510#msg4293510

Generell erscheint mir der Vergleich aber überflüssig. Ob man den gleichen Text nochmal schreibt ist eigentlich egal

Hi

Da Du der Einzige bist, Der auf dem OLED rumschreibt, sollte Dir selber bekannt sein, wann sich was geändert hat.

Zu Deiner letzten Frage: Das gibt "run=" aus - der Text wird aber nicht in den RAM kopiert, sondern bleibt im Flash beim restlichen Programm - Das spart Dir jede Menge RAM ein - also pro Zeichen ein Byte.
Im HEX-File stehen die Texte eh schon drin, Die brauchst Du nicht noch Mal im RAM.
Diese Art Texte anzuzeigen ist erst ab zwei Zeichen sinnvoll (also das F-Makro).
Wenn Du mehrfach den gleichen Text ausgeben willst, mache Das jeweils in einer Funktion - so brauchst Du den Text ebenfalls nur 1x im Flash.
Aka

ausgabeTemperatur();
...
void ausgabeTemperatur(){
   Serial.print(F("Temperatur"));
}

MfG

Hi,

Also wäre es sinnvoll immer mit dem F Serial.print benutzen?

Es soll eine Temperaturanzeige werden. Meine Idee war da, das Display eben nur zu beschreiben wenn sie etwas ändert. Sagen wir mal der Loop läuft 100 mal in der Sekunde durch (ist das realistisch?) aber die Temperatur ändert sich sagen wir mal in 10 Min 1 Mal wird das Display 60 000 mal neu beschrieben was er eigentlich nicht muss. Ist das nicht unnötige Rechenleistung die ich verbrauche ? Oder sehe ich das falsch?

Und was hat das mit dem Einlesen von der seriellen Schnittstelle zu tun? Das sind zwei völlig unterschiedliche Dinge.

Bei Temperatur-Sensoren ist das sinnvoll. Aber da kann man einfach Integer vergleichen. Man sollte auch einfach die Sensoren nur alle x Sekunden auslesen

Peterss:
...Sagen wir mal der Loop läuft 100 mal in der Sekunde durch (ist das realistisch?).....

Das ist sehr stark vom eingesetzten Prozessor abhängig!

Gruß Fips

Serenifly:
Und was hat das mit dem Einlesen von der seriellen Schnittstelle zu tun? Das sind zwei völlig unterschiedliche Dinge.

Ich wollte auch erstmal etwas rumprobieren. Ich wollte dann auch das was aktuell auf dem Display steht in einem String speichern und dann vergleichen dafür muss ich mich aber noch etwas in die Datentypen einlesen.

Serenifly:
Bei Temperatur-Sensoren ist das sinnvoll. Aber da kann man einfach Integer vergleichen. Man sollte auch einfach die Sensoren nur alle x Sekunden auslesen

Ich möchte dann auch mehr anzeigen lassen als nur Temperatur. Beispielsweise Datum was sich nicht jede Sekunde ändert.

Derfips:
Das ist sehr stark vom eingesetzten Prozessor abhängig!

Es wird das ESP8266F Modul.

Mfg

Du denkst viel zu umständlich. Abspeichern und Vergleichen von Werten nur als Zahlen! Umwandlungen in einen String nur zum Zeitpunkt der Ausgabe

Peterss:
...
Es soll eine Temperaturanzeige werden. Meine Idee war da, das Display eben nur zu beschreiben wenn sie etwas ändert. Sagen wir mal der Loop läuft 100 mal in der Sekunde durch (ist das realistisch?) aber die Temperatur ändert sich sagen wir mal in 10 Min 1 Mal wird das Display 60 000 mal neu beschrieben was er eigentlich nicht muss. Ist das nicht unnötige Rechenleistung die ich verbrauche ? Oder sehe ich das falsch?

100 loop()-Durchgänge sind locker machbar. Eines meiner Gebastel macht rund 1.900, ein anderes gut 18.000.

Das mit der Rechenleistung siehst Du richtig. Es fragt sich allerdings, wie relevant das ist. Du könntest mit der eingesparten Energie jedenfalls keine Leseleuchte betreiben.

Wenn Dein OLED-Display eines ist, das auf dem SSD3306 basiert, guck mal hier rein, bevor Du Monsterbibliotheken bemühst.

Gruß

Gregor

Serenifly:
Du denkst viel zu umständlich. Abspeichern und Vergleichen von Werten nur als Zahlen! Umwandlungen in einen String nur zum Zeitpunkt der Ausgabe

Wäre es nicht einfacher das Komplette Display in einer Variable zu speichern und das zu vergleichen als alles einzeln? Wie gesagt es wird mehr als nur Temperatur

gregorss:
Wenn Dein OLED-Display eines ist, das auf dem SSD3306 basiert

Es ist ein SSD1306. Läuft die auch?

Ich habe mich etwas in die U8g2 Lib eingelesen.

Mfg

So in etwas war mein gedankengang

  String Display() {
    Temperatur();
    Datum_uhrzeit();
    rest();
  }

  if (Display != alt) {
    Display.Zeichnen(Temperatur());
    Display.Zeichnen(Datum_uhrzeit());
    Display.Zeichnen(rest());
  }

Hi,

wenn Dir ASCII reicht wäre die SSD1306ascii etwas für Dich, benutze ich gern, da sie so leicht daher kommt.

Gruß André

Peterss:
Wäre es nicht einfacher das Komplette Display in einer Variable zu speichern und das zu vergleichen als alles einzeln?

Wieso soll das einfacher sein? Strings abspeichern und vergleichen ist keine triviale Sache und braucht auch mehr Speicher.

Gerade du als Anfänger solltest dir gründlich überlegen ob du den Aufwand brauchst. Paradoxerweise fehlt dir allerdings das Wissen das richtig einzuschätzen

Das hier zeigt auch dass du nicht richtig mit Funktionen umgehen kannst:

  String Display() {
    Temperatur();
  }

Display.Zeichnen(Temperatur());

Serenifly:
Wieso soll das einfacher sein? Strings abspeichern und vergleichen ist keine triviale Sache und braucht auch mehr Speicher.

Gerade du als Anfänger solltest dir gründlich überlegen ob du den Aufwand brauchst. Paradoxerweise fehlt dir allerdings das Wissen das richtig einzuschätzen

Ich möchte ja auch so viel lernen wie möglich.

Serenifly:
Das hier zeigt auch dass du nicht richtig mit Funktionen umgehen kannst:

  String Display() {

Temperatur();
  }

Display.Zeichnen(Temperatur());

Was ist daran nicht richtig?

Ich mach dir einen Vorschlag. Ich mache das erst so wie du sagst und wenn das klappt versuche ich alles zusammen Deal? :slight_smile:

Peterss:
Es ist ein SSD1306. Läuft die auch?

Darauf, dass meine Bibliothek funktioniert, kannst Du Gift nehmen.

Peterss:
Ich habe mich etwas in die U8g2 Lib eingelesen.

Die ist sicherlich ganz nett, aber eben eine der Monsterbibliotheken, die ich gerne vermeide.

Meine Bibliothek ist sehr einfach und umfasst nur eher einfache Funktionen. Aber sie genügt eigentlich für alles, was so anfallen kann. Aber wenn man auf Schnullibulli steht ...

Gruß

Gregor

Serenifly:
Wieso soll das einfacher sein?

Wie soll jemand, der bekennender Anfänger ist, diese Frage beantworten können?!

Gruß

Gregor