Forum: Mikrocontroller und Digitale Elektronik Oled Display W202-XDLG via SPI an Arduino Uno


von Georg Müller (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Zusammen,

ich habe mir ein tolles Projekt angelacht, ich möchte das og. Oled am 
Arduino betreiben.
Irgendwie habe ich gedacht -ich als Arduino newbie- da wird es schon 
Code für geben, Displays werden ja wie Sand am Meer am Arduino 
angebunden...
... nicht aber dieses 2x20 Zeile dot-matrix mit ISP Bus.
Zu allem Überfluss hab ich noch gedacht ISP = I2C!

Was erstmal seltsam ist, das Display ist bestromt und geht nicht an...
Dann kam ich bei lesen des Datenblattes darauf dass es noch on 
geschaltet werden muss:
WriteIns(0x0C); //display on

Es scheint auch keine Bibliothek für das Display zu geben, so dass man 
manuell zumindest mal die initialen Befehlen senden müsste um überhaupt 
ein Text zu bekommen.
Hat jemand eine Idee wie man nur einen HEX Befehl senden kann,

bzw. gibt es noch irgendwie eine Init Routine die man bei dem Display 
einhalten muss, damit überhaupt die Kommunikation zu Stande kommt?

Sorry dass ich so dumm frage, aber ich habe absolut keine Ahnung wie man 
mit Displays kommuniziert und auch keine Ahnung vom Programmierung- die 
Einstieghürde ist einfach zu groß für mich, das habe ich schon beim 
googlen bemerkt.

Grüße Georg

von Heiner (Gast)


Lesenswert?

Hallo

So wie ich die Beschreibung verstehe, kannst Du per Loetbruecken 
einstellen, ob es SPI oder 4 oder 8 Bit Signale erhält.

von Georg Müller (Gast)


Lesenswert?

Danke, ja das hatte ich vergessen zu erwähnen, ja hatte ich schon 
gemacht.
Ebenso habe ich Ich habe das Display mit 5V über Arduino versorgt und 
CLK und MOSI mit Clock und Data auf dem Arduino verbunden.
CS (ich vermute mal ist gleich mit SS)

Ich habe eher ein Programmierproblem.

von Heiner (Gast)


Lesenswert?

Naja, gemäß Beschreibung SPI musst Du aber schon auch MOSI, MISO, CLK, 
CS und die PS Powersupply anschließen

von Heiner (Gast)


Lesenswert?

Und ja, eigentlich müsste es dafür auch entsprechende Libs geben, ich 
weiß aber nicht, ob die auch per SPI angeschlossene Displays ansprechen.

Verstehe aber nicht, warum Du so ein Projekt durchführen willst ohne 
Ahnung zu haben.

von Georg Müller (Gast)


Lesenswert?

Ich sehe einige Lösungswege, bin mir aber nicht sicher welcher der 
richtige ist:

Library aber welche beinhaltet die richtigen Befehle für mein Display - 
zB. Initroutine
(da müsste man eben die Ports wissen, wo was ran kommt, steht in den 
meisten Anleitungen einfach nicht mit drin)

Befehl selber senden, um eventuell mal die Kommunikation und das Display 
on zu bekommen

Vorschlag zu bekommen, wo jemand was vergleichbares gemacht hat.

Machen lassen und Geld für bezahlen

Warum mache ich das wenn ich keine Ahnung habe, ist einfach, weil ich 
mir es leichter vorgestellt habe als es zu sein scheint, immerhin hab 
ich das selber erkannt :-)
Jetzt liegt alles da und ist Geld ausgegeben (es hängt ja noch mehr mit 
dran, das Arduino ist ja mur ein Teil vom ganzen), was soll ich jetzt 
machen?

Vielleicht gibt mir mal jemand einen richtigen Schubs und ich komme 
weiter.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Wenn du was lernen willst, holst du dir eine generische SPI Library für 
Arduino und nutzt diese zur Kommunikation mit dem Display:
https://www.arduino.cc/en/reference/SPI
Dann nutzt du diese, um das Display nach Datenblatt zu initialisieren 
und letztlich auch Text usw. anzuzeigen.

von Andreas S. (Gast)


Lesenswert?

Wenn Dir das alles zu viel is ("böhmische Dörfer"), dann versuch 
zunächst im default Modus (8bit) diese Lib:
https://github.com/crystalfontz/WS0010_demo_code
Wenn das geht und erst dann würde ich auf SPI umlöten und wieder einen
Versuch starten.
Im Allgemeinen sind diese Displays zur "normalen" LiquidCrystal Library
kompatibel und sollten etwas anzeigen.
Bei mir laufen die kleinen 16x02 OLED (WS0010) mit dieser Lib.
Daher kannst Du auch für erste Versuche diese Lib nutzen wenn Du nicht 
unbedingt SPI brauchst.

von Georg Müller (Gast)


Lesenswert?

Cool, das sind 2 gute Ideen, ich werde mich mal daran versuchen, vor 
allem wenn der 8Bit Modus mit LCD´s kompatibel ist, davon bin ich von 
Anfang aus ausgegangen..

2 Fragen hab ich noch, bei der SPI ist da SS = CS bei meinem Oled?
Ich habe es noch nicht umgelötet, aber müsste das Oled schon mal an 
gehen, wenn ich Spannung anlege? Oder muss das noch irgemdwie 
initialisiert werden?

Könnte mal ein Experte einen Blick ins Datenblatt auf den ersten Seiten 
werfen? Steht auch nicht viel Drin versprochen.

Je mehr ich im Vorfeld bestätigt weiß, desto mehr kann ich mir selber 
helfen, wenn ich auf Probleme stoße.

von Andreas S. (Gast)


Lesenswert?

OLED leuchten nicht von selbst - kein Backlight wie ein LCD.
Informiere Dich in z.B. Wikipedia über die Grundlagen der OLED.
Es gibt/gab sogar Fälle wo ein OLED als defekt deklariert wurde weil es
nach dem Anlegen der Versorgungsspannung nicht geleuchtet hat !
Daher ist die Initialisierung der OLED i.A. umfangreicher und 
spezieller.
Im Datenblatt ist daher auch gern die Rede von einer "automatischen
Einschaltroutine" die das Display soweit "scharf schaltet", dass
auch der Standardbefehlsatz der normalen LCD genutzt werden kann.
Ein direkter Austausch gegen ein bestehendes LCD soll so ermöglicht 
werden.

von Andreas S. (Gast)


Lesenswert?

Hab noch was vergessen-ist für 16x02 aber sinngemäß als Hilfe gedacht:
https://www.joy-it.net/files/files/Produkte/COM-OLED16x2/COM-OLED16x2_Anleitung_2021-04-23.pdf

von Veit D. (devil-elec)


Lesenswert?


von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Georg Müller schrieb:
> bei der SPI ist da SS = CS bei meinem Oled?

Ja.

von Andreas S. (Gast)


Lesenswert?

Ein vergleichbares Display:
https://www.winstar.com.tw/de/products/oled-module/oled-character-display/oled-20x2.html
Hatte ich doch Recht :-) - scheint ein WS0010 zu haben und müsste
wie oben erwähnt mit der Standardlib laufen.
In diesen Sinne - gute Nacht noch.

von Spess53 (Gast)


Lesenswert?

Hi

>Daher ist die Initialisierung der OLED i.A. umfangreicher und
>spezieller.

Die OLED Displays von EA lassen sich problemlos mit gut gemachten 
Libraries von LCDs betreiben.

>Hatte ich doch Recht :-) - scheint ein WS0010 zu haben und müsste
>wie oben erwähnt mit der Standardlib laufen.

Kann genauso gut ein RS0010 von Raystar sein.

MfG Spess

von Andreas S. (Gast)


Lesenswert?

... sind doch kompatibel- nur ein anderer Name.
RS ist Raystar und WS ist Winstar
Schau Dir mal die jeweilige Platine an - Raystar,Winstar und Konsorten
(Surenoo Display) kleben nur ihr eigenes Label auf und verkaufen es 
unter ihren Namen (auch joy-it macht das so).
Wer weiß wo die Dinger wirklich her kommen ...
Ich habe hier einige identische 16x02 wo die Platine 1:1 identisch sind
und nur eben ein anderes Herstellerlabel haben.

von Spess53 (Gast)


Lesenswert?

Hi

>... sind doch kompatibel- nur ein anderer Name.

Zumindest mit verschiedenen Datenblättern.

MfG Spess

von Michael U. (amiga)


Lesenswert?

Hallo,

Georg Müller schrieb:
> ... nicht aber dieses 2x20 Zeile dot-matrix mit ISP Bus.
> Zu allem Überfluss hab ich noch gedacht ISP = I2C!

Laut Datenblatt wird es mit der Einstellung 4/8Bit im 6800 Mode 
ausgeliefert.
Damit wäre es wie ein übliches Display mit HD44780 Controller 
anzuschließen, eben RS, R/W, D7...D4 bzw. D7...D0.
Inite-Sequence weicht etwas vom 44780 ab, ist auf Seite 5 aber gut 
beschrieben, die Änderung einer üblichen HD44780-Lib sollte kein Aufwand 
sein.
Die restlichen Kommandos sehen erstmal identisch aus, müßte dann also 
laufen.
Man kann natürlich das Interface auch auf SPI umlöten (Seite 14), 
Programmierbeispiel für die Datenübertragung ist ja auch auf Seite 5, 
Timingdiagramme sind auch alle drin.
Wo ist jetzt das Problem?

Gruß aus Berlin
Michael

von Georg Müller (Gast)


Lesenswert?

Vielen Dank Leute es ist mein eigener Text zu sehen!
Ohne die Tipps und Erklärungen (wie es sein müsste damit es tut) hätte 
ich das nie hinbekommen!

Ich habe es inzwischen mit dem 
https://www.joy-it.net/files/files/Produkte/COM-OLED16x2/COM-OLED16x2_Anleitung_2021-04-23.pdf
zum laufen gebracht.

Nur frage ich mich ob man sich immer um die Buchstabenposition manuell 
kümmern muss, denn wenn man den Text einfach in einem String eingibt, 
dann überschreiten die Buchstaben ein von den 10 Segmenten.
Ich habe mir jetzt so beholfen, aber das geht sicher besser:
#include "iwi_SPI_RS0010.h"
SPI_RS0010 rs;
void setup(){
 rs.initSPI(12,11,13,10);
 rs.begin(16,2,1);
}
void loop(){
 rs.clearBuf();
 rs.drawString(10,0,"F",1,1,1);
 rs.drawString(15,0,"a",1,1,1);
 rs.drawString(20,0,"l",1,1,1);
 rs.drawString(25,0,"t",1,1,1);
 rs.drawString(30,0,"p",1,1,1);
 rs.drawString(35,0,"c",1,1,1);
 rs.displayBuf();
 delay(2);
}


In der Bibliothek gibt es noch folgenden Variablen, mit denen ich aber 
nicht wirklich was anfangen kann, da die einfach zu grob beschrieben 
sein, bzw. abgekürzt sind.
Vielleicht hat ja jemand eine Idee, welcher Befehl geeigneter wäre so 
dann die Buchstaben eines Wortes automatisch in die Segmente passen.

void initSPI(uint8_t miso, uint8_t mosi, uint8_t clk, uint8_t cs);
  void begin(uint8_t cols, uint.8_t rows, uint8_t mode);
  void grafika(uint8_t dat[]);
  void displayBuf(void);
  void clearBuf(void);
  void createChar(uint8_t[], uint8_t dlugosc);
  void grafika2(uint8_t charmap[], uint8_t x, uint8_t dlugosc);
  void setCursor(uint8_t, uint8_t);
  void drawPixel(int8_t x, int8_t y, uint8_t color);
  void drawBitmap_P(int x, int y, const uint8_t *bitmap, uint8_t w, 
uint8_t h, uint8_t color );
  void drawLine(int8_t x0, int8_t y0, int8_t x1, int8_t y1, uint8_t 
color);
  void drawFastVLine(int8_t x, int8_t y, int8_t h, uint8_t color);
  void drawFastHLine(int8_t x, int8_t y, int8_t w, uint8_t color);
  void fillRect(int8_t x, int8_t y, int8_t w, int8_t h, uint8_t color);
  void drawChar(int x, int y, unsigned char c, uint8_t color, uint8_t 
bg, uint8_t size);
  void drawString(int x, int y, const char * cstring, uint8_t color, 
uint8_t bg, uint8_t text_size);
  void drawInteger(int x, int y, int data, uint8_t color, uint8_t bg, 
uint8_t text_size);
  void drawFloat(int x, int y, float data, uint8_t places, uint8_t 
color, uint8_t bg, uint8_t text_size);
  void drawBoldChar(int x, int y, unsigned char c, uint8_t color, 
uint8_t bg);
  void drawBoldString(int x, int y, const char * cstring, uint8_t color, 
uint8_t bg);
  void drawBoldInteger(int x, int y, int data, uint8_t color, uint8_t 
bg);
  char * floatToString(char * outstr, float value, int places, int 
minwidth=0, bool rightjustify=false);


  void clear();
  void home();

  void noDisplay();
  void display();
  void noBlink();
  void blink();
  void noCursor();
  void cursor();
  void scrollDisplayLeft();
  void scrollDisplayRight();
  void leftToRight();
  void rightToLeft();
  void autoscroll();
  void noAutoscroll();

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Georg Müller schrieb:
> denn wenn man den Text einfach in einem String eingibt,
> dann überschreiten die Buchstaben ein von den 10 Segmenten.

Was meinst du damit? DrawString ist sollte eigentlich genau das sein, 
was es sagt, da sollte man nicht nur einen Buchstaben, sondern eben auch 
eine Kette von Zeichen mit anzeigen können.
Mit X = 0 und Y = 0 setzt man das auf die obere linke Ecke und kann dann 
ein Wort oder so anzeigen, wenn sich die Bibliothek nach den normalen 
Konventionen richtet.
Allerdings kenne ich weder die Software, noch das Display und evtl. ist 
da alles anders - wäre aber ungewöhnlich.

: Bearbeitet durch User
von Andreas S. (Gast)


Lesenswert?

Du hast doch ein 20x02 - also musst Du auch dass so reinschreiben.
Mit Copy + Paste 16x02 zu übernehmen kann nicht richtig sein.
Ändere Dein Code und mach noch einmal ein Test.
An der Libary würde ich(erst einmal) nichts ändern-diese scheint stabil
zu funktionieren.
Auch gibt es von CrystalFonts eine Lib für diese Displays (GitHub).

von Georg Müller (Gast)


Lesenswert?

Andreas S. schrieb:
> Du hast doch ein 20x02 - also musst Du auch dass so reinschreiben.

Habe ich gemacht, hatte aber nichts verändert, leider ist die Schrift 
noch immer Blockübergreifend angeordnet.

Hast Du da einen Link zur Lib auf Git? Ich finde da vieles.

von Georg Müller (Gast)


Lesenswert?

Ja ich glaube die aktuelle Lib passt nicht ganz auf das Display, sieht 
man daran, dass wenn ich:
 rs.begin(20,0,1); eintrage das Display heller wird.
In der Lib steht aber: void begin(uint8_t cols, uint8_t rows, uint8_t 
mode);
(Ich würde sagen an der Stelle sollte die Reihe sein)

von Michael U. (amiga)


Lesenswert?

Hallo,

Georg Müller schrieb:
> Ja ich glaube die aktuelle Lib passt nicht ganz auf das Display,
> sieht
> man daran, dass wenn ich:
>  rs.begin(20,0,1); eintrage das Display heller wird.
> In der Lib steht aber: void begin(uint8_t cols, uint8_t rows, uint8_t
> mode);
> (Ich würde sagen an der Stelle sollte die Reihe sein)

Was soll denn rs.begin(20,0,1); bewirken?
Ein Display mit 20 Zeichen pro Ziele, mit 0 Zeilen im Mode 1?
Welche Parameter erwartet werden steht doch da, was cols, Rows bedeuten 
sollte eigentlich doch klar sein, was mode bewirkt sollte die 
Beschreibung der Lib erklären können.

Gruß aus Berlin
Michael

von Georg Müller (Gast)


Lesenswert?

Hab ich absichtlich auf 0 gesetzt, um zu sehen was passiert.
20 Zeichen 0 Zeilen und das Display wurde nur heller...

Ist das die Beschreibung im CCP file?

void SPI_RS0010::begin(uint8_t cols, uint8_t lines, uint8_t mode) {
  // set number of lines

/*
  digitalWrite(_cs, HIGH);
  delay(50);
  digitalWrite(_cs, LOW);
  delay(50  );
  digitalWrite(_cs, HIGH);
*/
delay(500);

if (lines == 2) command(RS_2LINE); //
else command(RS_1LINE);
//function set 2linie, 5x8, WesternEuropeanII
delay(7);
if (mode == 1) command(RS_GRAPHIC);//Graphic   RS_GRAPHIC; //tryb 
graficzny
else command(RS_CHARACTER); //Alfanumeryczny
delay(7);
command(0x0E);//Display on, Cursor ON, Cursor Blinking
delay(7);
command(RS_CLEARDISPLAY);//clear display
delay(7);
command(RS_RETURNHOME);//Display Home
delay(7);
command(RS_ENTRYSHIFTINCREMENT);//Increment and Scroll
delay(7);
command(RS_CLEARDISPLAY);//clear display
delay(7);
command(0x0c);//display on

von PittyJ (Gast)


Lesenswert?

Ich wäre für die Einführung eines Programmierführerscheins.
Das bizarre Copy und Paste hier ist kaum zu ertragen.
Der TE versteht überhaupt nicht, was er da tut. Dabei gibt es so viele 
nette Hobbies....

von Andreas S. (Gast)


Lesenswert?

Mach doch erst einmal Deine Versuche im 8bit Modus mit der
Standard Liquidcrystall Lib.
Bei mir wird damit zumindest was angezeigt,alles weitere kannst Du
austesten wenn es programmiertechnisch besser läuft.
Zum Thema "Modus" - es gibt nur zwei.
Welche dass sind ? Das hast Du hier auch per copy&paste bereits
rein kopiert und versuche mal die Zeilen gedanklich zu verarbeiten.

von Georg Müller (Gast)


Lesenswert?

Ja klar kein Ding, habe ich auch schon bemerkt dass ich so einfach nicht 
voran komme, deshalb hab ich mir mal die Basics angefangen anzusehen, 
aber das wird vermutlich meinen zeitlichen Rahmen sprengen, da ich 
einfach so viel Zeit nicht aufbringen kann um dahin zu kommen, wo man 
müsste, deshalb auch der Versuch einfach die paar Brocken 
zusammenzukopieren.

Man kann leider nicht in allem ein Experte sein, Arbeit Haus Hof Kind 
Auto´s und noch das Elektronik Hobby (wenn man alles selber und alleine 
macht)

Aber ich versuche mal wie weit ich komme, wenn man bei Null anfängt, 
immerhin läuft mal das Display so zu 95%, danke dafür und mehr wollte 
ich auch hier nicht erreichen.

von jo (Gast)


Lesenswert?

20x2 LCD besorgen und im 4bit-Modus (weniger Kabel) betreiben.

Dann holst du dir in der Arduino IDE den Sketch
 File->Examples->LiquidCrystal->HelloWorld und/oder
 File->Examples->LiquidCrystal->Display

und spielst mal eine halbe Stunde damit rum.

Sich auf 
https://www.arduino.cc/en/Tutorial/LibraryExamples/LiquidCrystalDisplay 
Info holen (das ist im Display-Sektch verlinkt) hilft dir sicher auch 
weiter.

Mit diesem Setup kannst du dein Projekt weiter vorantreiben - und 
ersparst dir erstmal eine Menge Frust.
Sobald Du in der Sache mal ein wenig drin bist, nimmst dir das 
OLED-Display vor. Ich könnte fast wetten, das funktioniert dann 
automatisch ...

just my 2ct

von Georg Müller (Gast)


Lesenswert?

Danke Euch für die Hilfe, wie gesagt so weit wäre ich alleine nicht 
gekommen...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.