OLED Display SSD1306 , Betrieb "ohne" flackern

Hallo,
ich habe heute den Tag über mit meinem neuem OLED Display SSD1306
erste Versuche gemacht.

Ich habe verschiedene LIBs ausprobiert, alle jedoch mit dem gleichem Ergebniss.

Also, dass OLED Display funktioniert soweit ganz gut.
Was mich stört ist, dass ich es ohne ein "flackern" nicht hinbekomme.
Anbei ein kleiner, einfacher Sketch eines Versuches.

Das "flackern" kommt definitiv von dem "oled.clear();" im void loop.

Ohne dieses "oled.clear();" im Loop funktioniert es ohne flackern,
jedoch zeigt das Dispay mit zunehmender Wertänderung nur Hhieroglyphen.

Dies bedingt dadurch, das der "alte" Inhalt nicht in der Anzeige "gelöscht" wird, sondern überschreiben. So wir im Laufe der Zeit, durch Werteänderung der Wert als Anzeige unleserlich.
Ich hoffe ich konnte dies einigermaßen beschreiben.

Grüsse Rainer


#include  "DHT.h" 
#define   DHTPIN  12                       
#define   DHTTYPE DHT22      
DHT dht   (DHTPIN, DHTTYPE);                

#include  <Wire.h>
#include  "SSD1306Ascii.h"
#include  "SSD1306AsciiWire.h"
#define   I2C_ADDRESS 0x3C
SSD1306AsciiWire oled;

int  Fehler = 0;

void setup() 
{
  Serial.begin(9600);
  dht.begin();
  Wire.begin();
  Wire.setClock(100000);
  oled.begin(&Adafruit128x64, I2C_ADDRESS);

  oled.setFont(Verdana12);
  oled.displayRemap(true);  // 180 ° drehen
  oled.clear();

}

void loop() 
{
  delay(1000);
  oled.clear();
  
  float T  = dht.readTemperature();
  delay(250);
  float RH = dht.readHumidity();
  delay(250); 

  if (isnan(T) || isnan(RH))                
                {
                  Fehler = (Fehler +1);
                }
                  else 
                  Fehler = Fehler;

  oled.println("  ");
  oled.println(T);
  oled.println(RH);
  oled.println(Fehler);
}

Wenn Du in jedem loop-Durchlauf das ganze Display löschst, brauchst Du Dich über das Flackern nicht zu wundern.

Nur auf dem Display aktualisieren, wenn sich etwas etwas ändert.
Nur den Teil des Display löschen, der von der Änderung betroffen ist.
Entweder durch Zeichnen eines gefüllten Rechtecks in Hintergrundfarbe oder durch Überschreiben des alten Inhalts mit der Hintergrundfarbe.

Gruß Tommy

Hallo Rainer,
habe mal kurz in eine Lib geschaut, die Deinen Header bereitstellt - ist das diese hier? Sieht so aus, als wäre das monochrom und deshalb gibt es wohl auch kein "setColor" oder so.

Falls ja, würde das "Überschreiben in Hintergrundfarbe" vielleicht mit der Methode setInvertMode(bool mode) funktionieren.

image

Also:

oled.setInvertMode(true);
// alten Wert schreiben
oled.setInvertMode(false);
// neuen Wert schreiben

Ausprobiert habe ich es aber nicht.


Gruß Walter

Hallo, danke für die ersten Tips.
Ja es ist monochrom und die Lib passt.
Ich werde es mal probieren, ob was von den Tips funktiniert.
Zumindest hören sie sich sehr plausibel an.
Nur aufs TFT schreiben wenn sich was ändert ist weng blöd, da später viele Werte
angezeigt werden sollen und jeden dieser zig Werte auf Änderung zu beobachten scheint mir auf den ersten Blick viel zu aufwendig.

Durch den Tip, habe ich jetzt im Web auch was gefunden zuum 2,4" SPI Multicolour TFT , das genau den Tip von Tommy beschreibt. Allerdings so lese ich weiter, gilt das nicht fürs I2C monochrome OLED TFT

Aber nun habe ich paar Ansätze zum probieren, insb. das mit dem
oled.setInvertMode

Grüsse
Rainer

Warum sollte es das nicht?
Warum sollte das Vergleichen mehrerer Werte zu aufwändig sein? Wieviele Werte willst Du denn gleichzeitig darstellen?

Gruß Tommy

Ne. Das ist jeweils eine Zeile für den Vergleich und eine Zeile zusätzlich zur Anzeige für den Merker.

Wenn es wirklich so einfach ist, würde ich mich zu eueren Hinweisen auch über
die passeden Beispiele freuen.

Ansonsten flackert es halt.

Ich frage mich sowieso, woher er die zig Werte (nach meinem Verständnis >20) hernehmen will und wie groß sein Display ist.

Aber wie meistens - die wesentlichen Infos fehlen.

Gruß Tommy

Es geht um das TFT und flacken und nicht die Anzahl der Werte und wieso & warum,
das driftet so ab und für das Thema flacken sind alle Infos da.
Sooooooory du driftests definitiv ab.
Anstatt abzudriften würde ich mich über paar handfeste Beispiele
lieber freuen wollen. Es soll doch so einfach sein. Oben sind 2 Werte im Sketch.
Dazu wären die Beispiele nett.
Macht doch einfach für 2 Werte und ob es dann xxx sind ist doch egal.
Lieber kleine Beispiele als gar keine und dann anstatt dessen lieber abdriften.... :blush:

Na...

#include  "DHT.h"
#define   DHTPIN  12
#define   DHTTYPE DHT22
DHT dht   (DHTPIN, DHTTYPE);

#include  <Wire.h>
#include  "SSD1306Ascii.h"
#include  "SSD1306AsciiWire.h"
#define   I2C_ADDRESS 0x3C
SSD1306AsciiWire oled;

int  Fehler = 0;

void setup()
{
  Serial.begin(9600);
  dht.begin();
  Wire.begin();
  Wire.setClock(100000);
  oled.begin(&Adafruit128x64, I2C_ADDRESS);
  oled.setFont(Verdana12);
  oled.displayRemap(true);  // 180 ° drehen
  oled.clear();
}

void loop()
{
  static float lastT = 0;
  static float lastRH = 0;
  delay(1000);
  float T  = dht.readTemperature();
  delay(250);
  float RH = dht.readHumidity();
  delay(250);
  if (isnan(T) || isnan(RH))
  {
    Fehler = (Fehler + 1);
  }
  oled.println("  ");
  if (T != lastT)
  {
    oled.println(T);
    lastT = T;
  }
  if (RH != lastRH)
  {
    oled.println(RH);
    lastRH = RH;
  }
  oled.println(Fehler);
}

Nur als Beispiel wie es gehen KANN.
Dein Problem ist schon das float - das ist nunmal ungenau.
Sagst Du mir, wieviel Zeichen in eine Zeile passen?
Dann sag ich Dir, wie das besser wird.

Na, das solltest Du schon selbst hin bekommen. Es sind ja alle Infos da.

Bevor ich in Deinen Augen wieder abdrifte, steige ich lieber aus.

Wer Fragen als lästig empfindet und unfreundlich abbügelt, bekommt von mir keine weitere Unterstützung.

Gruß Tommy

Hei , super lieben Dank.
Ich kann auch int , mus nicht float sein.
Damit kann ich jetzt bischenn versuchen.
" static" kannte ich noch nicht, damit sieht es wirklich einfach aus.

Ich probiere .... Danke :slight_smile:

Schade, aber dein Post war nicht seht konstruktiv, das es dann eben halt flackert...
Trotzdem Danke dir für die ersten Tips.

Ich hatte Dir die Antwort gegeben. Wenn Dir das zu aufwändig ist, warum soll ich dann noch weitere Erklärungen liefern, die Du ja eigentlich nach Deiner Reaktion nicht wissen willst.

Gruß Tommy

Dann mach das.
Und beantworte meine Frage!

Sorry, war schon am probieren
21 Zeichen pro Zeile ; 8 Zeilen

Tommy, deswegen schrieb ich auf den ersten Blick, ein zweiter ist damit immer offen , für mich als Anfänger :-).. so war es gemeint...

Das wird in die Hose gehen - es war ja nur ein Ansatz.
Es fehlt die Positionierung - mal sehen, was ich in den examples bei greiman finde, dann bau ich das für einen oder zwei Werte.

my_xy_projekt
Gerne Danke,
Wenn du magst kannst du aber auch gerne Stichworte bereitstellen und ich versuche mich zuzuhangeln.
Wie du magst.

Pfiffige Menschen wie Oli Kraus entwickeln praxisnahe Bibliotheken, die sich schnell ändernde Zahlen ohne Flackern darstellen können. Einfaches Beispiel, getestet mit einem ESP32 (lag hier gerade rum):

#include <U8g2lib.h>

U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0);

void setup() {
  u8g2.begin();
  u8g2.setFont(u8g2_font_6x10_mf);
}

void loop() {
  u8g2.setCursor(0, 10);
  u8g2.print(millis());
  u8g2.sendBuffer();
  u8g2.clearBuffer();
  delay(200);
}

Die Bibliothek hat verschiedene Optionen, die man an den konkreten Fall und die benutzte Hardware anpassen sollte.