Variablen auf Waveshare-E-Paper anzeigen lassen

#7380628
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

#7380649
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

#7380742
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

#7380761
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
   ^~~~~~~~
Gast #7383045
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.

#7383883
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

#7384557
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

#7384681
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.

#7384683
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.

#7384711
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.

#7384755
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.

#7384789
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

#7385015
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.

  1. 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

Gast #7385029
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.

#7385031
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.

#7385182
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

#7385186
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

Gast #7385228
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?

#7385233
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

#7385283
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.

#7385913
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

Angehängte Dateien:
#7385921
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?

Gast #7385933
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.

#7386019
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"?

Gast #7387682
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!

#7388292
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

Gast #7388303
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.

#7409431
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.

Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren