ELEGOO UNO R3 mit Waveshare 4.2" e-Paper Module 400x300 pixels Rev 2.1

Hallo zusammen,

Setup:
ELEGOO UNO R3
Waveshare 4.2" e-Paper Module 400x300" Rev2.1

Ziel:
e-Paper zeigt jede beliebige Zahl von 000 - 999 an.
(Überlegung war hier, dass immer 3 Bilder auf dem e-Paper nebeneinander liegen und mit 3 externen Tastern, jedes Bild geändert werden kann und somit jede Zahl von 000 - 999 möglich wäre)
Gerne auch Tipps, wenn das einfacher gehen würde.

Aktuell habe ich mir das Standard-Example von Waveshare heruntergeladen:
https://www.waveshare.com/wiki/Template:Arduino_Guides_for_SPI_e-Paper

Hier konnte ich dann unter epd4in2 (was meinem e-Paper entspricht) den Code so anpassen, dass mir bspw. eine Zahl auf dem e-Paper angezeigt wird. Hierzu habe ich einfach eine Zahl in Paint als png im 400x300 Format gespeichert und dann über den converter
https://javl.github.io/image2cpp/
umgewandelt.

Über den Befehl wird mir dann das Bild auf dem e-Paper angezeigt:
epd.DisplayFrame(imageName);

Ich schaffe es aber nicht 3 Bilder nebeneinander anzuzeigen -
daher die Frage, wie kann ich mehrere Bilder nebeneinander auf dem e-Paper anzeigen lassen?

Könnte man auch ein Keypad parallel mit einem e-Paper am Uno betreiben?

Bin über jeden Tipp dankbar, falls jemand hierzu eine einfacherere Idee hat bin ich gerne dafür offen.

Danke!

Die SetPartialWindow-Methode dürfte dafür geeignet sein. Die Parameter sind: FramePointer, Position-X, Position-Y, Breite, Höhe.

1 Like

Danke für den Tipp. Mir ist eben noch eingefallen, dass ich doch einfach ein 3x4 Keypad parallel zum e-paper betreibe und dann einfach die Keypad Eingabe in einer Variable speichere und diese dann an das Bild übergebe. Brauche ich eben 1000 Bilder, aber das sollte doch so auch einfach funktionieren oder ?

Wo willst Du auf dem UNO den Speicher dafür her nehmen?

Gruß Tommy

1 Like

Ich weiss nicht, was Du mit "übergeben" meinst, aber für die Bilderauswahl sollte das genügen.

Wieso bitte schön? Durch die oben erwähnte Methode ja eben gerade nicht. Und wie @Tommy56 schon erwähnte, wird das bestimmt nicht funktionieren.

1 Like

Man kann doch mit drawStringAt auch Texte an bestimmten Positionen ausgeben. Wieso sollen die Ziffern da als Bilder dargestellt werden?

Gruß Tommy

Der grösste Font in der Bibliothek ist 20 Pixel gross. Wenn die Anzeige bildschirmfüllend sein soll, dann würde ich wahrscheinlich auch Bilder nehmen.

Andere Lib nehmen mit größeren Fonts. (sagt mir Google)

Gruß Tommy

1 Like

@Tommy56 Okay, da hab ich wohl nicht nachgedacht, dass der Speicher begrenzt ist. Dachte das wäre bei so "einfachen" Bildern überschaubar, aber da hast du recht. Danke, gut dass ich davor gefragt habe.
Und ja, ich wollte nur Bilder benutzen um das ganze Display auszunutzen. Sehe gerade, dass du meinst eine andere Library zu nehmen. Das wäre dann natürlich einfacher wie 10 Bilder.

@pylon ich probiere mal die von dir genannte Methode aus und schaue dann nach einer geeigneten Schriftart.

Danke euch beiden, für die Ratschläge!

@Tommy56 Weißt du wo ich eine lib herbekomme, die ich einbinden kann?

Wollte mir hier eine eigene Font erstellen:https://oleddisplay.squix.ch/

Hab den Code dann in eine Datei.h gespeichert, die ich im libraries Ordner zu den anderen Fonts gelegt habe, kann die Font aber nicht verwenden.

#include <Fonts/OwnFont100.h>
display.setFont(&OwnFont100);

wirft folgenden Fehler:
Compilation error: 'OwnFont100' was not declared in this scope

Sorry, mehr als den Thread über Google habe ich nicht.

Gruß Tommy

1 Like

Scheint, als würde das Objekt im .h-File nicht so heissen. Wenn Du die Datei umbenennst, solltest Du den Inhalt auch umbenennen, damit das konsistent bleibt.

1 Like

Haste schon bei Waveshare geschaut
Wie groß soll die Schriftart sein?

@pylon Das kann ich mal noch probieren, hab es jetzt aber anders hinbekommen.

Zwar nicht perfekt, aber immerhin mal größer :smiley:

@fony Am besten wäre eine Schrift die das ganze Display ausnutzt, wird aber vermutlich schwierig zu finden sein, oder? Bei Waveshare habe ich keine Fonts gefunden.

Das ist mein Code aktuell (mit Sicherheit keine elegante Lösung). Ich tue mich schwer mit dem zentrieren. Dachte es sind 400X300 pixel, aber erst mit "435" ist es horizontal einigermaßen mittig.

    display.fillScreen(GxEPD_WHITE);
    display.setTextColor(GxEPD_BLACK);
    display.setFont(&FreeSansBold24pt7b);
    display.setTextSize(5.9); )
    int textWidth = 72 * 5.9; 
    int textHeight = 24 * 5.9; 
    int positionX = (435 - textWidth) / 2;
    int positionY = (300 - textHeight) / 2; 
    display.setCursor(positionX, positionY + textHeight); 
    display.println("238");

Na ja schön ist das nicht aber " In der Not ..." :wink:
Habe kein e-Paper Display, für TFT gibt es auch einen Konverter nur der baut eine vlw Datei die Zeichen sind zwar auch nur als Bild - Map hinterlegt, nur ob deine Lib damit zu rechtkommt ?
vlw kann auch Processing erzeugen :wink:

1 Like

@fony danke, das mit dem converter werde ich auch Mal testen!

Hi nochmal zusammen,

ich hab jetzt an meinem UNO R3 neben dem e-Paper auch noch ein KeyPad 4x3 angeschlossen und möchte, dass ich 3 Zahlen eingebe, mit der #-Taste bestätige und mir dann die Zahl auf dem e-Paper angezeigt wird. Irgendwie bekomme ich auf dem Display jetzt gar nichts mehr angezeigt :confused: Habt ihr zufällig eine Idee an was es liegen könnte? Hier der Code:

#define ENABLE_GxEPD2_GFX 0
 
#include <GxEPD2_BW.h>
#include <Adafruit_GFX.h>
#include <Keypad.h>

#include <Fonts/FreeSansBold24pt7b.h>

#if defined(__AVR)
#if defined(ARDUINO_AVR_MEGA2560)
#define MAX_DISPLAY_BUFFER_SIZE 5000
#else
#define MAX_DISPLAY_BUFFER_SIZE 800
#endif
#define MAX_HEIGHT(EPD) (EPD::HEIGHT <= MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8) ? EPD::HEIGHT : MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8))
GxEPD2_BW<GxEPD2_420, MAX_HEIGHT(GxEPD2_420)> display(GxEPD2_420(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7));
#endif

const int ROW_NUM    = 4; // Anzahl der Zeilen des Keypads
const int COLUMN_NUM = 3; // Anzahl der Spalten des Keypads

// Definiere die Zeichen, die auf den Tasten des Keypads stehen
char keys[ROW_NUM][COLUMN_NUM] = {
  {'1', '2', '3'},
  {'4', '5', '6'},
  {'7', '8', '9'},
  {'*', '0', '#'}
};

// Die Pin-Nummern der Verbindungen zwischen dem Keypad und dem Arduino
byte pin_rows[ROW_NUM] = {A1, A2, A3, A4};       // Pins der Zeilen (Row 1, Row 2, Row 3, Row 4)
byte pin_column[COLUMN_NUM] = {3, 4, 5};     // Pins der Spalten (Col 1, Col 2, Col 3)

// Erzeuge ein Keypad-Objekt
Keypad keypad = Keypad(makeKeymap(keys), pin_rows, pin_column, ROW_NUM, COLUMN_NUM);

char input_buffer[4]; // Puffer zum Speichern der eingegebenen Zahlen
int input_index = 0;  // Aktueller Index im Eingabepuffer
int number = 0;       // Variable zur Speicherung der dreistelligen Zahl

void setup() {
  display.init(115200);
  display.setRotation(0);
  display.setTextWrap(false);
  display.clearScreen(); // Lösche den Bildschirminhalt
  display.display();     // Zeige den leeren Bildschirm an
  Serial.begin(9600);
  Serial.println("Bitte gib 3 Zahlen ein, dann drücke '#' nach der letzten Zahl.");
}

void loop() {
  char key = keypad.getKey();
  
  if (key != NO_KEY) {
    // Überprüfe, ob die eingegebene Taste eine Zahl (0-9) ist
    if (isdigit(key)) {
      // Füge die Zahl dem Eingabepuffer hinzu, wenn er noch nicht voll ist
      if (input_index < 3) {
        input_buffer[input_index] = key;
        input_index++;
        Serial.print("Eingabe: ");
        for (int i = 0; i < input_index; i++) {
          Serial.print(input_buffer[i]);
        }
        Serial.println();
      }
    } else {
      if (key == '#' && input_index == 3) {
        // Wenn die #-Taste gedrückt wird und der Eingabepuffer drei Zahlen enthält
        // Konvertiere den Eingabepuffer in eine dreistellige Zahl und speichere sie in der Variable "number"
        number = (input_buffer[0] - '0') * 100 + (input_buffer[1] - '0') * 10 + (input_buffer[2] - '0');
        Serial.print("Ausgabe: ");
        Serial.println(number);

        // Zeige die Zahl auf dem e-Paper-Display an
        display.clearScreen(); // Lösche den Bildschirminhalt
        display.setFont(&FreeSansBold24pt7b);
        display.setTextColor(GxEPD_BLACK);
        display.setTextSize(5.9);
        int textWidth = 72 * 5.9;
        int textHeight = 24 * 5.9;
        int positionX = (435 - textWidth) / 2;
        int positionY = (300 - textHeight) / 2;
        display.setCursor(positionX, positionY + textHeight);
        display.print(number); // Gib die Zahl auf dem Display aus
        display.display(); // Zeige den Inhalt des Bildspeichers an
        
        // Setze den Eingabepuffer zurück
        input_index = 0;
      } else {
        Serial.println("Ungültige Eingabe. Bitte gib genau 3 Zahlen ein und bestätige mit '#'.");
      }
    }
  }
}

Versuche mal diesen Wert zu verkleinern.

@ZinggJM Danke für den Tipp, hab damit mal etwas rumgespielt, konnte aber keinen Unterschied erkennen :frowning: Bin in 100er schritten bis auf 100 runter, hab auch mal mehr probiert, limit ist bei 1200, bei 1250 kommt: Datenbereich überschreitet den verfügbaren Platz auf der Platine ..

Muss ja aber irgendwie an der Aktualisierung vom e-Paper liegen oder?

Daraus habe ich vermutet, dass der Arbeitsspeicher nicht mehr ausreicht.
Poste mal diagnostics vom Serial Monitor. Verwende die gleiche Bitrate in init() und begin().
Poste auch den verbleibenden Speicher, z.B. bei MAX_DISPLAY_BUFFER_SIZE 400.

Lies auch mal README.md, insbesondere Paged Drawing, Picture Loop.

würde nur einen kleinen Teil des Bildschirms aufdatieren, mit Arduino UNO.

Poste den vollständigen Code von Post #14, geht nicht ohne paged!