OLED

Hallo zusammen,

ich nutze ein OLED Display von Adafruit (128x32 I²C). Anstelle der Adafruit Bibliothek verwende ich die SSD1306ascii, das spart Ressourcen für anderen Kram zumal ich nur ein paar Ziffern anzeigen möchte.
Aufbau bisher testweise nur auf dem Steckbrett und Spannungsversorgung per USB vom PC.
Soweit so gut, leider startet das Display mit "Gries" anstelle der Ziffern. Egal ob Reset per Taster oder gleichen Scetch nochmal auf das Board schreiben. Erst das Hochladen eines Scetches mit der Adafruit Bibliothek sorgt für sinnvolle Anzeigen. Sobald es läuft kann ich auch den Scetch mit der anderen Bibliothek draufladen und es funktioniert perfekt.
Konnte bisher nur in Erfahrung bringen, das manche Displays etwas zum "Hochfahren" brauchen sollen und man sich mit einem Delay() von 1-2s vor der Initialisierung des Displays behelfen solle. Leider bringt das scheinbar nichts.
Wonach suche ich? Danke und viele Grüße, Kay

Kay19:
... Wonach suche ich? ...

Nach einer Bibliothek die sehr klein ist und trotzdem vieles von dem beherrscht, was man üblicherweise so will.

Ich habe mir für meine OLED-Displays eine eigene Bibliothek zusammengeschustert. Die ist noch nicht ganz fertig, aber das, was noch nicht funktioniert, braucht man eh so gut wie nie. Den aktuellen Stand habe ich hier ins Netz gestellt. Entpacke das in das „...sketchbook/libraries“-Verzeichnis und wirf einen Blick in die Headerdatei. Was unklar ist, solltest Du durch ausprobieren klären können.

Wenn nicht ... ich bin ziemlich oft hier.

Gruß

Gregor

PS:

Hallo Gregor,

danke für die Lib, habe mal kurz überflogen.
Die Schriftart ist fest im Header definiert, richtig? Ich hab mir für mein aktuelles Projekt eingebildet das komplette Display mit 6 Ziffern zu füllen. Die letzte Ziffer invertiert. Praktisch ein KM-Zähler mit 100m-Ziffer.
Dafür hab ich mir zwei extra große Schriftarten gebastelt, die nur Ziffern als Zeichen enthalten. Das könnte ich so wahrscheinlich nicht weiterverwenden, oder?

@Kulturbereicherer: ja das mit dem Pferd ist schon wahr..., leider. Ich glaub ich muss doch die Initialisierung im Detail mal zwischen den Libs vergleichen, ev. ist ja dort ein Unterschied zu finden...

Viele Grüße, Kay

Kay19:
Die Schriftart ist fest im Header definiert, richtig? Ich hab mir für mein aktuelles Projekt eingebildet das komplette Display mit 6 Ziffern zu füllen. Die letzte Ziffer invertiert. Praktisch ein KM-Zähler mit 100m-Ziffer.
Dafür hab ich mir zwei extra große Schriftarten gebastelt, die nur Ziffern als Zeichen enthalten. Das könnte ich so wahrscheinlich nicht weiterverwenden, oder?

Die Schriftart ist sehr simpel. Es gibt nur eine Schriftart, die aus Zeichen mit 7x14 Pixeln (wirklich sicher bin ich mir da nicht) besteht. Die Zeichen können nur mit einem ganzzahligen Faktor skaliert werden. Also wirklich minimalst. Reicht aber für alles, was ich bislang damit gemacht habe. Auf einem Raspberry Pi benutze ich die Bibliothek, um so etwas zu erzeugen:

Die letzte der Methoden (irgendwas mit Leerzeichensuche) ist unfertig, der Rest sollte vollständig funktionieren.

Gruß

Gregor

Ja-die Ada-Lib. macht eben schon bisschen mehr, als nur den Speicher voll stopfen.
Unter anderem eben die Displays korrekt starten- guck mal rein, da war was drin (auch kommentiert, glaub ich).

Hab auch vor kurzem so ein OLED eingesetzt. Allerdings 128x64
Kann mich noch erinnern, dass die Lib das "RESET" per Software können muss.
Gibt nämlich Displays mit extra RESET-Pin und ohne.
BTW:
Kann es sein, dass deine Lib ein 128x64 erwartet, du aber ein 128x32 benutzt?
(hmmm.... dagegen spricht wohl, dass du beim Nachladen mit deiner lib Erfolg hast.)

...die Startsequenz ist bei beiden gleich, jedenfalls hab ich keinen Unterschied finden können. Die einzelnen Commands werden in der gleichen Reihenfolge gesendet.
Initialisierung bei beiden Libs mit 128x32 Pixeln.

Ich habe mal einen funktionierenden Sketch auf ein paar interessante Zeilen zusammengestrichen. Das ist vielleicht für die ersten Schritte mit meiner Popelbibliothek hilfreich:

...
#include <gSSD1306.h>
...
gSSD1306 displ; // Erzeugt Instanz mit I2C-Vorgabeadresse (0x3c)
...
void setup()
{
...
  displ.init();
  displ.clear();
  displ.setContrast(40);
...
}
...
displ.putS(12, 18, timestr, 3);
...
displ.update(); // Erst dieser Methodenaufruf führt zu einer Änderung auf dem OLED
...

Gruß

Gregor

Hallo Gregor,
habe mit deiner Lib getestet. Leider gleiches Verhalten wie mit ssd1306ascii. Nach ein paar Sekunden stromlos nur Pixelgries auf dem Display. Den bekomme ich nur mit einem Sketch mit der ada-lib weg. Sobald dieser läuft kann ich auf den Sketch mit deiner Lib wechseln, dann läuft dieser ohne Gries, bis ich die Spannung trenne und nach >5s wieder anlege.

Viele Grüße, Kay

#include "gSSD1306.h"

gSSD1306 oled;
void setup() {
  // put your setup code here, to run once:
  oled.init();
  oled.clear();
  oled.putS(1,1,"setup");
  oled.update();
  delay(2000);

}

void loop() {
  // put your main code here, to run repeatedly:
  oled.clear();
  oled.putS(1,1,"main");
  oled.update();
  delay(2000);
}

Ich verwende die Bibliothek U8x8lib von Olli Kraus, kannst Du ja auch mal probieren:

#include <Arduino.h>
#include <Wire.h>
#include <SPI.h>
#include <U8x8lib.h>

/* Constructor anpassen! */
U8X8_SSD1306_128X64_NONAME_HW_I2C oled(/* reset=*/ U8X8_PIN_NONE);

void setup(void)
{
  oled.begin();
  oled.setFont(u8x8_font_artossans8_r);
  oled.draw2x2String(0, 0, "12345");
  oled.setInverseFont(1);
  oled.draw2x2String(10, 0, "6");
}

void loop(void) {}

OLED123456.png

@gregorss: Was ist eine tbz-Datei? Kann ich leider nichts mit anfangen :frowning:

@Kay19: Um Dein Problem nachvollziehen zu können, wäre ein Testsketch von Dir mit SSD1306Ascii hilfreich.

OLED123456.png

@agmue: ich glaubs nicht, hab die u8g2 mal schnell installiert, was soll ich sagen, gleiches Problem. Arduino an USB anschließen, -->Gries. U8x8 sample draufladen. Display geht kurz aus und wieder an. -->Gries. Ada-lib Beispiel hochladen -->saubere Anzeige, dann im Anschluss U8x8 Beispiel drauf -->saubere Anzeige, dann USB trennen und nach ein paar Sekunden anstecken -->wieder Gries.

anbei der Code mit der ssd1306ascii-lib:

// Test for minimum program size.

// 0X3C+SA0 - 0x3C or 0x3D
#define I2C_ADDRESS 0x3C
#include "SSD1306Ascii.h"
#include "SSD1306AsciiAvrI2c.h"

SSD1306AsciiAvrI2c oled;
char km[8];
int h=0;
//------------------------------------------------------------------------------
void setup() {          
  oled.begin(&Adafruit128x32, I2C_ADDRESS);
  oled.clear();
}
//------------------------------------------------------------------------------
void loop() {
  for (long i=1;i<88888;i++) {
    //testweise dezimalstelle ermitteln modulo op. ermittelt rest
    h=i%10;
    sprintf(km, "%05ld",i/10);
    oled.setFont(oled_v1);
    oled.print(km);
    oled.setFont(oled_v1_inv);
    oled.print(h);
    delay(200);
    oled.setCol(0);
  }
 }

agmue:
@gregorss: Was ist eine tbz-Datei? Kann ich leider nichts mit anfangen :frowning:

Das ist ein mit BZIP gepacktes TAR-Archiv. Was hätten's denn gerne?

Gruß

Gregor

Kay19:
... -->wieder Gries.

Sachma, hast Du einen Link zu einem Datenblatt? Ich hatte mit meiner Bibliothek bislang keine Probleme, ich habe bislang aber nur zwei fast baugleiche OLED-Displays getestet.

Gruß

Gregor

Da sollte man mal die Arda-Lib untersuchen.
Vermutlich wird da eine Anweisung durchgeführt, die das Display braucht und ohne nicht arbeitet.
Diese Anweisung dann übernehmen.

Hi Gregor,

ja, das war meine Intension, wahrscheinlich hab ich was übersehen.

Board: Monochrome 128x32 I2C OLED graphic display : ID 931 : $17.50 : Adafruit Industries, Unique & fun DIY electronics and kits
Datasheets: Downloads | Monochrome OLED Breakouts | Adafruit Learning System

Viele Grüße, Kay

gregorss:
Was hätten's denn gerne?

ZIP, TAR, GZ, TGZ sollte mein PC können.

...sooo, unterschied adalib und ascii-lib:
die adalib macht direkt vor dem Senden der initcommands ein reset, sofern der Pin dazu angeschlossen ist und der entsprechende Konstruktor verwendet wurde.
die ascii-lib hat eine reset-funktion implementiert, nutzt diese aber nicht vor den initcommands. Ich hab also die ::begin aufgebohrt um ihr optional eine Pin-Nummer mitgeben zu können und die ::init ebenfalls angepasst.
Fazit: ::begin ohne resetpinnummer aufrufen führt zu oben beschriebenem Verhalten, mit resetpinnummer ist alles gut. Und das Display braucht den Resetpin zwingend.

ascii-lib neu:

void SSD1306Ascii::init(const DevType* dev, uint8_t resetpin=0) {
  m_col = 0;
  m_row = 0;
  #ifdef __AVR__  
  const uint8_t* table = (const uint8_t*)pgm_read_word(&dev->initcmds);
  #else  // __AVR__
  const uint8_t* table = dev->initcmds;
  #endif  // __AVR
  uint8_t size = readFontByte(&dev->initSize);
  m_displayWidth = readFontByte(&dev->lcdWidth);
  m_displayHeight = readFontByte(&dev->lcdHeight);
  m_colOffset = readFontByte(&dev->colOffset); 
  
  if (resetpin>0) {             
  	reset(resetpin); reset vor initcommands
  }//

  for (uint8_t i = 0; i < size; i++) {
    ssd1306WriteCmd(readFontByte(table + i));
  }
  #if INCLUDE_SCROLLING 
  m_scroll = m_displayHeight != 64 || INCLUDE_SCROLLING < 2 ? 0 : 1;
  #endif  //INCLUDE_SCROLLING 
  clear();
}

Also haste ein Board mit Hardware-Reset-Pin. Im Gegensatz zu dem Board auf dem Foto von gregorss.
Hättste einfacher haben können. Schau mal auf posting #6 :stuck_out_tongue:

agmue:
ZIP, TAR, GZ, TGZ sollte mein PC können.

http://test.szaktilla.de/gSSD1306.tar

Gruß

Gregor

@Kay19: Gut gemacht, Schulterklopfen!

@gregorss: Danke, funktioniert, ist aber nun obsolet.