Moin.
Ich bin Neuling im Bereich der ESP-Familie und komme bei meinem gewünschten Usecase nicht weiter. Ich möchte mit einem D1mini (ESP8266-Basis) Daten von einer Webseite auf einem Waveshare 2.9inch ePaper (b/w) ausgeben.
Die Daten von der Webseite kann ich als JSON herunterladen, das klappt.
Bei der Ausgabe auf dem Display komme ich jedoch trotz verschiedener Beispiele aus dem Netz nicht weiter.
Als IDE nutze ich aktuell die Arduino IDE in Version 2.3.2.
Mein aktueller Sketch sieht wie folgt aus:
// mapping suggestion from Waveshare SPI e-Paper to Wemos D1 mini
// BUSY -> D2, RST -> D4, DC -> D3, CS -> D8, CLK -> D5, DIN -> D7, GND -> GND, 3.3V -> 3.3V
// include library, include base class, make path known
#include <GxEPD.h>
// select the display class to use, only one
//#include <GxGDEH029A1/GxGDEH029A1.h> // 2.9" b/w
#include <GxGDEW029T5/GxGDEW029T5.h> // 2.9" b/w UC8151 (IL0373)
//#include <GxGDEW029T5D/GxGDEW029T5D.h> // 2.9" b/w UC8151D
//#include <GxGDEM029T94/GxGDEM029T94.h> // 2.9" b/w
//#include <GxDEPG0290BS/GxDEPG0290BS.h> // 2.9" b/w Waveshare variant, TTGO T5 V2.4.1 2.9"
#include GxEPD_BitmapExamples
// FreeFonts from Adafruit_GFX
#include <Fonts/FreeMonoBold9pt7b.h>
#include <Fonts/FreeMonoBold12pt7b.h>
#include <Fonts/FreeMonoBold18pt7b.h>
#include <Fonts/FreeMonoBold24pt7b.h>
#include <GxIO/GxIO_SPI/GxIO_SPI.h>
#include <GxIO/GxIO.h>
GxIO_Class io(SPI, /*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2); // arbitrary selection of D3(=0), D4(=2), selected for default of GxEPD_Class
GxEPD_Class display(io, /*RST=D4*/ 2, /*BUSY=D2*/ 4); // default selection of D4(=2), D2(=4)
void setup()
{
Serial.begin(115200);
delay(800);
Serial.println();
Serial.println("setup");
display.init(115200); // enable diagnostic output on Serial
#if defined(__AVR) || false
display.drawPaged(drawHelloWorld);
#elif (defined(_GxGDEW075Z09_H_) || defined(_GxGDEW075Z08_H_)) && (defined(ESP8266) || defined(ARDUINO_ARCH_STM32F1))
display.drawPaged(drawHelloWorld);
#elif defined(_GxGDEW075Z09_H_)
display.drawPaged(drawHelloWorld);
#else
drawHelloWorld();
display.update();
#endif
display.powerDown();
Serial.println("setup done");
}
void loop() {
Serial.println("loop");
delay(5000);
};
const char HelloWorld[] = "Hello World!";
void drawHelloWorld()
{
Serial.println("drawHelloWorld");
display.setRotation(1);
display.setFont(&FreeMonoBold9pt7b);
display.setTextColor(GxEPD_BLACK);
int16_t tbx, tby; uint16_t tbw, tbh;
display.getTextBounds(HelloWorld, 0, 0, &tbx, &tby, &tbw, &tbh);
// center bounding box by transposition of origin:
uint16_t x = ((display.width() - tbw) / 2) - tbx;
uint16_t y = ((display.height() - tbh) / 2) - tby;
display.fillScreen(GxEPD_WHITE);
display.setCursor(x, y);
display.print(HelloWorld);
Serial.println("drawHelloWorld done");
}
void drawHelloWorldForDummies()
{
// This example function/method can be used with full buffered graphics AND/OR paged drawing graphics
// for paged drawing it is to be used as callback function
// it will be executed once or multiple times, as many as needed,
// in case of full buffer it can be called directly, or as callback
// 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!
//Serial.println("drawHelloWorldForDummies");
const char text[] = "Hello World!";
// most e-papers have width < height (portrait) as native orientation, especially the small ones
// in GxEPD 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 origin 0, 0, fortunately (negative tby!)
// center bounding box by transposition of origin:
uint16_t x = ((display.width() - tbw) / 2) - tbx;
uint16_t y = ((display.height() - tbh) / 2) - tby;
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
//Serial.println("drawHelloWorldForDummies done");
}
Ob die Grafiklib die richtige ist, weiss ich leider nicht, ich habe alle probiert.
Entweder bekomme ich im seriellen Monitor Ausgaben ala
kcCn%!��a�b�%�!�eaA�maAk�kcCn%!�;�...
�drawHelloWorld
drawHelloWorld done
_wakeUp Power On : 9
update : 1
_sleep Power Off : 1
_sleep Power Off : 1
setup done
loop
oder
;d$ܟ|�d�| �l� c|����s� .....
�drawHelloWorld
drawHelloWorld done
Busy Timeout!
command 0x1 : 10000265
Busy Timeout!
command 0xc : 10000127
aber keinerlei Ausgabe auf dem Display selbst.
Was mir auch aufgefallen ist, dass wenn das Display angeschlossen ist, ich keinen neuen Sketch auf den ESP hochladen kann. Sobald ich das Display vom D1mini trenne ist ein neuer Upload möglich.
Das ich leider nicht verifizieren kann, ob das Display (durch meine Versuche) einen Treffer hat, habe ich mir ein neues bestellt. Da ich dieses aber nicht auch gleich schrotten möchte, würde ich mich über Hilfe von Euch freuen. Wie ich in einigen Beiträgen gesehen habe, sind manche ja erfolgreich bei der Umsetzung gewesen (timschillert oder amithlon, als Beispiel ).
Vielen Dank!