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.
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 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 ?
@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.
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.
@pylon Das kann ich mal noch probieren, hab es jetzt aber anders hinbekommen.
Zwar nicht perfekt, aber immerhin mal größer
@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 ..."
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
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 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 '#'.");
}
}
}
}
@ZinggJM Danke für den Tipp, hab damit mal etwas rumgespielt, konnte aber keinen Unterschied erkennen 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!