Arduino Mega 2560 mit OLED Adafruit SSD1306

Wenn man nur zwei OLED Displays nutzen will, dann muss man nur die richtigen Displays kaufen. Bei einigen meiner Displays kann man die Adresse ändern.

Zur U8glib, natürlich musst du diese in der IDE installieren und im Sketch einbinden. Auch die Befehle sind sicher andere als bei der Lib von Adafruit. Entschuldige, aber dieses Wissen hatte ich vorausgesetzt, ich habe nicht erkannt das du blutiger Anfänger bist.

Gruß

MiReu

MiReu:
Zur U8glib, ...

Warum U8glib und nicht U8g2? "Note: There will be no more development for U8glib. Please use u8g2." (Quelle)

Hast natürlich recht, mein Fehler :frowning:

Ich nutze ja inzwischen auch die Neue, jetzt auch fehlerfrei.

MiReu:
... jetzt auch fehlerfrei.

Gerne würde ich dem TO diese Bibliothek als mögliche Alternative empfehlen, leider funktioniert die Installation (IDE 1.6.5) nicht:

  • Wie in u8g2install beschrieben, wird keine Bibliothek angeboten.
  • Mittels "Add ZIP Library" und der Datei u8g2-master.zip bekomme ich die Fehlermeldung "Specified folder/zip file does not contain a valid library".
  • Wenn ich die ZIP-Datei entpacke in das Verzeichnis "u8g2", bekomme ich die Fehlermeldung "fatal error: U8g2lib.h: No such file or directory"

Verwendeter Sketch vom setup_tutorial:

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

U8G2_SSD1306_128X64_NONAME_1_HW_I2C oled(U8G2_R0);
 
void setup(void) {
  oled.begin();
}

void loop(void) {
  oled.firstPage();
  do {
    oled.setFont(u8g2_font_6x12_tr);
    oled.drawStr(0,12,"21.8.2017 11:11");
  } while ( oled.nextPage() );
}

So soll es aussehen:

IMG_7707.png

Wie mache ich es richtig?

agmue:
Gerne würde ich dem TO diese Bibliothek als mögliche Alternative empfehlen, leider funktioniert die Installation (IDE 1.6.5) nicht:

  • Wie in u8g2install beschrieben, wird keine Bibliothek angeboten.
  • Mittels "Add ZIP Library" und der Datei u8g2-master.zip bekomme ich die Fehlermeldung "Specified folder/zip file does not contain a valid library".
  • Wenn ich die ZIP-Datei entpacke in das Verzeichnis "u8g2", bekomme ich die Fehlermeldung "fatal error: U8g2lib.h: No such file or directory"

Verwendeter Sketch vom setup_tutorial:

#include <Arduino.h>

#include <U8g2lib.h>
#include <SPI.h>
#include <Wire.h>

U8G2_SSD1306_128X64_NONAME_1_HW_I2C oled(U8G2_R0);

void setup(void) {
 oled.begin();
}

void loop(void) {
 oled.firstPage();
 do {
   oled.setFont(u8g2_font_6x12_tr);
   oled.drawStr(0,12,"21.8.2017 11:11");
 } while ( oled.nextPage() );
}



So soll es aussehen:

![IMG_7707.png|139x78](upload://anxuXTFQctxNrRvnISARhWwAhrq.png)

Wie mache ich es richtig?

Ist das jetzt dein Ernst? :o

Okay, dann hier die Erklärung von einem Anfänger:

  • Benötigte Lib für den Arduino gibt es hier. Als Zip runterladen und dann in der IDE installieren.

So könnte es dann aussehen

Gruß

MiReu

Nachtrag:
Darf ich fragen warum du mit so einer alten IDE arbeitest? Ich nutze die aktuelle V 1.8.3.
Auch verstehe ich nicht warum du #include <SPI.h> in deinem Sketch hast, wenn du dann I²C nutzt?

SCDIRK:
Dank dir Deltaflyer

Das kompelieren hat geklappt. Nur bleibt mein Display Schwarz.

Was hast du denn für eine I²C Adresse eingetragen?

Mögliche Adressen, bei vielen mir bekannten Displays:

  • 0x78 (sehr oft Auslieferungszustand)
  • 0x7A

OLED-I²C.jpg

Da du mehrere Displays nutzen möchtest, kannst du auch SPI Displays nehmen.

Gruß

MiReu

OLED-I²C.jpg

MiReu:
Ist das jetzt dein Ernst? :o

Ja natürlich.

MiReu:

  • Benötigte Lib für den Arduino gibt es hier. Als Zip runterladen und dann in der IDE installieren.

Ich hatte u8g2 (GitHub - olikraus/u8g2: U8glib library for monochrome displays, version 2) anstelle U8g2_Arduino erwischt. Olli hat mich verwirrt.

Danke, nun geht es :slight_smile:

Es ist meine 70. Bibliothek, die ich installiert habe, das schützt nicht vor Fehlern.

MiReu:
Darf ich fragen warum du mit so einer alten IDE arbeitest?

Weil dann auch die Erweiterungen für ATtiny gut funktionieren. Nachfolgende IDEs waren fehlerbehaftet, dann der Streit arduino.org und .cc, irgendwie "Unruhe". Bislang gab es keine Notwendigkeit, da bin ich dann auch faul.

MiReu:
Auch verstehe ich nicht warum du #include <SPI.h> in deinem Sketch hast, wenn du dann I²C nutzt?

Weil das angemeckert wurde, ist jetzt raus (siehe aber #29!). Ich hatte alle *.h, *.cpp und *.c in ein Verzeichnis kopiert, dann bekam ich ein lauffähiges Programm.

Danke!

Die aufgedruckten Adressen muß man noch durch zwei teilen, da beim Arduino das niedrigste Bit nicht mitgerechnet wird. Also 0x78 -> 0x3C und 0x7A -> 0x3D. Der SMD-Widerstand muß umgelötet werden.

@SCDIRK: Nun kann ich Dir guten Gewissens einen Blick auf U8g2 empfehlen :slight_smile:

agmue:
Die aufgedruckten Adressen muß man noch durch zwei teilen, da beim Arduino das niedrigste Bit nicht mitgerechnet wird. Also 0x78 -> 0x3C und 0x7A -> 0x3D. Der SMD-Widerstand muß umgelötet werden.

Das wusste ich noch nicht, Danke für die Aufklärung. Da hätte ich ganz schön gesucht, wenn mein "ZweiDisplay" Projekt an den Start geht.

Bei Adressierung ist das ganz gut beschrieben. Mal wird das R/W-Bit mitgezählt, mal nicht. Da sorgt ein I2C_Scanner für Klarheit.

MiReu:
Auch verstehe ich nicht warum du #include <SPI.h> in deinem Sketch hast, wenn du dann I²C nutzt?

Doch nicht so einfach. In U8x8lib.h steht

/* Assumption: All Arduino Boards have "SPI.h" */
#define U8X8_HAVE_HW_SPI

und in U8x8lib.cpp

#include "U8x8lib.h"
#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif

Dieses include führt dann im Sketch zu einer Fehlermeldung. Daher habe ich in U8x8lib.h das define auskommentiert. Leider ist mir keine bessere Lösung eingefallen. Eigentlich müßte es über den Constructor unterschieden werden.

agmue:
Ich hatte u8g2 (GitHub - olikraus/u8g2: U8glib library for monochrome displays, version 2) anstelle U8g2_Arduino erwischt. Olli hat mich verwirrt.

Au weia, ich bitte um Entschuldigung. Wenn ich wüsste, wann und wo ich Dich verwirrt habe, kann ich gerne versuchen das zu korrigieren.

Dieses include führt dann im Sketch zu einer Fehlermeldung. Daher habe ich in U8x8lib.h das define auskommentiert. Leider ist mir keine bessere Lösung eingefallen. Eigentlich müßte es über den Constructor unterschieden werden.

U8g2 setzt auf die Arduino SPI.h und Wire.h bis auf, d.h. beide libs müssen includiert werden, damit U8g2/U8x8 korrekt übersetzt werden können. Leider gibt es boards bei denen SPI und/oder Wire nicht vorhanden sind. U8g2/U8x8 versuchen zu erraten, ob es die libs gibt, aber das gelingt nicht immer. Das Auskommentieren der defines ist insofern eine durchaus gute Lösung.

Grüße,
Oliver

olikraus:
Au weia, ich bitte um Entschuldigung. Wenn ich wüsste, wann und wo ich Dich verwirrt habe, kann ich gerne versuchen das zu korrigieren.

Hallo Oliver,
für meine Dusseligkeit muß ich mich, wenn überhaupt, entschuldigen. Ein paar Stichwörter zum Ablauf:

An meiner Uhr wollte ich eine kleine Textanzeige ergänzen. Bibliothek von Adafruit braucht zu viel Speicher, aber hier hatte ich von Deiner gelesen. Also gesucht und (die falsche hier GitHub - olikraus/u8g2: U8glib library for monochrome displays, version 2) gefunden. Durch Kopieren aller notwendigen Dateien ins Programmverzeichnis habe ich dann speichersparend Zeichen auf das OLED bekommen. Da mir das nicht gefiel und ich weiß, daß Du hier mitliest, habe ich eine umfangreiche Dokumentation meines Scheiterns zur Veröffentlichung in einem eigenen Thema zusammengestellt.

Dank der Erkenntnisse aus diesem Thema kann ich mir diese Blamage nun sparen.

Der Text auf GitHub - olikraus/u8g2: U8glib library for monochrome displays, version 2 suggeriert mir, dies sei die richtige Bibliothek für meine IDE. Tatsächlich ist diese aber bei GitHub - olikraus/U8g2_Arduino: U8glib V2 library for Arduino zu finden. Auch in den *.h und *.cpp ist mir kein entsprechender Hinweis auf die Füße gefallen. Die Bibliotheken für den Teensy erzeugen Warnmeldungen beim Compilieren.

Hilft Dir das, meinen falschen Pfad zu erkennen?

olikraus:
Das Auskommentieren der defines ist insofern eine durchaus gute Lösung.

Änderungen in der Bibliothek möchte ich eigentlich nicht machen müssen.

Wenn ich mittels U8X8_SSD1306_128X64_NONAME_HW_I2C Hardware I2C wähle, sollte doch klar sein, daß ich SPI nicht verwenden möchte. Das wäre zumindest so meine Erwartung.

olikraus:
... d.h. beide libs müssen includiert werden ...

Ein gleichzeitiges Ansprechen eines OLED mit SPI und I2C kann ich mir auch nicht so richtig sinnvoll vorstellen.

Ich würde mich freuen, wenn durch meine Dusseligkeit Deine Bibliothek noch besser würde :slight_smile:

Tatsächlich ist diese aber bei GitHub - olikraus/U8g2_Arduino: U8glib V2 library for Arduino

Genau, wobei eigentlich der direkte Zugriff auf dieses Verzeichnis nicht notwendig sein sollte, da U8g2 aus der IDE heraus installiert werden kann (Library Manager). Hier nochmal (?) der link mit den Screenshots:

Das Installieren aus der IDE heraus müsste (soweit ich mich erinnere) auch den Teensy gelten.

Wenn ich mittels U8X8_SSD1306_128X64_NONAME_HW_I2C Hardware I2C wähle, sollte doch klar sein, daß ich SPI nicht verwenden möchte. Das wäre zumindest so meine Erwartung.

Natürlich. Tatsächlich ist es auch egal, ob man SPI.h includiert oder nicht. Die Arduino IDE sorgt dafür, dass der SPI code NICHT auf deinem uC landet, da er ja gar nicht verwendet wird. Anders gesagt, die Arduino IDE optimiert den SPI code wieder aus deinem Programm heraus obwohl der mittels include eingebunden wurde.

Änderungen in der Bibliothek möchte ich eigentlich nicht machen müssen.

Genau, das sollte auch nicht notwendig sein, wenn du ein offizielles Board und die offizielle Arduino IDE verwendest.
Insofern war ich (und bin immer noch) etwas verwirrt von diesem Thread. Eigentlich sollten U8g2 recht einfach nutzbar sein.

Grüße,
Oliver

olikraus:
Genau, wobei eigentlich der direkte Zugriff auf dieses Verzeichnis nicht notwendig sein sollte, da U8g2 aus der IDE heraus installiert werden kann (Library Manager). Hier nochmal (?) der link mit den Screenshots:

u8g2install · olikraus/u8g2 Wiki · GitHub

Diese Seite hatte ich gefunden, meine alte, sonst aber gut funktionierende IDE 1.6.5 zeigt ein leeres Fenster:

IDE 1.6.5_1.png

Erst nach der ZIP-Installation wird die Bibliothek angezeigt:

IDE 1.6.5_2.png

Die ZIP-Installation macht mir nichts, nur mußte ich halt die richtige Bibliothek im Netz finden.

olikraus:
Das Installieren aus der IDE heraus müsste (soweit ich mich erinnere) auch den Teensy gelten.

Für meine Uhr benutze ich einen Nano, probiert habe ich mit einem UNO. Mein Teensy animiert APA102-LEDs.

olikraus:
Natürlich. Tatsächlich ist es auch egal, ob man SPI.h includiert oder nicht. Die Arduino IDE sorgt dafür, dass der SPI code NICHT auf deinem uC landet, da er ja gar nicht verwendet wird. Anders gesagt, die Arduino IDE optimiert den SPI code wieder aus deinem Programm heraus obwohl der mittels include eingebunden wurde.

Mein Testsketch:

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

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

void setup(void)
{
  oled.begin();
  oled.setFont(u8x8_font_artossans8_r);
  oled.drawString(0, 0, "Hallo Welt!");
}

void loop(void) {}

Fehlermeldung:

F:\Arduino\libraries\U8g2\src\U8x8lib.cpp:42:17: fatal error: SPI.h: No such file or directory
#include <SPI.h>
^
compilation terminated.
Fehler beim Kompilieren.

Da bin ich dann schonmal verwundert, da ich SPI nicht verwenden möchte. Also die fehlende Zeile ergänzt. Meldung:

F:\Arduino\libraries\U8g2\src\clib\u8g2_polygon.c: In function 'pg_hline':
F:\Arduino\libraries\U8g2\src\clib\u8g2_polygon.c:219:10: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
if ( y >= u8g2_GetDisplayHeight(u8g2) ) // does not work for 256x64 display???
^
F:\Arduino\libraries\U8g2\src\clib\u8g2_polygon.c:225:13: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
if ( x1 >= u8g2_GetDisplayWidth(u8g2) )
^
F:\Arduino\libraries\U8g2\src\clib\u8g2_polygon.c:229:13: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
if ( x2 >= u8g2_GetDisplayWidth(u8g2) )
^
F:\Arduino\libraries\U8g2\src\clib\u8g2_polygon.c:237:13: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
if ( x2 >= u8g2_GetDisplayWidth(u8g2) )
^
F:\Arduino\libraries\U8g2\src\clib\u8g2_polygon.c:241:13: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
if ( x1 >= u8g2_GetDisplayWidth(u8g2) )
^
F:\Arduino\libraries\U8g2\src\clib\u8x8_d_sbn1661.c:73:13: warning: 'u8x8_sbn1661_out' defined but not used [-Wunused-function]
static void u8x8_sbn1661_out(u8x8_t *u8x8, struct u8x8_sbn1661_vars *v, void *arg_ptr)
^

Der Sketch verwendet 5.908 Bytes (18%) des Programmspeicherplatzes. Das Maximum sind 32.256 Bytes.
Globale Variablen verwenden 394 Bytes (19%) des dynamischen Speichers, 1.654 Bytes für lokale Variablen verbleiben. Das Maximum sind 2.048 Bytes.

Also ist das auch nicht richtig.

Was nun?

olikraus:
Genau, das sollte auch nicht notwendig sein, wenn du ein offizielles Board und die offizielle Arduino IDE verwendest.

Ich nutze die offizielle IDE und wähle "UNO". Die Hardware aus Fernost sollte m. E. keine Rolle spielen.

olikraus:
Insofern war ich (und bin immer noch) etwas verwirrt von diesem Thread. Eigentlich sollten U8g2 recht einfach nutzbar sein.

Konnte ich Dich "entwirren"?

Du hast eine tolle Bibliothek geschrieben, daher gebe ich mir auch alle Mühe, meinen dusseligen Ansatz zu erklären, damit möglichst viele Arduino-Nutzer Deine Bibliothek nutzen können :slight_smile:

Hmm, also, nunja, ich lese hier zum ersten mal, dass der Lib-Manager nichts anzeigt. Die U8g2 ist, wie viele andere Libs, offiziell als Arduino-Lib gelistet. Wenn sich die Arduino IDE mit dem Internet verbindet, sollten die verfügbaren Libs heruntergeladen und angezeit werden.

Grüße,
Oliver

Bei mir wird die Lib im Libmanager der 1.6.5 gelistet, auch wenn ich alle zusätzlichen Links raus werfe und die IDE neu starte.

Gruß Tommy

Ohne Suche kann ich folgende Bibliotheken sehen:

Die gewünschte Bibliothek U8g2 ist leider nicht dabei.

Ich sehe U8g2 - Arduino Libraries und U8g2-2.16.9.zip, also kleines und großes "U", kann das was ausmachen. Ich nutze Win7.

Ich habe bei der Suche Im Lib-Installer beides probiert (u und U) die Lib wird in beiden Schreibweisen angezeigt.

Gruß Tommy