Arduino Forum

International => Deutsch => Topic started by: stoni99 on Mar 31, 2019, 07:36 pm

Title: Test ePaper Waveshare 1.54
Post by: stoni99 on Mar 31, 2019, 07:36 pm
Ich habe das Display (https://eckstein-shop.de/Waveshare-154-inch-200x200-E-Ink-E-Paper-Display-Modul-SPI-fuer-Raspberry-Pi-Arduino) mal getestet.

Ist eigentlich für 3,3V.
Als Betriebsspannung habe ich auch die 3,3V angelegt. Die Eingänge sollen 5V tolerant sein. Auf Dauer wohl besser mit Levelshifter.

Ein Anschlusskabel wird mitgeliefert. Ich habe es so hier (https://www.youtube.com/watch?v=UBEhod2wxvE&t=171s) an den Arduino Uno angeschlossen.
Die dort angegebene Library habe ich nicht zum Laufen bekommen. Ich habe mir die Lib & BsplCode von hier (https://www.waveshare.com/wiki/1.54inch_e-Paper_Module) geladen.

Funktioniert. Sehr gut lesbare Anzeige.
Aber mit Einschränkung beim Uno. Der Speicher ist beim Uno recht klein um z.B. das ganze Display mit Text füllen zu können. Es gehen nur 3 Zeilen auf einmal. Sonst muss man den Umweg gehen und jede Zeile einzeln hochladen. Das dauert dann etwas. Mit dem ESP habe ich noch nicht probiert - sollte aber besser gehen, weil mehr Speicher & 3,3V.

Das Interessante ist: Die Anzeige bleibt auch bei Sleep oder Stromausfall weiterhin angezeigt - eben ePaper.

Macht sich sicherlich gut um z.B. ein batteriebetriebenes DIY zu betreiben. Also nach dem Motto: µP nach 10min aufwecken, Temperatur holen und anzeigen und dann kpl. wieder auf sleep schalten - Anzeige bleibt erhalten.
Title: Re: Test ePaper Waveshare 1.54
Post by: Doc_Arduino on Mar 31, 2019, 08:17 pm
gut zu wissen    :)
Title: Re: Test ePaper Waveshare 1.54
Post by: uwefed on Mar 31, 2019, 09:06 pm
Hatte mit dieses Display bei der Make Munich gekauft und schon befürchtet das es ein Fehlkauf sein würde, weil es mit Arduino nicht angesteuert werden kann (wurde für Raspberry beworben).
Danke für die Info.
Grüße Uwe
Title: Re: Test ePaper Waveshare 1.54
Post by: postmaster-ino on Mar 31, 2019, 09:36 pm
Hi

Na da habe ich ja Glück, daß ich Das bisher nicht wusste ...
Dieses Display läuft an einem Nano mit Beispiel-Code und zählt Sekunden hoch.
Klar sollte sein, daß ein Grafik-Display halt mehr Speicher braucht, als ein 1602.

Meine ePapers machen nicht wirklich Sinnvolles, aber immerhin klappen Sie bis her.

Ich schaue Mal, ob ich noch ein Foto dabei gepackt bekomme ...

MfG
*Edit*
Lib:github, soonuse, epd-library-arduino (https://github.com/soonuse/epd-library-arduino)
Beispiel auf Sekunden-Uhr 'umgestrickt', ZIP (http://forum.arduino.cc/index.php?action=dlattach;topic=607209.0;attach=301914)
(http://forum.arduino.cc/index.php?action=dlattach;topic=607209.0;attach=301915)
(http://forum.arduino.cc/index.php?action=dlattach;topic=607209.0;attach=301917)
(http://forum.arduino.cc/index.php?action=dlattach;topic=607209.0;attach=301919)
(http://forum.arduino.cc/index.php?action=dlattach;topic=607209.0;attach=301921)
Title: Re: Test ePaper Waveshare 1.54
Post by: Tommy56 on Mar 31, 2019, 09:41 pm
Na da habe ich ja Glück, daß ich Das bisher nicht wusste ...
Dieses Display läuft an einem Nano mit Beispiel-Code und zählt Sekunden hoch.
Wenn Du es im Gegensatz zu stoni99 mit den Beispiellibs zum Laufen bekommen hast, wären bestimmt alle an Deinem Code interessiert und natürlich den Links zu den Libs.

Gruß Tommy
Title: Re: Test ePaper Waveshare 1.54
Post by: postmaster-ino on Mar 31, 2019, 10:04 pm
Hi

Habe im obigen Post das ganze Zeug eingefügt.
Wirklich produktiv nutze ich das Display nicht wirklich - aber immerhin zeigt's was an :)
Hoffe, die Beinchen vom Nano kann man abzählen - da die Drähte des ePaper-Stecker verschiedenfarbig sind und auf meinem ePaper die Pins beschriftet sind, sollte sich Das aber zusammen bekommen lassen.

Das Spinnengeweb an GND (SW) ist eine optische Täuschung ... bestimmt ;)

MfG
Title: Re: Test ePaper Waveshare 1.54
Post by: wapjoe on Mar 31, 2019, 10:27 pm
Das Spinnengeweb an GND (SW) ist eine optische Täuschung ... bestimmt ;)
Löten ist was für Anfänger, heute wird gespidert! ;)
Title: Re: Test ePaper Waveshare 1.54
Post by: stoni99 on Apr 01, 2019, 07:32 am
Wenn Du es im Gegensatz zu stoni99 mit den Beispiellibs zum Laufen bekommen hast, wären bestimmt alle an Deinem Code interessiert und natürlich den Links zu den Libs.

Gruß Tommy
Die EPD-Lib Demo läuft bei mir auch. Aber nicht diese GxEPD-Lib & Demo (https://github.com/ZinggJM/GxEPD).
Title: Re: Test ePaper Waveshare 1.54
Post by: amithlon on Apr 01, 2019, 09:58 am
Hallo,

ich habe hier nur 1x 2,9" b/w im "Einsatz" mit einer relativ alten GxEPD-Lib, stabil als Uhr.
Ein 2,9" 3-farbig liegt rum, mal getestet mit besagter Lib, läuft.
In der aktuellen Version der GxEPD-Lib hat er was geändert, ich war aber zu faul, das anzupassen.
Mein Bekannter hat sein 2,9" mit der GxEPD2 laufen, keine Probleme.
Aaaaber: alles am ESP8266/ESP32, Displays, die gern etwas Ram haben wollen, hänge ich an AVR garnicht erst ran...

(https://forum.arduino.cc/index.php?action=dlattach;topic=607209.0;attach=301991)
Die Uhr läuft mit Sekundenanzeige und partial-Refresh damit es nicht flackert. Die Sekinde schafft sie nicht wirklich, Refreshzeit ist knapp darüber, also gibt es ab und an eben einen 2-Sekundensprung.

Gruß aus Berlin
Michael
Title: Re: Test ePaper Waveshare 1.54
Post by: stoni99 on Apr 01, 2019, 03:48 pm
...partial-Refresh damit es nicht flackert. /quote]

Was ist das? Wie geht das?
Title: Re: Test ePaper Waveshare 1.54
Post by: amithlon on Apr 01, 2019, 04:02 pm
Hallo,

...partial-Refresh damit es nicht flackert. /quote]

Was ist das? Wie geht das?
Das Display muß das können, prinzipiell wohl sowieso nur die s/w, die 3-farbigen generell nicht.
Ich habe jtzt nur in meiner alten Version der GcEPD-Lib geschaut, Dein Display dürfte dort ja das GxGDEP015OC1 sein, das scheint es zu können:
    // paged drawing to screen rectangle at (x,y) using partial update
    void drawPagedToWindow(void (*drawCallback)(void), uint16_t x, uint16_t y, uint16_t w, uint16_t h);
Ab und an muß man einen kompletten Refresh machen, sonst vergisst es einzelne Pixel bzw. der Kontrast wird ungleichmäßig. Ich mache den so alle 5 Minuten, ich habe es nicht weiter ausgetestet, bleibenden Schaden richtet es ja nicht an, nur die aktuelle Darstellung kann leiden.

Gruß aus Berlin
Michael
 
Title: Re: Test ePaper Waveshare 1.54
Post by: stoni99 on Apr 14, 2019, 01:15 pm
Ich habe in meiner Wühlkiste noch einen Mega 2560 gefunden. Ich möchte das ePaper mal am Mega probieren. Hat ja auch mehr SRam.

Wie ist das dort mit dem SPI Bus? Gleiche Anschlüsse wie beim UNO? Oder müssen Anpassungen vorgenommen werden? Anschluß Uno hier (https://youtu.be/UBEhod2wxvE?t=163).

Ich habe bisher noch nix weiter mit dem Mega gemacht.
Title: Re: Test ePaper Waveshare 1.54
Post by: postmaster-ino on Apr 14, 2019, 01:19 pm
Hi

Nein, die Anschlüsse sind Andere.
Siehe hierzu
Arduino Reference, SPI (https://www.arduino.cc/en/Reference/SPI)

MfG

*Edit*
Rechtschreibung ... Vorschau rules ...
Title: Re: Test ePaper Waveshare 1.54
Post by: stoni99 on Apr 14, 2019, 01:30 pm
Danke!

Geht aber leider auch nicht.
Pin 12 ist im Beispielanschluss mit dem UNO nicht belegt?!
Title: Re: Test ePaper Waveshare 1.54
Post by: postmaster-ino on Apr 14, 2019, 01:39 pm
Hi

Pin12 ist beim Uno MISO - Master IN, Slave OUT.
Da das Display keine Daten zurück gibt, muß der Uno Da auch nicht mitlesen.

MfG
Title: Re: Test ePaper Waveshare 1.54
Post by: stoni99 on Apr 14, 2019, 02:25 pm
Ich habe es mal am ICSP angeschlossen - jetzt geht es. THX!
Title: Re: Test ePaper Waveshare 1.54
Post by: stoni99 on Apr 14, 2019, 02:45 pm
Mit den Mega kann ich auch im Sketch mehr Speicher reservieren und damit auch das Display mit einmal vollschreiben.

Code: [Select]

...
unsigned char image[4096];
...



Code: [Select]

...
  //2x löschen notwendig damit Display frei wird
  epd.ClearFrameMemory(0xFF);   // bit set = white, bit reset = black
  epd.DisplayFrame();
  epd.ClearFrameMemory(0xFF);   // bit set = white, bit reset = black
  epd.DisplayFrame();

  paint.SetWidth(200);
  paint.SetHeight(160);
 
  paint.Clear(UNCOLORED);
  epd.DisplayFrame();   //Anzeigen
  paint.DrawStringAt(0, 0, "1 Schiebetor", &Font16, COLORED);
  paint.DrawStringAt(0, 12, "2 Schiebetor", &Font16, COLORED);
  paint.DrawStringAt(0, 24, "3 Schiebetor", &Font16, COLORED);
  paint.DrawStringAt(0, 36, "4 Schiebetor", &Font16, COLORED);
  paint.DrawStringAt(0, 48, "5 Schiebetor", &Font16, COLORED);
  paint.DrawStringAt(0, 60, "6 Schiebetor", &Font16, COLORED);
  paint.DrawStringAt(0, 72, "7 Schiebetor", &Font16, COLORED);
  paint.DrawStringAt(0, 84, "8 Schiebetor", &Font16, COLORED);
  paint.DrawStringAt(0, 96, "9 Schiebetor", &Font16, COLORED);
  paint.DrawStringAt(0, 108, "10 Schiebetor", &Font16, COLORED);
  paint.DrawStringAt(0, 120, "11 Schiebetor", &Font16, COLORED);
  paint.DrawStringAt(0, 132, "12 Schiebetor", &Font16, COLORED);
  epd.SetFrameMemory(paint.GetImage(), 0, 0, paint.GetWidth(), paint.GetHeight());
  epd.DisplayFrame();   //Anzeigen
...
Title: Re: Test ePaper Waveshare 1.54
Post by: stoni99 on Apr 15, 2019, 02:08 pm
Was mich noch stört ist dieses Geflacker beim Neuschreiben einer Displayanzeige.

Das macht der merkwürdiger Weise  im Democode nicht wenn das Hintergrundbild geladen ist und die Zeit angezeigt wird.

In welchem Verzeichnis steht denn eigentlich diese imagedata.h?

Code: [Select]
#include <SPI.h>
#include <epd1in54.h>
#include <epdpaint.h>
#include "imagedata.h"

#define COLORED     0
#define UNCOLORED   1



Code: [Select]
epd.SetFrameMemory(IMAGE_DATA);
  epd.DisplayFrame();
  epd.SetFrameMemory(IMAGE_DATA);
  epd.DisplayFrame();
Title: Re: Test ePaper Waveshare 1.54
Post by: stoni99 on Apr 15, 2019, 02:55 pm
Ich habe mal versucht dieses vorgegebene Hintergrundbild (IMAGE_DATA) durch ein eigenes zu ersetzen.

Wird leider nur gequirlte Sch... angezeigt.  :smiley-mr-green:

Was mache ich falsch?

Code: [Select]
.....

#include <SPI.h>
#include <epd1in54.h>
#include <epdpaint.h>
//#include "imagedata.h"

#define COLORED     0
#define UNCOLORED   1


const unsigned char gImage_weiss[3556] = { 0X00,0X01,0XC7,0X00,0X8E,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
.......
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,};


unsigned char image[1024];
Paint paint(image, 0, 0);    // width should be the multiple of 8
Epd epd;
unsigned long time_start_ms;
unsigned long time_now_s;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  if (epd.Init(lut_full_update) != 0) {
      Serial.print("e-Paper init failed");
      return;
  }

 
 
  epd.ClearFrameMemory(0xFF);   // bit set = white, bit reset = black
  epd.DisplayFrame();
  epd.ClearFrameMemory(0xFF);   // bit set = white, bit reset = black
  epd.DisplayFrame();

......

  /**
   *  there are 2 memory areas embedded in the e-paper display
   *  and once the display is refreshed, the memory area will be auto-toggled,
   *  i.e. the next action of SetFrameMemory will set the other memory area
   *  therefore you have to set the frame memory and refresh the display twice.
   */
  epd.SetFrameMemory(gImage_weiss);
  epd.DisplayFrame();
  epd.SetFrameMemory(gImage_weiss);
  epd.DisplayFrame();

  time_start_ms = millis();
}

void loop() {
  // put your main code here, to run repeatedly:
  time_now_s = (millis() - time_start_ms) / 1000;
  char time_string[] = {'0', '0', ':', '0', '0', '\0'};
  time_string[0] = time_now_s / 60 / 10 + '0';
  time_string[1] = time_now_s / 60 % 10 + '0';
  time_string[3] = time_now_s % 60 / 10 + '0';
  time_string[4] = time_now_s % 60 % 10 + '0';

  paint.SetWidth(32);
  paint.SetHeight(96);
  paint.SetRotate(ROTATE_270);

  paint.Clear(UNCOLORED);
  paint.DrawStringAt(0, 4, time_string, &Font24, COLORED);
  epd.SetFrameMemory(paint.GetImage(), 80, 72, paint.GetWidth(), paint.GetHeight());
  epd.DisplayFrame();

  delay(500);
}
Title: Re: Test ePaper Waveshare 1.54
Post by: Tommy56 on Apr 15, 2019, 02:57 pm
Wir wissen ja nicht, was Du getan hast. Woher sollen wir da wissen, was Du falsch machst?

Gruß Tommy
Title: Re: Test ePaper Waveshare 1.54
Post by: stoni99 on Apr 15, 2019, 03:01 pm
Steht doch da Tommy!  :smiley-mr-green:

Nee. ich hatte ein paar Probleme beim Kürzen des Codes - passen nur 9000 Zeichen ins Forum - habe es jetzt nachgereicht.
Title: Re: Test ePaper Waveshare 1.54
Post by: stoni99 on Apr 16, 2019, 07:18 am
Bei der EPD-Lib bekomm ich kein Bild zu laden.

Die imagedata.h habe ich nach langem Suchen gefunden: Merkwürdigerweise im Ordner der Sketche. Die Suche im Datei-Explorer hat sie komischerweise nicht gefunden.

Die GxEPD habe ich jetzt zum Laufen gebracht.
Wie? Keine Ahnung! :smiley-mr-green:
Ich habe die GxEPD2 & GxEPD nochmal gelöscht (aus dem Sketch Ordner) und neu installiert, dann am Mega nochmal neu verkabelt und plötzlich funzt es.

Ob die Lib besser ist muss ich erst noch testen. Im Beispielcode gibt es aber einen Sketch zur partiellen Änderung ohne Flackern.
Title: Re: Test ePaper Waveshare 1.54
Post by: uwefed on Apr 16, 2019, 09:48 am
Steht doch da Tommy!  :smiley-mr-green:

Nee. ich hatte ein paar Probleme beim Kürzen des Codes - passen nur 9000 Zeichen ins Forum - habe es jetzt nachgereicht.
Dann hänge den Sketch als File an.
Title: Re: Test ePaper Waveshare 1.54
Post by: stoni99 on Apr 17, 2019, 10:31 am
Die GxEPD funktioniert bei mir nicht richtig.

Schon im Demo soll sich ein Boot bewegen von dem man nur den Bug sieht.

Partielle Textänderung (ohne Flackern) funktioniert zwar, aber der Text wird nach 4 Zeichen abgeschnitten (Wie auch der Rest beim Boot-Beispiel).

Drehe ich den Bildschirm erscheint zwar der volle Text aber die partielle Änderung funktioniert dann nicht mehr.

Ich habe jetzt auch nochmal die GxEPD2 Lib geladen.

Das Demo (https://github.com/ZinggJM/GxEPD2/blob/master/examples/GxEPD2_Example/GxEPD2_Example.ino) funktioniert super. Beeindruckend was dann alles machbar ist. Partielle Textänderung ist auch fehlerfrei. Leider ist der Programmieraufwand seeeehr hoch um "nur mal ein paar Infos auf dem Bildschirm auszugeben"!
Title: Re: Test ePaper Waveshare 1.54
Post by: postmaster-ino on Apr 17, 2019, 05:28 pm
Hi

Der 'sehr hohe Aufwand' ist aber überall - nur nehmen Dir im Groben und Ganzen diverse Lib's diesen ganzen Aufwand ab - Sie verstecken Diesen sogar vor Dir.
Selbst das schnöde Auslesen eines I²C-Sensor ist 'zu Fuß' eine ganz andere Hausnummer.
Denke, die von Dir benutzte Lib kann Das nicht mehr großartig zusammen pressen, da dann die Flexibilität verloren geht - dann passt die Lib nur noch zu einem einzigem Problem - und somit ist dann diese Lib für den Rest der Menschheit Müll.

Der ganze Programmier-Aufwand kann in einer Funktion ausgelagert zwar immer noch so aufwändig sein, für Deinen Aufruf aber ein Einzeiler werden.
Das spezialisiert Das dann zwar auf Dein Problem - aber wenn Du Das nicht für Dein Problem baust, für Welches sonst?

MfG
Title: Re: Test ePaper Waveshare 1.54
Post by: stoni99 on Apr 18, 2019, 07:34 am
Ja, als Funktion auslagern habe ich auch schon überlegt.

Ich kapier aber noch nicht so ganz was die da machen.

Z.B.

Code: [Select]
// Adafruit_GFX has a handy method getTextBounds() to determine the boundary box for a text for the actual font
  int16_t tbx, tby; uint16_t tbw, tbh; // boundary box window
  display.getTextBounds(text, 0, 0, &tbx, &tby, &tbw, &tbh); // it works for 0, 0, fortunately (negative tby!)


oder

Code: [Select]
display.setFullWindow();
  display.firstPage();
  do
  {
    display.fillScreen(GxEPD_WHITE);
    display.setCursor(x, y);
    display.print(HelloWorld);
  }
  while (display.nextPage());
  //Serial.println("helloWorld done");


Eigentlich habe die ja extra für Typen wie mich ein Erklärungscode geschrieben:

Code: [Select]
void helloWorldForDummies()
{
  //Serial.println("helloWorld");
  const char text[] = "Hello World!";
  // most e-papers have width < height (portrait) as native orientation, especially the small ones
  // in GxEPD2 rotation 0 is used for native orientation (most TFT libraries use 0 fix for portrait orientation)
  // set rotation to 1 (rotate right 90 degrees) to have enough space on small displays (landscape)
  display.setRotation(1);
  // select a suitable font in Adafruit_GFX
  display.setFont(&FreeMonoBold9pt7b);
  // on e-papers black on white is more pleasant to read
  display.setTextColor(GxEPD_BLACK);
  // Adafruit_GFX has a handy method getTextBounds() to determine the boundary box for a text for the actual font
  int16_t tbx, tby; uint16_t tbw, tbh; // boundary box window
  display.getTextBounds(text, 0, 0, &tbx, &tby, &tbw, &tbh); // it works for 0, 0, fortunately (negative tby!)
  // center the boundary box of the text
  uint16_t x = (display.width() - tbw) / 2;
  uint16_t y = (display.height() + tbh) / 2; // y is base line!
  // full window mode is the initial mode, set it anyway
  display.setFullWindow();
  // here we use paged drawing, even if the processor has enough RAM for full buffer
  // so this can be used with any supported processor board.
  // the cost in code overhead and execution time penalty is marginal
  // tell the graphics class to use paged drawing mode
  display.firstPage();
  do
  {
    // this part of code is executed multiple times, as many as needed,
    // in case of full buffer it is executed once
    // IMPORTANT: each iteration needs to draw the same, to avoid strange effects
    // use a copy of values that might change, don't read e.g. from analog or pins in the loop!
    display.fillScreen(GxEPD_WHITE); // set the background to white (fill the buffer with value for white)
    display.setCursor(x, y); // set the postition to start printing text
    display.print(text); // print some text
    // end of part executed multiple times
  }
  // tell the graphics class to transfer the buffer content (page) to the controller buffer
  // the graphics class will command the controller to refresh to the screen when the last page has been transferred
  // returns true if more pages need be drawn and transferred
  // returns false if the last page has been transferred and the screen refreshed for panels without fast partial update
  // returns false for panels with fast partial update when the controller buffer has been written once more, to make the differential buffers equal
  // (for full buffered with fast partial update the (full) buffer is just transferred again, and false returned)
  while (display.nextPage());
  //Serial.println("helloWorld done");
}


Aber ehrlich gesagt habe ich ihn noch nicht ganz kapiert. :)  Bin ich jetzt schlimmer als ein Dummie....? :'(

Title: Re: Test ePaper Waveshare 1.54
Post by: postmaster-ino on Apr 18, 2019, 11:14 pm
Hi

Werde mir Das 'Morgen' noch Mal anschauen - heute wird Das wohl Nichts mehr.
Der schlimmste Feind des Progger ist der Dau ;)
Das aber nicht, weil der Dau blöd wäre, sondern weil der Progger viel mehr Wissen voraussetzt - weil Er eben den ganzen Kram lange 'gefressen' hat und Ihm Das 'in Fleisch und Blut' über gegangen ist.
Wo der Progger gar nicht mehr drüber nachdenke, muß der Dau zig Gedankensprünge bewältigen, Die der Progger gar nicht mehr sieht - ok, macht's dem Dau nicht leichter ;)

Wird wohl mit 'betriebsblind' ganz gut umschrieben.

MfG