Forum: Mikrocontroller und Digitale Elektronik Variablen auf Waveshare-E-Paper anzeigen lassen


von Egon M. (knut735)


Lesenswert?

Hallo

ich habe ein 2,13" E-Paper von Waveshare an einen Arduino Mega 
angeschlossen. Das Ganze funktioniert einigermaßen, d.h. die Arduino-IDE 
kann eine Beispieldatei von Waveshare übersetzen, auf den Mega hochladen 
und auf dem E-Paper erscheinen tatsächlich Bildchen und Texte, die ich 
auch editieren kann.

Das ist schon mal ein Anfang, da könnte man sich weiter vortasten. 
Allerdings wäre es hilfreich, wenn man eine genauere Übersicht hätte, 
wie die Sachen dargestellt werden. Z.B. funktioniert es nicht, wenn ich 
eingebe:
1
 paint.DrawStringAt(30, 30, wert, &Font12, COLORED);
um eine Variable (wert) auf das E-Paper zu bringen.

Manches kann man sich zwar aus den Beispielen zusammenreimen, aber 
nützlich wäre eine Übersicht von den gändigsten Befehlen. Hat vielleicht 
jemand einen Link zu so etwas?

Vielen Dank schon mal!

VG

knut735

von Vanye R. (vanye_rijan)


Lesenswert?

Am einfachst geht es wenn du alles selber programmierst. :)

Die mitgelieferten Beispiele sind grottig, die daraus geklaute
Arduino.Sauce ist nicht besser.

Grund dafuer scheint mir zu sein das es mehrere unterschiedliche
ePapers gab die komplett andere Controller hatten, aber mit
aenlichen Befehlssatz. Natuerlich keineswegs komplett identisch.
Ich glaube Waveshare kauft ein was sie gerade bekommen und verhoekert
das dann weiter.
Aber alle hatten 2.13" Groesse. Da ist natuerlich eine Referenzierung
ueber die Groesse ein Schmerz im Arsch.

Vanye

von Εrnst B. (ernst)


Lesenswert?

Ansonsten: Forumssuche.

Findet z.B.
Beitrag "Re: wo gibt es noch Libraries für EPD"

und auf den Fotos von Joachim schaut's so aus, als könnte der Variablen 
darstellen :)

von Michi S. (mista_s)


Lesenswert?

Egon M. schrieb:
> paint.DrawStringAt(30, 30, wert, &Font12, COLORED);
> um eine Variable (wert) auf das E-Paper zu bringen.

Der Name der Funktion klingt danach, als wäre sie zum Zeichnen eines 
(Text)strings gedacht; welchen Typ hat denn Deine Variable?

von Egon M. (knut735)


Lesenswert?

Michi S. schrieb:
> welchen Typ hat denn Deine Variable?

Das weiß ich jetzt noch nicht, im ersten Anlauf wahrscheinlich int oder 
float. Könnte man ja in Text umwandeln, aber ich dachte, daß es in der 
E-Paper-Programmierungs-Sprache so etwas auch vorgefertigt geben müßte.

VG

von Egon M. (knut735)


Lesenswert?

Vanye R. schrieb:
> Am einfachst geht es wenn du alles selber programmierst. :)

Ja, wäre mir auch am liebsten. Aber ich brauche erst mal einen Einstieg, 
da ich noch nie so eine Grafik programmiert habe. Ich weiß nicht, wie 
man dem Ding sagt, an welchem waagerechten und senkrechten Pixel 
begonnen werden soll, wie z.B. ein Textausgabezeile strukturiert werden 
sollte usw. usf.
Ein Rechteck oder einen Kreis könnte ich ja noch produzieren, aber dann 
heißt es bei dem einen "paint...", beim anderen "Display...".

Ich würde mich auf irgend eine verfügbare "Sprache" beschränken, die zu 
dem Controller paßt, der auf dem Waveshare 2,23" sw verbaut ist.

VG

knut735

von Jan H. (jan_h74) Flattr this


Lesenswert?

GxEPD  library (Arduino) scheint mir gepasst: 
https://github.com/ZinggJM/GxEPD

von Egon M. (knut735)


Lesenswert?

Jan H. schrieb:
> GxEPD  library (Arduino) scheint mir gepasst:
> https://github.com/ZinggJM/GxEPD

Das ist die Type, wo es bei mir am "...Display.." hapert (vgl. 
angehängte Fehlermeldung). Vielleicht müßte ich da irgendwas 
nachinstallieren?
Bei mir hört das Teil nicht auf "display", sondern auf "paint" von 
Waveshare. Hast Du auch so ein Waveshare-E-Paper oder ein anderes?

Hier die Fehlermeldung:
1
"C:\\Users\\mails\\Documents\\ArduinoData\\packages\\arduino\\tools\\avr-gcc\\7.3.0-atmel3.6.1-arduino7/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -MMD -flto -mmcu=atmega2560 -DF_CPU=16000000L -DARDUINO=10819 -DARDUINO_AVR_MEGA2560 -DARDUINO_ARCH_AVR "-IC:\\Users\\mails\\Documents\\ArduinoData\\packages\\arduino\\hardware\\avr\\1.8.6\\cores\\arduino" "-IC:\\Users\\mails\\Documents\\ArduinoData\\packages\\arduino\\hardware\\avr\\1.8.6\\variants\\mega" "-IK:\\Dat-KPC2\\Arduino-Prgm\\libraries\\GxEPD\\src" "-IC:\\Users\\mails\\Documents\\ArduinoData\\packages\\arduino\\hardware\\avr\\1.8.6\\libraries\\SPI\\src" "-IK:\\Dat-KPC2\\Arduino-Prgm\\libraries\\Adafruit_GFX_Library" "-IK:\\Dat-KPC2\\Arduino-Prgm\\libraries\\Adafruit_BusIO" "-IC:\\Users\\mails\\Documents\\ArduinoData\\packages\\arduino\\hardware\\avr\\1.8.6\\libraries\\Wire\\src" "C:\\Users\\mails\\AppData\\Local\\Temp\\arduino_build_341851\\sketch\\sketch_mar27c.ino.cpp" -o "C:\\Users\\mails\\AppData\\Local\\Temp\\arduino_build_341851\\sketch\\sketch_mar27c.ino.cpp.o"
2
C:\Users\mails\AppData\Local\Temp\arduino_modified_sketch_446020\sketch_mar27c.ino: In function 'void setup()':
3
sketch_mar27c:359:3: error: 'display1' was not declared in this scope
4
   display1.init(115200); // enable diagnostic output on Serial
5
   ^~~~~~~~
6
C:\Users\mails\AppData\Local\Temp\arduino_modified_sketch_446020\sketch_mar27c.ino:359:3: note: suggested alternative: 'delay'
7
   display1.init(115200); // enable diagnostic output on Serial
8
   ^~~~~~~~
9
   delay
10
sketch_mar27c:360:3: error: 'display2' was not declared in this scope
11
   display2.init(115200); // enable diagnostic output on Serial
12
   ^~~~~~~~
13
C:\Users\mails\AppData\Local\Temp\arduino_modified_sketch_446020\sketch_mar27c.ino:360:3: note: suggested alternative: 'delay'
14
   display2.init(115200); // enable diagnostic output on Serial
15
   ^~~~~~~~
16
   delay
17
sketch_mar27c:361:3: error: 'display3' was not declared in this scope
18
   display3.init(115200); // enable diagnostic output on Serial
19
   ^~~~~~~~

von 🕵︎ Joachim L. (Gast)


Lesenswert?

GxEPD2 oder u8g2. Besser. Schau dir die Listen der unterstuetzten HW mal 
an. U8g2 ist mein Favorit fuer EPD.

von Jan H. (jan_h74) Flattr this


Lesenswert?

Konnen sie die complette sketch mal posten ?

von Jan H. (jan_h74) Flattr this


Lesenswert?

Egon M. schrieb:
 Hast Du auch so ein Waveshare-E-Paper oder ein anderes?
>
Ich verwende das T5 lilygo 213 epaper (BN213  B73  B74). Funtioniert 
einwandfrei met GxEPD lib : 
https://github.com/RP6conrad/ESP-GPS-Logger/blob/master/README.md

von 🕵︎ Joachim L. (Gast)


Lesenswert?

Siehe oben: Mit GxEPD2 geht es einwandfrei, mit GxEPD eben nicht so 
einfach.
Aber wenn Ihr meint. Wie sagen die im Nordwesten WAT MUTT,DAT MUTT!

Kompletter Sketch: 
https://github.com/G6EJD/ESP32-e-Paper-Weather-Display

Was GxEPD angeht, der Entwickler ist Chinese, fuer den ist API doc 
schreiben zu zeitaufwendig. Also einfach aus den Examples lernen. Wollt 
ihr das nicht nehmt u8g2 monochrom https://github.com/olikraus/u8g2 Das 
ist besser dokumentiert : https://github.com/olikraus/u8g2/wiki

Im uebrigen sind das die besten Epaper-Libraries die man findet.

von 🕵︎ Joachim L. (Gast)


Angehängte Dateien:

Lesenswert?

Lilygo 4.7 Zoll E-paper 960x540 16-Graustufen

von J. S. (jojos)


Lesenswert?

Liliygo baut echt Top Hardware,die haben viele gute Boards im Programm.

von Egon M. (knut735)


Lesenswert?

Hallo,

gibt es eine Möglichkeit, herauszufinden, welcher Controller in 
Waveshare 1.23inch-E-ink HAT 250x122 verbaut ist? Ich habe an Waveshare 
geschrieben, aber als Antwort nur wieder den Hinweis auf ihren Website 
bekommen, wo ich keinen Hinweis auf den Controller gefunden hatte.

Ich habe die Beispiele von U8g2 probiert; man muß eine passende Zeile 
wählen. Bei meinem E-Paper paßt:
1
U8G2_SSD1327_WS_128X128_F_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);

wahrscheinlich deshalb, weil ich das Teil an einen Arduino Mega 
angeschlossen habe und die Verdrahtung lt. dieser Zeile zufällig mit der 
Verbindung zum Mega übereinstimmt. Und, weil dort SSD1327 angegeben ist, 
der vielleicht in meinem E-Paper verbaut ist?

Jedenfall sieht man auf dem Display etwas, aber nicht das, was im 
Programm steht, sondern etwas wie ein QR-Code. Man kann zwar keine 
richtige Darstellung erwarten, weil ja die Display-Charakteristika ganz 
andere sind, aber so daneben solle es doch nicht sein.

Ob es eine Möglickeit gibt, mein E-Paper doch noch gangbar zu machen? 
Bei U8g2 würde ich gern bleiben.

VG

: Bearbeitet durch User
von 🕵︎ Joachim L. (Gast)


Lesenswert?

Moin, Von dem Ding gibt es V1 bis V3. Bilder von Vorder und Rueckseite. 
Und von dem Display bitte. Mein Gedankelesegeraet ist gerade defekt. Auf 
ausreichende flaechige Beleuchtung achten.

https://www.waveshare.com/wiki/2.13inch_e-Paper_HAT_Manual#Resources

von Egon M. (knut735)


Angehängte Dateien:

Lesenswert?

Anbei zwei Bilder von dem 1.23inch-E-ink HAT 250x122. Auf dem Teil steht 
Rev 2.1 und außerdem gibt es einen Aufkleber mit "V3".
Angeschlossen ist das Ding an einen Arduino Mega 2560 R3.
Hilft das denn weiter?

Viele Grüße

knut735

: Bearbeitet durch User
von Egon M. (knut735)


Lesenswert?

Hallo

nachdem das Waveshare 2,13inch e-Paper 250x122 wohl nur seine eigene 
Beispieldateien von Waveshare verstehen kann, überlege ich, ob ich mir 
ein anderes, z.B. Lilygo TTGO T5 V2.0 4,7", beschaffen sollte.

Aber: unter den Beispieldateien von U8g2 finde ich z.B. bei HelloWorld 
(und bei den anderen ist es nicht besser) eine Liste von "Constructors", 
von den man eine auswählen muß. Ein passender Eintrag für das 
Lilygo-4,7"-Teil gibt es nicht. Wie also mit U8g2 umgehen, wenn schon 
die Beispielprogramme nicht für 4,7"-E-Paper geeignet sind?

In GxEPD2_display_selection_added.h findt man zwar etwas, das nach dem 
4,7" E-Paper aussieht, aber explizit ist es nicht erwähnt, also 
unsicher.

VG

: Bearbeitet durch User
von Harald K. (kirnbichler)


Lesenswert?

Egon M. schrieb:
> nachdem das Waveshare 2,13inch e-Paper 250x122 wohl nur seine eigene
> Beispieldateien von Waveshare verstehen kann

Und warum versuchst nicht Du, diese Beispieldateien zu verstehen? Die 
sind schließlich nicht dafür gedacht, das Display zu bespaßen, sondern 
Entwicklern als Grundlage für eigenes zu helfen.

Da gibt es z.B.

https://github.com/waveshare/e-Paper/blob/master/Arduino/epd2in13_V3/epd2in13_V3.ino

Und da ist ganz klar zu sehen, was man machen muss, um Text auf dem 
Display auszugeben. Sogar mit einer wählbaren Schriftart.

Das passiert in der Funktion Setup() in Zeile 32 und 33.

Was bitte ist das Problem?

Jetzt sag' nicht, daß Dir eine Funktion zum Ausgeben eines numerischen 
Wertes fehlt. Das kann es ja wohl wirklich nicht sein; Du musst nur 
Deinen numerischen Wert in einen String umwandeln, was man z.B. mit 
sprintf() erledigen kann, und diesen String dann ausgeben.

von Rahul D. (rahul)


Lesenswert?

Harald K. schrieb:
> Jetzt sag' nicht, daß Dir eine Funktion zum Ausgeben eines numerischen
> Wertes fehlt. Das kann es ja wohl wirklich nicht sein; Du musst nur
> Deinen numerischen Wert in einen String umwandeln, was man z.B. mit
> sprintf() erledigen kann, und diesen String dann ausgeben.

Oder man bastelt sich eine, die das übernimmt...
Dann kann man sich eine für float und eine für (unsigend) integer bauen, 
die dann auch nicht so viel Speicher fressen wie sprintf.

von Harald K. (kirnbichler)


Lesenswert?

Rahul D. schrieb:
> die dann auch nicht so viel Speicher fressen wie sprintf.

Ja, das "speicherfressende" printf ist irgendwie nicht aus den Köpfen 
rauszubekommen. Daß wir mittlerweile meistens nicht mit mit µC 
hantieren, die gerade mal 2 kB Flash-ROM haben, und daß man für nicht 
genutztes Flash-ROM auch kein Geld vom Hersteller zurückbekommt, das 
wird ebenso gerne übersehen wie die Fehlerträchtigkeit selbstgestrickter 
Konvertierungsfunktionen (die übrigens auch Speicher brauchen), ganz zu 
schweigen von deren Einschränkungen, was Formatierungen angeht. Werte 
rechtsbündig ausgeben, mit oder ohne führende Nullen ...

Aber ja, printf ist ja so speicherfressend.

Daß vernünftige Compiler mit Libraries für unterschiedlich vollständige 
printf-Implmentierungen daherkommen (mit oder ohne Unterstützung für 
float, mit oder ohne Unterstützung variabler Feldbreiten (* im 
Formatstring), mit oder ohne 64-Bit-Unterstützung ...), und dadurch 
natürlich unterschiedlich viel Speicher benötigen, das wird auch gerne 
übersehen, denn printf ist ja sooo speicherfressend.

von J. S. (jojos)


Lesenswert?

Speicher braucht man für das EPD sowieso. Und die Daten sollen ja auch 
schnell irgendwo herkommen, http/MQTT per WLAN zB. Und Controller die 
das können juckt ein printf nicht. Da muss man nix optimieren.

von Rahul D. (rahul)


Lesenswert?

Harald K. schrieb:
> Rahul D. schrieb:
>> die dann auch nicht so viel Speicher fressen wie sprintf.
>
> Ja, das "speicherfressende" printf ist irgendwie nicht aus den Köpfen
> rauszubekommen. Daß wir mittlerweile meistens nicht mit mit µC
> hantieren, die gerade mal 2 kB Flash-ROM haben, und daß man für nicht
> genutztes Flash-ROM auch kein Geld vom Hersteller zurückbekommt, das
> wird ebenso gerne übersehen wie die Fehlerträchtigkeit selbstgestrickter
> Konvertierungsfunktionen (die übrigens auch Speicher brauchen), ganz zu
> schweigen von deren Einschränkungen, was Formatierungen angeht. Werte
> rechtsbündig ausgeben, mit oder ohne führende Nullen ...
>
> Aber ja, printf ist ja so speicherfressend.
>
> Daß vernünftige Compiler mit Libraries für unterschiedlich vollständige
> printf-Implmentierungen daherkommen (mit oder ohne Unterstützung für
> float, mit oder ohne Unterstützung variabler Feldbreiten (* im
> Formatstring), mit oder ohne 64-Bit-Unterstützung ...), und dadurch
> natürlich unterschiedlich viel Speicher benötigen, das wird auch gerne
> übersehen, denn printf ist ja sooo speicherfressend.

Da hat wohl jemand schlecht geschlafen.
Natürlich kann man (s)printf verwenden.

von Vanye R. (vanye_rijan)


Lesenswert?

> Konvertierungsfunktionen (die übrigens auch Speicher brauchen), ganz zu
> schweigen von deren Einschränkungen, was Formatierungen angeht. Werte
> rechtsbündig ausgeben, mit oder ohne führende Nullen ...

Aber man kann dann auch eigene Sachen einbauen. Ein Beispiel hab ich
ja schon genannt. Ein weiteres:
Mein eigenes Printf kann auch Integer als Festkomma ausgeben.
Ich kann programmintern immer mit dem 10x oder 100x Wert rechnen
und nur bei der Ausgabe fuege ich dann einen Punkt an der richtigen 
Stelle ein.

Vanye

von Egon M. (knut735)


Lesenswert?

Harald K. schrieb:
> Und warum versuchst nicht Du, diese Beispieldateien zu verstehen? Die
> sind schließlich nicht dafür gedacht, das Display zu bespaßen, sondern
> Entwicklern als Grundlage für eigenes zu helfen.

Das versuche ich ja unentwegt.
Aber:

1.) die Beispieldatei von Waveshare, die auch Du mpfohlen hast, 
funktioniert. Sie läßt sich kompilieren und zeigt auch Bildchen und 
Texte auf dem Display. Man hat danach keinerlei Informationen über die 
Befehle, um es nach eigenen Bedürfnissen umzuwandeln.

2.) In den Beispielen von GxEPD2 sind zwar viele Befehle zu sehen, die 
man für Eigenbedarf abkupfern könnte, aber es läßt sich nicht 
kompilieren. Jedesmal kommt der Hinweis auf Display, was nicht definiert 
sei. Da fehlt irgendeine z.B. ... .h-Datei. Ich weiß nicht welche.


3. Bei U8g2 scheint es gut auszusehen, wahrscheinlich gibt es sogar eine 
Befehlsreferenz. Nützt aber auch nichts, weil es in der Konstrukturliste 
nicht mein Display mit 250 x 122 und 2,13" gibt.

Kennst Du vielleicht andere Beispieldateien, die man durchkauen und 
ausschlachten könnte?

VG

von 🕵︎ Joachim L. (Gast)


Lesenswert?

Also wenn du die Bibliothek von Uwe verwendet, musst du auch seine 
Beispiele verwenden. Menue ganz links. Damit ist der Fall geloest. U8G2 
ist gut. Wenn du HW- SPI verwendest und das an einen anderen MC 
anschliessen willst solltest du mal die SPI Doku (fuer Arduino) 
ueberfliegen. Zusammengefasst: Die beiden Anschluesse in der U8G2 Zeile 
kannst Du frei legen. Anschlussnummer entsprechen anpassen. Die die 
fehlen sind fest (daher der Name HW-SPI). Nach Pinout Bildchen des 
Zielboard anschliessen. Fettisch.

von Harald K. (kirnbichler)


Lesenswert?

Egon M. schrieb:
> Man hat danach keinerlei Informationen über die
> Befehle, um es nach eigenen Bedürfnissen umzuwandeln.

Ach.

Dann gucken wir doch mal zusammen in das Beispiel rein:

https://github.com/waveshare/e-Paper/blob/master/Arduino/epd2in13_V3/epd2in13_V3.ino

Am Anfang stehen da ein paar #include-Anweisungen
1
#include "epd2in13_V3.h"
2
#include "epdpaint.h"
3
#include "imagedata.h"

Und etwas weiter unten, in der Funktion setup(), wird eine Klasse namens 
"Paint" verwendet:
1
Paint paint(image, epd.bufwidth*8, epd.bufheight);    //width should be the multiple of 8

Das ist die Definition einer Variablen namens "paint" vom Typ "Paint", 
und der Aufruf eines Konstruktors, dem diverses Zeug übergeben wird.

Und dann ... kommt die interessante Funktion zum Ausgeben von Text auf 
dem Display:
1
 paint.DrawStringAt(8, 2, "e-Paper Demo", &Font12, COLORED);

Also ist es naheliegend, sich mal die Deklaration der Klasse Paint 
anzusehen. Am Anfang habe ich auf ein paar #include-Anweisungen 
hingewiesen, der Name "epdpaint.h" klingt doch irgendwie verdächtig.

Also werfen wir einen Blick in diese Datei rein:

https://github.com/waveshare/e-Paper/blob/master/Arduino/epd2in13_V3/epdpaint.h

Und da steht das das hier drin:
1
class Paint {
2
public:
3
    Paint(unsigned char* image, int width, int height);
4
    ~Paint();
5
    void Clear(int colored);
6
    int  GetWidth(void);
7
    void SetWidth(int width);
8
    int  GetHeight(void);
9
    void SetHeight(int height);
10
    int  GetRotate(void);
11
    void SetRotate(int rotate);
12
    unsigned char* GetImage(void);
13
    void DrawAbsolutePixel(int x, int y, int colored);
14
    void DrawPixel(int x, int y, int colored);
15
    void DrawCharAt(int x, int y, char ascii_char, sFONT* font, int colored);
16
    void DrawStringAt(int x, int y, const char* text, sFONT* font, int colored);
17
    void DrawLine(int x0, int y0, int x1, int y1, int colored);
18
    void DrawHorizontalLine(int x, int y, int width, int colored);
19
    void DrawVerticalLine(int x, int y, int height, int colored);
20
    void DrawRectangle(int x0, int y0, int x1, int y1, int colored);
21
    void DrawFilledRectangle(int x0, int y0, int x1, int y1, int colored);
22
    void DrawCircle(int x, int y, int radius, int colored);
23
    void DrawFilledCircle(int x, int y, int radius, int colored);
24
25
...

Das ist die Liste aller Memberfunktionen der Klasse Paint, die Du 
verwenden kannst. Die Namen sollten reichlich selbsterklärend sein, 
alles, was mit "Draw" anfängt, hat offenkundig irgendwas mit dem 
Zeichnen von Dingen zu tun.

Wofür wohl mag "DrawStringAt" stehen? Was könnten deren Parameter x und 
y bedeuten? Oder der Parameter "text"?


Das sind also "keinerlei Informationen".

Sorry, aber ich hab' das hier jetzt in vielleicht fünf Minuten für Dich 
'rausgefunden, das ist echt keine Raketenwissenschaft.

: Bearbeitet durch User
von Egon M. (knut735)


Lesenswert?

🕵︎ Joachim L. schrieb:
> Also wenn du die Bibliothek von Uwe verwendet, musst du auch seine
> Beispiele verwenden.

Uwe? Ich finde bei Github OliKraus - ist das etwa etwas anderes?

Ich habe über Arduinos Library Manager U8g2 in Arduino installiert und 
benutze die Beispiele von dort. Ist das richtig?

Dann habe ich bei Github die riesige Konstruktorenliste durchgesehen. 
Etwas mit 250x122 finde ich partout nicht. Wenn es nötig ware, würde ich 
die SPI-Verdrahtung anpassen, aber wenn schon die 250x122 nicht gefunden 
werden?
Jedenfalls läßt sich das Beispiel nicht kompilieren, es bleibt immer an 
dem nur näherungsweise passenden Konstruktoreintrag hängen.

> Menue ganz links. Damit ist der Fall geloest.

Meinst Du Menue ganz links in Arduino-IDE 2.0.x?


> U8G2 ist gut.

Wenn nur wenigstens die Beispiele liefen, dann könnte ich mich 
durchhangeln. Vielleicht sollte ich über andere E-Papers (Lilygo?) 
nachdeken? Dann würde ich vorher nachsehen, ob sie in der Liste 
enthalten sind.


VG

knut735

von Egon M. (knut735)


Lesenswert?

Harald K. schrieb:
> Das ist die Liste aller Memberfunktionen der Klasse Paint, die Du
> verwenden kannst. Die Namen sollten reichlich selbsterklärend sein,
> alles, was mit "Draw" anfängt, hat offenkundig irgendwas mit dem
> Zeichnen von Dingen zu tun.

Ich versuche es mal, nachdem ich mit U8g2 derzeit nicht weiter komme.
Das Drehen des Bildschirms ist mir schon gelungen

VG

von 🕵︎ Joachim L. (Gast)


Lesenswert?

Egon M. schrieb:
> Ich habe die Beispiele von U8g2 probiert; man muß eine passende Zeile
> wählen. Bei meinem E-Paper paßt:U8G2_SSD1327_WS_128X128_F_4W_HW_SPI
> u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
>
> wahrscheinlich deshalb, weil ich das Teil an einen Arduino Mega
> angeschlossen habe und die Verdrahtung lt. dieser Zeile zufällig mit der
> Verbindung zum Mega übereinstimmt. Und, weil dort SSD1327 angegeben ist,
> der vielleicht in meinem E-Paper verbaut ist?

Natuerlich Oli. Du hast doch gesagt es laeuft mit der Zeile. Oder doch 
nicht? Wenn der Controller stimmt und die Aufloesung (paar Pixel mehr 
sollte auch gehen), ist alles OK. Das mit dem SPI anschliessen, solltest 
du lernen. Welche Konfig Zeile verwendest du denn mit GxEPD2?

von Egon M. (knut735)


Lesenswert?

🕵︎ Joachim L. schrieb:
> tuerlich Oli. Du hast doch gesagt es laeuft mit der Zeile. Oder doch
> nicht? Wenn der Controller stimmt und die Aufloesung (paar Pixel mehr
> sollte auch gehen), ist alles OK. Das mit dem SPI anschliessen, solltest
> du lernen. Welche Konfig Zeile verwendest du denn mit GxEPD2

Also, bei GxEPD2_HelloWorld "läuft" es mit der Zeile
1
GxEPD2_BW<GxEPD2_154_D67, GxEPD2_154_D67::HEIGHT> display(GxEPD2_154_D67(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4));

Allerdings bedeutet das hier nur, daß es kompilierbar ist. Auf dem EPD 
tut sich nichts. Ich habe nämlich nicht die Anschlüsse gem. obigen 
Schema geändert, sondern es zunächst so belassen wie es bei EPD2in13, 
der von Waveshare gelieferten Beispieldatei, funktioniert.

Im übrigen sind die GxEPD-Veruche sehr maliziös. Fast immer scheitert es 
daran, das das Fehlen von display bemängelt wird. Ich weiß leider nicht, 
was ich da noch includieren sollte.

Gru0

knut735

von Harald K. (kirnbichler)


Lesenswert?

Egon M. schrieb:
> Im übrigen sind die GxEPD-Veruche sehr maliziös. Fast immer scheitert es
> daran, das das Fehlen von display bemängelt wird. Ich weiß leider nicht,
> was ich da noch includieren sollte.

Du könntest die von Dir verwendete Programmiersprache erlernen. Oder 
damit aufhören, wild irgendwelchen irgendwo zusammengesuchten Code zu 
mischen.

Der Waveshare-Beispielcode funktioniert, wie Du selbst geschrieben hast.

Und der Waveshare-Beispielcode macht alles, was Du brauchst.

Es ist also völlig unnötig, irgendwelchen anderen Code, irgendwelche 
anderen Libraries zu verwurschteln.

von Egon M. (knut735)


Lesenswert?

Harald K. schrieb:
> Und der Waveshare-Beispielcode macht alles, was Du brauchst.

Naja, wenigstens fast alles. Ich kann z.B. nur einen Teil des E-Papers 
beschreiben, der Rest wird einfach abgeschnitten und nicht dargestellt.

Vielleicht finde ich da noch einen Ausweg.

VG

von Harald K. (kirnbichler)


Lesenswert?

Egon M. schrieb:
> Ich kann z.B. nur einen Teil des E-Papers
> beschreiben, der Rest wird einfach abgeschnitten und nicht dargestellt.

Und das macht der unveränderte Beispielcode auch?

von Egon M. (knut735)


Angehängte Dateien:

Lesenswert?

Harald K. schrieb:
> Und das macht der unveränderte Beispielcode auch?

Nein, es wird ein Blumenbildchen über den ganzen Schirm dargestellt (was 
ich aber dann abgestellt habe). Zum Schluß aber wird vieles 
abgeschnitten.
Ich habe den als Spielwiese benutzten Sketch angfügt und dann als Bild, 
was dargestellt wird.
1
// EPD2in13-230326-2
2
// von Waveshare
3
// kompilierbar und funktionsfähig
4
// auf Mega und Arduino 2.0.4 und auch 1.8.19
5
// wird als erste Basis für Weiterentwicklung benutzt
6
// Blumenbild ist abgeschafft, nervöses Blinken geblieben
7
// Ausrichtung fehlerhaft, Variable nicht dargestellt
8
9
#include <SPI.h>
10
#include "epd2in13_V3.h"
11
#include "epdpaint.h"
12
#include "imagedata.h"
13
14
#define COLORED     0
15
#define UNCOLORED   1
16
17
/**
18
  * Due to RAM not enough in Arduino UNO, a frame buffer is not allowed.
19
  * In this case, a smaller image buffer is allocated and you have to 
20
  * update a partial display several times.
21
  * 1 byte = 8 pixels, therefore you have to set 8*N pixels at a time.
22
  */
23
unsigned char image[1050];
24
 Paint paint(image, 0, 0);
25
 Epd epd;
26
27
void setup()
28
{
29
  // put your setup code here, to run once:
30
  Serial.begin(115200);
31
  Serial.println("EPD2in13-230326-1  und  epd FULL");
32
  epd.Init(FULL);
33
//  epd.Display(IMAGE_DATA);              // Das Blumenbild wird angezeigt
34
  int wert = 20;
35
  delay(1000);
36
  paint.SetRotate(2);
37
38
  Paint paint(image, epd.bufwidth*8, epd.bufheight);    //width should be the multiple of 8
39
40
  paint.Clear(UNCOLORED);
41
    epd.Init(FULL);
42
  paint.SetRotate(1);
43
  paint.DrawStringAt(8, 10, "e-Papier Demo", &Font12, COLORED); // abgeschnitten
44
  paint.DrawStringAt(30, 30, wert, &Font12, COLORED);  
45
  paint.DrawStringAt(20, 50, "Hallo, Welt", &Font16, COLORED);  // abgeschnitten
46
  epd.Display1(image);//1                                       // wozu?
47
48
  delay(1000);
49
50
51
  paint.Clear(UNCOLORED);
52
 
53
  paint.DrawRectangle(30,30,100,100,COLORED);        // abgeschnitten
54
  paint.DrawLine(2,2,200,200,COLORED);
55
//  paint.DrawLine(2,50,50,2,COLORED);               // abgeschnitten
56
//  paint.DrawFilledRectangle(52,2,100,50,COLORED);
57
//  paint.DrawLine(52,2,100,50,UNCOLORED);
58
//  paint.DrawLine(100,2,52,50,UNCOLORED);
59
    epd.Display1(image);//2
60
61
  paint.Clear(UNCOLORED);
62
  paint.DrawCircle(25,25,20,COLORED);                // an falscher Stelle
63
  paint.DrawFilledCircle(75,25,20,COLORED);          // an falscher Stelle u. abgeschnitten
64
  epd.Display1(image);//3
65
  
66
  paint.Clear(UNCOLORED);
67
  epd.Display1(image);//4
68
69
  delay(2000);
70
71
  // Serial.println("epd PART");
72
//   epd.DisplayPartBaseImage(IMAGE_DATA);
73
  // char i = 0;
74
 //  for (i = 0; i < 10; i++) {
75
 //    Serial.println("e-Paper PART IMAGE_DATA");
76
//     epd.Init(PART);
77
 //   epd.DisplayPart(IMAGE_DATA);
78
  //   Serial.println("e-Paper PART Clear");
79
  //   epd.Init(PART);
80
  //   epd.ClearPart();
81
 //  }
82
  
83
  epd.Init(FULL);
84
  Serial.println("e-Paper clear and sleep");
85
//  epd.Clear();
86
  epd.Sleep();
87
88
} 
89
90
void loop()
91
{
92
}

Wie man sieht, sind die Texte abgeschnitten, die diagonale Linie und das 
Rechteck auch. Dagengen sind die Kreise nicht da, wo sie hingehören, 
einer ist abgeschnitten.
Wenn man   irgendwo epd.Display1(image); deaktiviert, wird gar nichts 
dargestellt.

Gruß

knut735

von Joachim B. (jar)


Lesenswert?

Egon M. schrieb:
> #include "epd2in13_V3.h"
> #include "epdpaint.h"
> #include "imagedata.h"

und warum zeigst du nur die Hälfte?

wo sind die #include und warum zeigst du sie nicht?

Seit Tagen will man dir helfen aber es kommt nur mimimi geht nicht 
klappt nicht.
Nicht einmal zeigst du systematische Fehleranalyse oder bemühst dich um 
verständliche Kommunikation!

Wie alt bist du eigentlich?

: Bearbeitet durch User
von 🕵︎ Joachim L. (Gast)


Lesenswert?

Ja, zu unsystematisch. Hilfe meinerseits:

1. Sicher! sein das das SPI korrekt angeschlossen ist. Am besten mit 
einem anderen Geraet probieren das auch HW-SPI unterstuetzt, wenn du 
eines hast.

2. Wenn das dann stimmt u8g2 und GxEPD2 Konfigurationszeilen mit der 
gleichen oder wenig groesseren Aufloesung in HW-SPI Variante 
ausprobieren bis die jeweiligen Beispiele laufen.

Vorteil dieser beiden Libraries ist, das sie eine Vielzahl von Displays 
unterstuetzen und die Waveshare lt. deiner Aussage ohnehin Probleme hat.
Was deine Frage zum Lilygo 4.7 Kauf angeht: Achte drauf das Du mit 
Doppel-P bezahlen kannst, sonst bist du zur Abzocke freigegeben. Das 
Tracking heutzutage funktioniert nicht mehr wie vor zwei Jahren noch und 
ist eher fuer die Dachhasen.
Am besten suchst Du selbst mal. Guenstig waere z.B.

https://www.tindie.com/products/lilygo/lilygo-t5-47-inch-e-paper-esp32-v3-version/
ist aber voellig ungetestet von mir. Selbst checken!

Wenn Du das Ding zu DEM Preis und den genannten Versandkosten auch 
bekommst, hast du ein Schnaeppchen gemacht. Am besten den Touchscreen 
gleich mitbestellen, damit kannst du dir Bedienelemente bauen die noch 
nicht mal der Kaept'n der Enterprise hatte.

von Εrnst B. (ernst)


Lesenswert?

Egon M. schrieb:
> Paint paint(image, epd.bufwidth*8, epd.bufheight);

Mach dir eine Debug-Ausgabe für die Buffer-Breite/Höhe rein.

Passt das zufällig zu deinen abgeschnittenen Bildbereichen?

Und passt

Egon M. schrieb:
> unsigned char image[1050];

zu deinen Breite/Höhe-Angaben?

Finally:

Egon M. schrieb:
> * Due to RAM not enough in Arduino UNO, a frame buffer is not allowed.
>   * In this case, a smaller image buffer is allocated and you have to
>   * update a partial display several times.

Hast du gelesen und verstanden?
Insbesondere das mit dem "partial"?

von 🕵︎ Joachim L. (Gast)


Lesenswert?

Nimm einen ESP32 zum testen der Ansteuerung. Ist besser, weil mehr RAM. 
So kannst du frei waehlen zwischen allen Beispielen. Wenn eins laeuft, 
laufen alle.
Verwende die monochrom Version: https://github.com/olikraus/U8g2_Arduino 
oder probiere GxEPD2. Wie gesagt !!! Erst SPI richtig anschliessen !!! 
Wenn du dir nicht sicher bist lesen, fragen, gockeln, testen bis du dir 
sicher bist. Mit einem unproblematischem SPI geraet testen!

von Egon M. (knut735)


Lesenswert?

🕵︎ Joachim L. schrieb:
> Nimm einen ESP32 zum testen der Ansteuerung. Ist besser, weil mehr RAM.
> So kannst du frei waehlen zwischen allen Beispielen. Wenn eins laeuft,
> laufen alle.

Ja, das habe ich auch vor bzw. schon begonnen. Das Problem ist, daß ich 
von meinen verschiedenen ESP32 einen heraussuchen und dabei die 
richtigen SPI-Anschlüsse heraufinden muß. Ist eine Fleißarbeit und ich 
komme z.Zt. nicht dazu, bin aber hoffnungsvoll.

Übrigens: ich habe bei Olikraus gelesen, daß die Arbeit an U8g2 nicht 
weitergeführt würde, weil es im Vergleich zu J.-M. Zingg nur 
Doppelarbeit bedeutete. Es wird der Übergang zu GxEPD (nicht GxEPD2) 
empfohlen. Ich habe lange versucht, diese Stelle wiederzufinden, ist mir 
leider nicht gelungen.

Jedenfalls habe ich bei J.-M. Zingg gelesen, daß nun zahlreiche E-Papers 
erfaßt würden; explizit wurden die Waveshare-Typen genannt! Ich habe 
einige Beispiele getestet und die ließen sich problemlos kompilieren. 
Nun muß ich, wenn ich dazukomme, nur noch eine passende SPI-Verbindung 
herausfinden.

Gruß

knut735

von 🕵︎ Joachim L. (Gast)


Lesenswert?

Das ist nicht wirklich eine Fleissarbeit. Man muss es einmal verstanden 
haben. Das Problem ist bei der Namensgebung der Anschluesse, sowohl bei 
den Arduino Pins im allgemeinen, als auch bei den SPI Pins insbesondere. 
Orientiere dich an den Auswahlzeilen der Libraries, da stimmen sie immer 
und sind einheitlich benannt. Der Rest steht schon oben. Arbeite meine 
Tips durch und ueberlege warum ich das so vorgeschlagen habe. Ansonsten 
hast du recht, ein bischen Uebung schadet nicht. Hat mich uebrigens auch 
Nerven gekostet.Viel Erfolg dabei.

von Joachim B. (jar)


Lesenswert?

Egon M. schrieb:
> Ist eine Fleißarbeit und ich
> komme z.Zt. nicht dazu

du kommst ja nicht mal dazu einfache Fragen zu beantworten!

Joachim B. schrieb:
> und warum zeigst du nur die Hälfte?
> wo sind die #include und warum zeigst du sie nicht?
> Wie alt bist du eigentlich?

von 🕵︎ Joachim L. (Gast)


Lesenswert?

Bin da ueber was nettes gestolpert GxEPD und 2.13 Zoll Display. 
Vielleicht moechtest du das mal testen.

https://github.com/piotr-kubica/weather-tiny/tree/master/weather_tiny

von Egon M. (knut735)


Angehängte Dateien:

Lesenswert?

🕵︎ Joachim L. schrieb:
> Das ist nicht wirklich eine Fleissarbeit. Man muss es einmal verstanden
> haben. Das Problem ist bei der Namensgebung der Anschluesse, sowohl bei
> den Arduino Pins im allgemeinen, als auch bei den SPI Pins insbesondere.
> Orientiere dich an den Auswahlzeilen der Libraries, da stimmen sie immer
> und sind einheitlich benannt. Der Rest steht schon oben. Arbeite meine
> Tips durch und ueberlege warum ich das so vorgeschlagen habe. Ansonsten
> hast du recht, ein bischen Uebung schadet nicht. Hat mich uebrigens auch
> Nerven gekostet.Viel Erfolg dabei.

Hallo, es funktioniert!

als ich wieder etwas Zeit hatte und dazu kam, habe ich einen Sketch von 
J.M.Zingg gekürzt, auf meine Verhältnisse zugeschnitten und dahinein den 
Kram von DS18B20-Abfragen integriert.
Allerdings mußte ich für den DS18B20 die allerneueste Version von 
OneWire integrieren, damit es auf einem ESP32 läuft.
Bis auf ein restliches Sofwareproblem und dem noch fehlenden Gehäuse ist 
es nun einsatzbereit.

Vielen Dank für Eure freundliche Hilfe!!!

VG

knut735


PS Ich sollte noch erwähnen, daß ich auf ein Lilygo TTGO T5 umgestiegen 
bin. Im Gegensatz zu dem nackten Waveshare2.13 funktionierte es sofort 
und es ist kompakter und deshalb leichter unterzubringen.

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.