Tonuino mit Display

Hallo Gemeinde,
ich wollte eine zweite Tonuino Box bauen. Diesmal für mich selber.
Ich habe mir dieses Display zugelegt ( HD44780 1602 LCD Modul Display) da ich denke um die Titel anzuzeigen reicht es wohl aus.
Nur habe ich leider nicht gefunden wie ich es verdrahten muss. Hat soetwas schon jemand umgesetzt? und kann mir vllt ein Bild oder Verdrahtungsplan zusenden? Danke schonmal.

Das Display selber kann man mit 4Bit (7Ports vom Arduino) oder 8 Bit (11 Ports) anschließen.
Es gibt dann aber auch Ausführungen mit i2C Bus (2 Ports) oder seriellem Interface (2 Ports) .
Dazu benötigst du verschiedene Programme zum Ansteuern. Die brauchen unterschiedlich viel zusätzlichen Speicher der bei so kleinen Prozessoren wie dem Nano knapp werden kann.

Versuche das Display erst einmal so also ohne die Tonuino-Software zum laufen zu bringen.

Ein Beispiel:

Dann könntest du versuchen mit den freien Leitungen klarzukommen.

Bedenke das du mit der Originalhardware nicht an die Titel (ich vermute du meinst Namen) herankommst. Könntest also maximal Ordner- und Tracknummern ausgeben.

Super. Vielen Dank erstmal.
Ich werde es mal versuchen.
Vllt ist es ja möglich via Software den ID3Tag auszulesen und wieder zu geben.
Werde mal ein bisschen testen.

Mit dem Standard DFPlayer Mini ist dies nicht möglich. Da müsstest du auf einen anderen Player umrüsten, gibt es ja schon Ideen zu im Forum. Musste mal suchen, Glaube @Peer war das, der da was gemacht hatte.

@TiOs:
Wenn man den DFPlayer durch den BY8001 ersetzt, kann man zumindest die Dateinamen der MP3-Dateien abfragen, allerdings nur im alten 8+3-DOS-Format, d.h. 8 Zeichen Name plus 3 Zeichen Endung. Bei 3 Ziffern für die Numerierung bleiben dann nur noch 5 frei definierbare Zeichen im Dateinamen und bei denen wird auch nicht zwischen Groß- und Kleinschreibung unterschieden. An die ID3-Tags kommt man so leider nicht ran.

Um mehr zu können, braucht man vom Microcontroller aus eine direkte Verbindung zur SD-Karte, das geht nicht einfach über den DFPlayer oder den BY8001. Das geht natürlich mit dm ESP32, aber evtl. mit Einschränkungen auch mit der Standard-Kombination Arduino+DFPlayer. Ein potentialler Lösungsansatz ist in dem folgenden Thread beschrieben, ich hatte das dann aber letztenendes nicht mehr getestet:

Evtl den Kartenleser an den Nano klemmen, und der schickt die Daten dann roh zum DFPlayer?

Dann ist man von den Restriktionen des DFPlayers befreit…

Die komplette Liste die auf der SD Karte ist nochmal im Code auf dem Arduino abbilden. Ich weiß nicht wieviel Speicherplatz das verbraucht, aber dann kannst du alle deine Bauteile weiterverwenden.

Das kann vorsichtig gesagt eng werden, je nachdem wie viel Daten man ablegen will.

Kleine Beispielrechnung: Wenn man die SD-Karte maximal füllt, d.h. 99 Ordner mit je 255 Dateien, und jeder Dateiname 20 Zeichen lang ist, sind das unkomprimiert über 500KB.

Der Arduino hat aber nur 32KB Flash und 1KB EEPROM.

Ich habe mir mal den Spass erlaubt ein ssd1306 mit i2c an den Nano zu klemmen.
Das geht ganz einfach, da der i2c Bus an
SDA -> A4
SCL -> A5
VCC -> 3,3V
GND -> GND
liegt und die Pins noch frei sind.
Mit der DEV-Version und dem Einfügen der beiden Libraries und der Bilddatei im Kopf

#include <Tonuino.h>  //enthält das Tonuino-Logo

#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>



// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET     -1 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

und dem im setup eingefügten Testcode:

  // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // kann auch Addresse 0x3D haben.
    Serial.println(F("SSD1306 allocation failed"));
    for(;;); // Don't proceed, loop forever
  }

  // Show initial display buffer contents on the screen --
  // the library initializes this with an Adafruit splash screen.
  display.display();
  delay(2); // Pause for 2 seconds

  display.clearDisplay();

  display.setTextSize(2); // Draw 2X-scale text
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(0, 0);
  display.println(F("TonUINO"));
  display.println(F("Vers. 2.0"));
  display.setTextSize(1); // Draw 1X-scale text
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(0, 40);
  display.println(F("(c) Thorsten Voss"));

  display.display();      // Show initial text
  delay(10000);
  display.clearDisplay();

  display.drawBitmap(
    (display.width()  - tonuino_width) / 2,
    (display.height() - tonuino_height) / 2,
    tonuino_data, tonuino_width, tonuino_height, 1);
  display.display();
  delay(1000);

zeigt das LCD-Ausgaben möglich sind.
Das läßt den Speicherhunger der DEV-Version dann aber auf 28618 Bytes (93%) des Programmspeicherplatzes wachsen. Das Maximum sind 30720 Bytes.
So waren das etwas über 60%

Ich hänge mal das Bild also tonuino.h hier hinter.

#define tonuino_width  128
#define tonuino_height 64

const uint8_t PROGMEM tonuino_data[] = {
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x7f, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x03, 0x80, 0x0e, 0x0e, 0x07, 0x80, 0x18, 0x00, 0xff, 0x80, 
  0x7f, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x03, 0x80, 0x0e, 0x0e, 0x07, 0xc0, 0x18, 0x03, 0xff, 0xc0, 
  0x7f, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x03, 0x80, 0x0e, 0x0e, 0x07, 0xc0, 0x18, 0x07, 0xc1, 0xe0, 
  0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x0e, 0x0e, 0x07, 0xe0, 0x18, 0x0f, 0x00, 0xf0, 
  0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x0e, 0x0e, 0x07, 0xe0, 0x18, 0x0e, 0x00, 0x78, 
  0x00, 0x70, 0x0f, 0xc0, 0x0c, 0x7c, 0x03, 0x80, 0x0e, 0x0e, 0x07, 0x70, 0x18, 0x1c, 0x00, 0x38, 
  0x00, 0x70, 0x1f, 0xf0, 0x1d, 0xfe, 0x03, 0x80, 0x0e, 0x0e, 0x07, 0x70, 0x18, 0x1c, 0x00, 0x3c, 
  0x00, 0x70, 0x3e, 0xf8, 0x1f, 0xdf, 0x03, 0x80, 0x0e, 0x0e, 0x07, 0x38, 0x18, 0x1c, 0x00, 0x1c, 
  0x00, 0x70, 0x70, 0x3c, 0x1f, 0x07, 0x03, 0x80, 0x0e, 0x0e, 0x07, 0x38, 0x18, 0x38, 0x00, 0x1c, 
  0x00, 0x70, 0x70, 0x1c, 0x1e, 0x03, 0x03, 0x80, 0x0e, 0x0e, 0x07, 0x1c, 0x18, 0x38, 0x00, 0x1c, 
  0x00, 0x70, 0xe0, 0x1e, 0x1c, 0x03, 0x83, 0x80, 0x0e, 0x0e, 0x07, 0x0c, 0x18, 0x38, 0x00, 0x1c, 
  0x00, 0x70, 0xe0, 0x0e, 0x1c, 0x03, 0x83, 0x80, 0x0e, 0x0e, 0x07, 0x0e, 0x18, 0x38, 0x00, 0x1c, 
  0x00, 0x70, 0xe0, 0x0e, 0x1c, 0x03, 0x83, 0x80, 0x0e, 0x0e, 0x07, 0x0f, 0x18, 0x38, 0x00, 0x1c, 
  0x00, 0x70, 0xe0, 0x0e, 0x1c, 0x03, 0x83, 0x80, 0x0e, 0x0e, 0x07, 0x07, 0x18, 0x38, 0x00, 0x1c, 
  0x00, 0x70, 0xe0, 0x0e, 0x1c, 0x03, 0x83, 0x80, 0x0e, 0x0e, 0x07, 0x03, 0x18, 0x1c, 0x00, 0x1c, 
  0x00, 0x70, 0xe0, 0x0e, 0x1c, 0x03, 0x83, 0x80, 0x0e, 0x0e, 0x07, 0x03, 0x98, 0x1c, 0x00, 0x3c, 
  0x00, 0x70, 0xe0, 0x0e, 0x1c, 0x03, 0x83, 0x80, 0x1c, 0x0e, 0x07, 0x01, 0x98, 0x1c, 0x00, 0x38, 
  0x00, 0x70, 0xe0, 0x1c, 0x1c, 0x03, 0x81, 0xc0, 0x1c, 0x0e, 0x07, 0x01, 0xf8, 0x0e, 0x00, 0x78, 
  0x00, 0x70, 0x70, 0x1c, 0x1c, 0x03, 0x81, 0xc0, 0x3c, 0x0e, 0x07, 0x00, 0xf8, 0x0f, 0x00, 0xf0, 
  0x00, 0x70, 0x78, 0x38, 0x1c, 0x03, 0x80, 0xf0, 0x78, 0x0e, 0x07, 0x00, 0xf8, 0x07, 0xc1, 0xe0, 
  0x00, 0x70, 0x3f, 0xf0, 0x1c, 0x03, 0x80, 0xff, 0xf0, 0x0e, 0x07, 0x00, 0x78, 0x03, 0xff, 0xc0, 
  0x00, 0x70, 0x0f, 0xe0, 0x1c, 0x03, 0x80, 0x3f, 0xe0, 0x0e, 0x07, 0x00, 0x78, 0x00, 0xff, 0x00, 
  0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
  0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
  0x00, 0xe0, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
  0x00, 0xe0, 0x00, 0x00, 0x00, 0x03, 0x80, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
  0x00, 0xe0, 0x00, 0x00, 0x00, 0x06, 0xc0, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
  0x00, 0xe0, 0x00, 0x00, 0x00, 0x03, 0x80, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
  0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
  0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
  0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
  0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
  0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
  0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
  0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
  0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x03, 0xc1, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
  0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
  0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
  0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
  0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
  0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x10, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
  0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x38, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
  0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x6c, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
  0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x38, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
  0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
  0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
  0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
  0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
  0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
  0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x03, 0xc1, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
  0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
  0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
  0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
  0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
  0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
  0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 
  0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 
  0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 
  0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
};

Von den ca. 9KB Speicherplatzzunahme fallen aber doch alleine 8KB auf das TonUINO-Logo. Wenn man darauf verzichtet, hat man noch Luft nach oben…

Ich hab das in einer Testversion auch mal mit nem SS1306 umgesetzt, aber eigentlich ist es tatsächlich sinnlos, da keine Namen funktionieren
Das einzig sinnvolle ist die momentane Lautstärke und evtl die im Ordner befindlichen Dateien ausgeben zu lassen.

Bei der Zunahme von 9KB ist das Bild nur gut 1KB du kannst nicht Quelltext mit dem compilierten Speicherplatz vergleichen.
Aber wie dem auch sei, das war ja nur ein Test und das Ergebnis ist schon mal zumindest positiver als ich dachte.
Bei einem Player der mit den Rohfiles angesteuert werden könnte wäre mit einer SD-Karte eine Menge möglich was geht.
So ginge mindestens die Anzeige der Modi also Admin, Hörspiel, Lautstärke Ordner usw.
Aber auch so wäre es schon möglich eine zusätzliche SD anzuschließen, das kostet einen Ausgang als CS-Pin.
Wenn dort die Ordnerstuktur wie auf der Playerkarte vorliegt könnte man in einer zusätlich erzeugten Stuktur die Titel hinterlegen aber auch Piktogramme wie Hund Katze usw. wenn es ein Grafikdisplay ist.

Natürlich ist nicht alles möglich.
Sonst sind wir bald bei einer Handyapp, die die Karte ließt, den Titel spielt, den Text mit Titel asgibt und ein kleines Video dazu bringt. Sollte auch machbar sein.

Das habe ich gar nicht gemacht. 8KB beziehen sich nicht auf den Quelltext, sondern alleine auf die Bildgröße. Das Bild ist doch 128x64 Pixel groß. Das sind 128*64=8192 Bytes, also 8KB. Der Quelltext selbst dagegen braucht sogar mehr als das sechsfache davon, da jedes Pixel mit 6 Zeichen beschrieben wird. Aber von der Quelltextgröße spricht ja niemand.

128*64= 8192 Bits ~ 1000Bytes
Habe zusätzlich einfach übersetzt und verglichen mit und ohne Bildausgabe.

Aaah ein Binär-Display. Das erklärt es…

Wenn Display, dann doch eher wie bei diesem Alternativ-Projekt, oder?

Genau das hatte uich getestet.
Nur wie auch dort in dem Projekt geschrieben, ist man mit dem Nano da am Ende.
Der Speicher ist zu schnell weg.
SD Library, Display und Tonuino überschreiten die Speicherkapazität.
Dann benötigt man viel mehr Speicher, wie das @madias in seinem Projekt schön beschrieben hat.

Hallo,
ich klinke mich auch kurz ein:
Ich habe 2015 ein Projekt mit dem DF-Player plus OLED gemacht (damals noch ohne RFID). Wie schon erwähnt, ist man mit dem DF-Player sehr eingeschränkt. Zumindest konnte ich die Anzahl der Tracks ermitteln und am Display anzeigen (also 1/17) gemacht habe ich das mit einem einfachen Trick (so weit ich mich erinnern kann): Pro Ordner habe ich immer alle Files kurz geöffnet und gewartet, bis einen keinen nächsten mehr gibt - dadurch bin ich auf die Gesamtanzahl gekommen.) Code ist hier: https://drive.google.com/open?id=0B3sgtwOcRTSUZWtpNURnSFJ5VjQ
Selbst damals habe ich schon einen STM32 - bluepill (STM32duino Projekt) genommen (gleiche GRöße und gleicher Preis wie der Nano, nur ganz andere Eckdaten)
Eine Möglichkeit wäre, die RFID Tags zu beschreiben - also mit Interpret/Album/usw… dann würde der verknüpfte Tag ausgelesen und die Infos am Display dargestellt. Dazu wäre dann z.B. eine Smartphone-App notwendig.
Das könnte noch alles mit einem Nano funktionieren - man muss aber schon sehr sparsam sein.
Dann ist aber auch das Ende der Fahnenstange erreicht:
Mit einem anderen Modul, mit dem man zuerst die Files öffnet, dann der Mp3-Platine zuspielt, schaut es anders aus, da man zusätzlich noch die sdFat Library braucht. Um dann noch Filenames (besser Tags der MP3s auslesen) darzustellen, alles zu sortieren (Files/Ordner sind ja nicht alphabetisch oder nach Tracknummern auf der SD-Karte, sondern nach Indexnummer, die danach vergeben wird, welches File zuletzt erzeugt wurde) benötigt man wesentlich mehr RAM als der Nano bietet. Am Bluepill habe 20kB, damit komme ich recht bequem zurecht um auch lange Filenames Id3-Tags auzulesen.

Zusatz: die Adafruit ssd1306 library frisst leider 1kB Flash: in der Datei splash.h const uint8_t PROGMEM splash1_data[] auskommentieren und ein Dummy Array erzeugen.
Warum auskommentieren? Lizenzen…

Eine andere Möglichkeit wäre, auf Adafruit gänzlich zu verzichten und auf ein „Leichtgewicht“ an einer Library zu nehmen, wie z.B.
http://www.rinkydinkelectronics.com/library.php?id=79
Wenn man nur mit Text auskommen möchte: https://github.com/greiman/SSD1306Ascii

The library I posted a link to (SSD1306Ascii) is text-only; no graphics. It has no buffer and total RAM requirements are quite small, less than 100 bytes.

Alternative mit Graphiken (nicht getestet): https://github.com/bitbank2/oled_96

Wenn man mit SD Karten und OLED arbeitet, kann man relativ leicht Windows BMP (128x64 mono) implementieren. Dadurch kann auch der Benutzer die Bilder ändern (z.B. mit Paint). Code dafür ist recht simpel:

void getbmp(char* filename) {
  byte header[62];
  boolean invertpix = 0;
  dirFile.open("/", O_READ);
  file.open(&dirFile, filename, O_READ);
  file.read  (header, 62 ) ; // getting header of BMP
  // some checks
  if (header[0x0] != 0x42 && header[0xE] != 0x28 && header[0x12] != 128 && header[0x16]  != 0x64 ) {
    //#DEBUG# CompositeSerial.println ("BAD pix");
  }
  else {
    if (header[0x36] != 0) // significant color in pix! either black or white
      invertpix = 1;
    file.seekSet(header[0x0A]); // 0A = start picture data
    char secondbuffer[16]; // buffer for one row
    for (int x = 0; x < 64; x++) { // rows
      file.read  (secondbuffer, 16 ) ; // get one row
      for (int y = 0; y < 16; y++) {
        for (int z = 0; z < 8; z++) {
          if (invertpix)
            display.drawPixel((y * 8) + z, 63 - x, bitRead(secondbuffer[y], 7 - z));
          else
            display.drawPixel((y * 8) + z, 63 - x, !bitRead(secondbuffer[y], 7 - z));
        }
      }
    }
    display.display_alt(); // or display.display();
  }
  close_SD_all();
}