Hallo,
ich versuche das Beispiel der esp32-weather-station-color.ino nachzuvollziehen (Modified 2020 by Zihatec GmbH for AZ-Touch ESP with ESP32) und habe natürlich die angegebenen Libs dazu bereitgestellt. Ich stolpere allerdings beim zusammenlinken mit folgenden Fehlermeldungen:
esp32-weather-station-color.ino.cpp.o:(.literal._Z5setupv+0x24): undefined reference to XPT2046_Touchscreen::begin(SPIClass&)' esp32-weather-station-color.ino.cpp.o: in function setup()':
esp32-weather-station-color.ino:168:(.text._Z5setupv+0x5b): undefined reference to XPT2046_Touchscreen::begin(SPIClass&)' TouchControllerWS.cpp.o:(.literal._ZN17TouchControllerWS9isTouchedEs+0x0): undefined reference to XPT2046_Touchscreen::touched()'
TouchControllerWS.cpp.o:(.literal._ZN17TouchControllerWS8getPointEv+0x0): undefined reference to XPT2046_Touchscreen::getPoint()' TouchControllerWS.cpp.o: in function TouchControllerWS::isTouched(short)':
TouchControllerWS.cpp:12:(.text._ZN17TouchControllerWS9isTouchedEs+0x7): undefined reference to XPT2046_Touchscreen::touched()' TouchControllerWS.cpp.o: in function TouchControllerWS::getPoint()':
TouchControllerWS.cpp:20:(.text._ZN17TouchControllerWS8getPointEv+0x7): undefined reference to `XPT2046_Touchscreen::getPoint()'
Ich habe im Folgenden nur die Ausschnitte aus dem Code herauskopiert, um den Beitrag nicht aufzublähen, ich kann natürlich den kompletten Code nachliefern.
esp32-weather-station-color.ino:
void setup() {
Serial.begin(115200);
// switch TFT backlight on
pinMode(TFT_LED, OUTPUT);
digitalWrite(TFT_LED, LOW); // HIGH to Turn on;
gfx.init();
gfx.fillBuffer(MINI_BLACK);
gfx.commit();
connectWifi();
Serial.println("Initializing touch screen...");
ts.begin(); // Aufruf der fehlerhaften Funktion (?)
carousel.setFrames(frames, frameCount);
carousel.disableAllIndicators();
// update the weather information
updateData();
timerPress = millis();
canBtnPress = true;
}
`
Hier geht's weiter mit TouchControllerWS.cpp:
TS_Point TouchControllerWS::getPoint() {
TS_Point p = touchScreen->getPoint();
/*
int x = (p.y - ax) * dx;
int y = 320 - (p.x - ay) * dy;
p.x = x;
p.y = y;*/
p.x = map(p.x, TS_MINX, TS_MAXX, 0, 320);
p.y = map(p.y, TS_MINY, TS_MAXY, 240, 0);
return p;
}
return p;
}
Und schließlich mit XPT2046_Touchscreen:
class XPT2046_Touchscreen {
public:
constexpr XPT2046_Touchscreen(uint8_t cspin, uint8_t tirq=255)
: csPin(cspin), tirqPin(tirq) { }
bool begin(SPIClass &wspi = SPI);
#if defined(_FLEXIO_SPI_H_)
bool begin(FlexIOSPI &wflexspi);
#endif
TS_Point getPoint();
bool tirqTouched();
bool touched();
void readData(uint16_t *x, uint16_t *y, uint8_t *z);
bool bufferEmpty();
uint8_t bufferSize() { return 1; }
void setRotation(uint8_t n) { rotation = n % 4; }
// protected:
volatile bool isrWake=true;
private:
void update();
uint8_t csPin, tirqPin, rotation=1;
int16_t xraw=0, yraw=0, zraw=0;
uint32_t msraw=0x80000000;
SPIClass *_pspi = nullptr;
#if defined(_FLEXIO_SPI_H_)
FlexIOSPI *_pflexspi = nullptr;
#endif
};
Der ursächliche Fehler scheint in der Zeile "bool begin(SPIClass &wspi = SPI);" zu liegen, das SPI liegt an folgenden Ports:
// Pins for the ILI9341 and ESP32
#define TFT_DC 4
#define TFT_CS 5
#define TFT_LED 15
#define TFT_RST 22
#define TFT_MISO 19
#define TFT_MOSI 23
#define TFT_SCLK 18
//#define HAVE_TOUCHPAD
#define TOUCH_CS 14
//#define TOUCH_IRQ 2 // enable this line for older ArduiTouch or AZ-Touch ESP pcb
#define TOUCH_IRQ 27 // enable this line for new AZ-Touch MOD pcb
Ich verwende die Arduino IDE2.3.7. Beispiele, die mit der Bibliothek TFT_espi arbeiten, habe ich ans Laufen bekommen, aber es wird sich ja jemand etwas dabei gedacht haben die XPT2024_Touchscreen.h zu verwenden.
Für Hinweise zum Verständnis der Fehlermeldungen und deren Vermeidung sage ich schon mal vielen Dank!
Uli
