OLED Display Probleme - wandernde Schrift

Hallo,
ich wollte mein größeres 1,3 Zoll OLED Display in Betrieb nehmen, doch mir gelingen höchgstens quere, überlappende, sich bewegende Schriften oder die Zeile fängt in der Mitte an…
Was muss ich da ändern?
hier der Sketch-Schnipsel der wohl verantwortlich ist (er ist aus einem Beispielsketch):

#include "ESP8266WiFi.h"
#include <oled.h>

// There are 2 different versions of the board
 //OLED Display=OLED(2,14,4); 
 OLED Display=OLED(4,5,NO_RESET_PIN,0x3c,128,64,false);

Die Information wird auf das Display ausgegeben, doch die Schrift wandert und Zeilenanfänge usw. stimmen nicht.
Wenn ich einfach die Displaydefinition auf 132x64 stelle dann habe ich seltsamerweise Standbild! Aber die Zeile fängt in der Mitte an und der Zeilenwechsel ist ungeeignet!
Was muss ich da ändern?
Das Display dürfte in etwa so eines sein (habe es schon vor 1 Jahr gekauft und lässt sich nicht mehr rekonstruieren):
Display

Ich denke, mit einem vollständigen Programm könnten wir dir eher helfen.

arduling:
doch die Schrift wandert und Zeilenanfänge usw. stimmen nicht.

Was genau meinst du damit? Kannst du vielleicht ein Bild posten? Vielleicht ist dein Problem, dass du einen automatischen Zeilenumbruch beim Erreichen des Displayendes eingestellt hast. Das ist zumindest bei Adafruit Standard.

dies ist das ganze Programm, es ist ein Beispiel-Testprogramm:

/*
 *  This sketch is a part of examples code of ESP9266WiFi lib made by Ivan Grokhotkov
 *
 *  To compile this sketch You need to add this library https://github.com/esp8266/Arduino
 *
 *  This sketch demonstrates how to scan WiFi networks. 
 *  The API is almost the same as with the WiFi Shield library, 
 *
 * OLED class "Display" replace the "Serial" api calls of arduino core.
 */
#include "ESP8266WiFi.h"
#include <oled.h>

// There are 2 different versions of the board
 //OLED Display=OLED(2,14,4); 
 OLED Display=OLED(4,5,NO_RESET_PIN,0x3c,128,64,false);

void setup() {
  Display.begin(); // Instead of Serial.begin(9600)
  Display.setTTYMode(true); // This set the TTY mode

  // Set WiFi to station mode and disconnect from an AP if it was previously connected
  WiFi.mode(WIFI_STA);
  WiFi.disconnect();
  delay(100);

  Display.print("Setup done");
}

void loop() {
  Display.println();
  Display.print("Scan start");

  // WiFi.scanNetworks will return the number of networks found
  int n = WiFi.scanNetworks();
  Display.println("\r\nScan done");
  if (n == 0)
    Display.printf("No networks found");
  else
  {
    Display.printf("%d networks found",n);
    for (int i = 0; i < n; ++i)
    {
      Display.println();
      // Print SSID and RSSI for each network found
      Display.print(i + 1);
      Display.print(": ");
      Display.print(WiFi.SSID(i));
      Display.print(" (");
      Display.print(WiFi.RSSI(i));
      Display.print(")");
      delay(10);
    }
  }
  
  // Wait a bit before scanning again
  delay(5000);
}

und hier noch ein Bild vom Display: (s. Anhang)

Das Bild steht 5 Sekunden still auf diesem Stand.
Dann wird ein neuer scan durchgeführt, wobei das Display eigentlich zeilenweise kontinuierlich beschrieben werden soll. Dabei wandert bei mir das komplette Display nach rechts und scrollt nach unten, wie eine Art Laufschrift.

Ich kenne die Lib nicht, aber ich sehe nirgendwo Befehle, die den Cursor nach oben links setzen oder das Display schwarz ausfüllen oder Updaten (aber das passiert vielleicht von selbst - k.A.). Das könnte ein Problem sein. War das ein mitgeliefertes Beispielprogramm?

Ach, was auch sein kann, ist, dass diese Lib als eine Art Terminal arbeitet: Wenn du was neues "printlnst", dann wird alles nach oben verschoben und unten wird der neue Text angezeigt.

arduling:
... größeres 1,3 Zoll OLED Display in Betrieb nehmen, doch mir gelingen höchgstens quere, überlappende, sich bewegende Schriften oder die Zeile fängt in der Mitte an...
...
Das Display dürfte in etwa so eines sein (habe es schon vor 1 Jahr gekauft und lässt sich nicht mehr rekonstruieren):
Display

Diese Displays kenne ich in 0.9" Größe. Bist Du sicher, dass es nur 128x64 Pixel hat? So viel haben schon meine kleinen. Probiere mal ein Standbild hinzubekommen, an dem Du ggf. mit Lupe zählen kannst. Auch Deine Fehlerbeschreibung klingt für mich nach falscher Größe.

Zudem: Was für eine oled.h benutzt Du da? Hast Du einen Link zu einer Webseite?

Gruß

Gregor

Oder, wenn du keine Lupe zur Hand hast, dann kannst du dir vielleicht ein Programm schreiben, was eine Linie von Links nach Rechts langsam (= 2x/s) oder bei einem '\n' über den seriellen Monitor bewegt und den Pixelwert per USB ausgibt.

Ich bräuchte vielleicht einen einfacheren Probesketch.
Bin grad am Probieren, hatte aber bisher keinen Erfolg.

Bisher am meisten Erfolg hatte ich mit dem oberen Sketch ich dachte da könnte man aufbauen.
Leider kann ich nicht gut programmieren, sonst würde ich selbst...

Steht vielleicht die Display"kennung", keine Ahnung, wie man das nennt, irgendwo auf dem Display (z.B. SSD1306)?

Das steht hinten nicht drauf, ich hab ein Bild mitgesendet.
Ich denke soweit ich im IE recherchiert habe, könnte es ein SH1106 sein.
Aber auch damit habe ich keinen so rechten Erfolg… wie gesagt, der obere Sketch geht noch “am besten”.

arduling:

 OLED Display=OLED(4,5,NO_RESET_PIN,0x3c,128,64,false);

Irgendwas reibt sich da ... auf der Rückseite deines Displays kann man zwischen 0x78 und 0x7A wählen, hier steht aber 0x3C. Ich würde mal 'nen I²C-Scanner versuchen.

HTML-Fan:
Irgendwas reibt sich da ... auf der Rückseite deines Displays kann man zwischen 0x78 und 0x7A wählen, hier steht aber 0x3C. Ich würde mal 'nen I²C-Scanner versuchen.

Bei der IDE und den üblichen Bibliotheken wird das unterste Bit nicht mitgerechnet, weil es Lesen/Schreiben angibt. Also 0x78 und 0x7A durch 2 teilen und man erhält die in der IDE üblichen Werte.

agmue:
Bei der IDE und den üblichen Bibliotheken wird das unterste Bit nicht mitgerechnet, weil es Lesen/Schreiben angibt. Also 0x78 und 0x7A durch 2 teilen und man erhält die in der IDE üblichen Werte.

Ah, sorry, Fehler. Dann würde ich mal eine andere Lib ausprobieren.

.. 0x3C x 2 = 0x78
Denke, Das passt durchaus so - je nach Lib ist die I2C-Adresse 7Bit oder (seltener) 8 Bit.
Ein I2C-Scanner (in den Beispielen enthalten) schadet aber ganz gewiss nicht!
Dann weiß man, auf welcher ID ein Slave antwortet, egal, wie viele Bits das Datenblatt die Lib nun vorgesehen hatte.

MfG

Edit

  • das Datenblatt
  • die Lib

das habe ich schon durchgeführt. Er antwortet auf 0x3c, das dürfte eindeutig sein.

Okay, dann, wie gesagt, würde ich mal ein paar Libs probieren, vielleicht auch herausfinden, was für ein Display mit was für einem Chip du da vor dir liegen hast.

wie kann ich sowas am einfachsten ausprobieren?
mir scheint dass jede lib eine andere syntax hat, daher ist das nicht so einfach auszutauschen und durchzuchecken.
Hab ja schon vieles durchprobiert und dachte der obere sketch ist gut, aber noch etwas Feinschliff nötig.
Übrigens würde ich folgendes Programm verwenden wollten, aber hier hab ich auf der Anzeige leider nichts brauchbares.
Wie könnte ich den sketch anpassen?
Es genügt ja wohl nicht dass ich
#include <Adafruit_SSD1306.h> umwandle in #include “SH1106.h” oder #include "oled.h !?!
dann kann ich den sketch nicht mehr kompilieren, da passt dann inhaltlich was nicht…
Wie kann ich da voran gehen?

(zum Programm: das Programm bewirkt, dass Daten von einem mqtt Server empfangen , die dann auf dem Display sichtbar gemacht werden - es funktioniert mit meinem 0.96 Zoll OLED einwandfrei, nicht aber mit meinem 1.3 Zoll OLED :()

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_GFX.h>
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
 
// Update these with values suitable for your network.
const char* ssid = "XXX";
const char* password = "XXX";
const char* mqtt_server = "XXX";
 
String _DisplayLine1 = "";
String _DisplayLine2 = "";
String _DisplayLine3 = "";
String _DisplayLine4 = "";
 
#define OLED_RESET -1
Adafruit_SSD1306 display(OLED_RESET);
 
WiFiClient espClient;
PubSubClient client(espClient);
long lastMsg = 0;
char msg[50];
int value = 0;
 
void setup_wifi() {
 
delay(10);
// We start by connecting to a WiFi network
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
 
WiFi.begin(ssid, password);
 
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
 
randomSeed(micros());
 
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
 
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
 
if ( strcmp( topic, "display2_line1" ) == 0 )
{
_DisplayLine1 = "";
for (int i = 0; i < length; i++) { _DisplayLine1 += (char)payload[i]; }
}
 
if ( strcmp( topic, "display2_line2" ) == 0 )
{
_DisplayLine2 = "";
for (int i = 0; i < length; i++) { _DisplayLine2 += (char)payload[i]; }
}
 
if ( strcmp( topic, "display2_line3" ) == 0 )
{
_DisplayLine3 = "";
for (int i = 0; i < length; i++) { _DisplayLine3 += (char)payload[i]; }
}
 
if ( strcmp( topic, "display2_line4" ) == 0 )
{
_DisplayLine4 = "";
for (int i = 0; i < length; i++) { _DisplayLine4 += (char)payload[i]; }
}
 
UpdateDisplay();
}
 
void reconnect() {
// Loop until we're reconnected
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
// Create a random client ID
String clientId = "ESP8266Client-";
clientId += String(random(0xffff), HEX);
// Attempt to connect
if (client.connect(clientId.c_str())) {
Serial.println("connected");
 
client.subscribe("display2_line1");
client.subscribe("display2_line2");
client.subscribe("display2_line3");
client.subscribe("display2_line4");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
// Wait 5 seconds before retrying
delay(5000);
}
}
}
 
void UpdateDisplay()
{
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(4);
 
display.setCursor(1,0);
display.print(_DisplayLine1.c_str());
display.setCursor(1,8);
display.print(_DisplayLine2.c_str());
display.setCursor(1,16);
display.print(_DisplayLine3.c_str());
display.setCursor(1,24);
display.print(_DisplayLine4.c_str());
display.display();
}
 
void setup() {
Serial.begin(9600);
 
setup_wifi();
client.setServer(mqtt_server, 1884);
client.setCallback(callback);
 
display.begin( SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(4);
display.display();
}
 
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
}

arduling:
dann kann ich den sketch nicht mehr kompilieren, da passt dann inhaltlich was nicht...
Wie kann ich da voran gehen?

Jede brauchbare Lib hat beispiele dabei. Von denen musst Du ausgehen.
Wenn Du ein lauffähiges gefunden hast und die Funktionen in der xxx.h zu Deinen Anforderungen passen, musst Du ausgehend von diesem Beispiel Deinen Sketch entwickeln.

Gruß Tommy

o.k., also doch von einem sehr einfachen Programm ausgehen und das Display testen, und dann das Ansprechen des Displays (die Sprache), diesen Teil für meinen sketch übernehmen?