ArduiTouch 3 - Tekenen op het Touch Scherm


In dit bericht wil ik de mogelijkheden van verkennen TouchEvent-bibliotheek  laten zien. Het maakt het zeer eenvoudig om te reageren op gebeurtenissen op het touchscreen. U kunt de bibliotheek eenvoudig downloaden van GitHub en kopiëren naar de map Arduino libraries. Er is een demo-programma in de voorbeelden dat de toepassing toont. Op basis van dit demo-programma leg ik in dit artikel de afzonderlijke functies van de bibliotheek uit.

We hebben er een nodig als hardware ArduiTouch  met ESP32-processor.

Code:

 

 

/ * dit voorbeeld toont het gebruik van de TouchEvent-bibliotheek
  * Het maakt gebruik van een 2,4-inch TFT-scherm met resistief touchscreen
  * Het display gebruikt een ILI9341-controller
  * En het touchscreen een XPT2046
  * De module wordt gebruikt samen met een ESP32 maar met elke andere
  * Arduino-compatibele processor zou moeten werken
  * Zie de definities in de code voor de gebruikte pinnen
 */

// vereiste bibliotheken
# opnemen <SPI.h>
# opnemen "Adafruit_GFX.h"
# opnemen "Adafruit_ILI9341.h"
# opnemen <XPT2046_Touchscreen.h>
# opnemen <Lettertypen/FreeSans9pt7b.h> // gebruikt font5

# opnemen "TouchEvent.h"

// gebruikte pinnen
#define TFT_CS   5      // diplay-chip selecteren
#define TFT_DC   4      // weergave d / c
#define TFT_MOSI 23     // diplay MOSI
#define TFT_CLK  18     // klok weergeven
#define TFT_RST  22     // display reset
#define TFT_MISO 19     // MISO weergeven
#define TFT_LED  15     // display achtergrond LED


#define TOUCH_CS 14     // aanraakscherm chip selecteren
#define TOUCH_IRQ 2     // touchscreen onderbreken


// stuurprogramma voorbereiden voor weergave en touchscreen
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST);
XPT2046_Touchscreen aanraken(TOUCH_CS, TOUCH_IRQ);

// init TouchEvent met aanwijzer naar de driver met aanraakscherm
TouchEvent tevent(aanraken);

// enkele globale variabelen
int scr = 0;
uint16_t bg[4] = {ILI9341_WHITE,ILI9341_RED,ILI9341_GREEN,ILI9341_YELLOW};
TS_Point laatste;
Boolean tekenen;

// veeggebeurtenis
nietig onSwipe(uint8_t jij) {   schakelaar(jij) {     geval 0: als (scr <3) { // van rechts naar links overschakelen naar het volgende scherm         scr++;         teken_scherm(scr);       }       pauze;     geval 1: als (scr > 0) { // van links naar rechts overschakelen naar het vorige scherm         scr--;         teken_scherm(scr);       }       pauze;   }   tevent.setDrawMode(scr==0);
}

nietig onClick(TS_Point p) {   als (scr > 0) { // op elk scherm behalve 0 de klikpositie weergeven     tft.setFont(&FreeSans9pt7b);     tft.fillRect(0,40,240,70,ILI9341_WHITE);     tft.setTextColor(ILI9341_BLACK,ILI9341_WHITE);     tft.setCursor(10,60);     tft.println("Geklikt");     tft.println(p.x);     tft.println(p.y);   }
}

nietig onDblClick(TS_Point p) {   als (scr > 0) { // op elk scherm behalve 0, dubbelklikpositie weergeven     tft.fillRect(0,40,240,70,ILI9341_WHITE);     tft.setFont(&FreeSans9pt7b);     tft.setTextColor(ILI9341_BLACK,ILI9341_WHITE);     tft.setCursor(10,60);     tft.println("Dubbelklik");     tft.println(p.x);     tft.println(p.y);   } anders {     tevent.setDrawMode(fout);   }
}

nietig onDraw(TS_Point p) {   // teken een lijn van de laatste positie naar de huidige positie   als (tekenen) tft.drawLine(laatste.x,laatste.y,p.x,p.y,ILI9341_BLACK);   laatste = p;
}

nietig onTouch(TS_Point p) {   laatste = p;   tekenen = waar;
}

nietig onTouch(TS_Point p) {   tekenen = fout;
}

nietig onLongClick(TS_Point p) {   als (scr > 0) { // op elk scherm behalve 0, dubbelklikpositie weergeven     tft.setFont(&FreeSans9pt7b);     tft.fillRect(0,40,240,70,ILI9341_WHITE);     tft.setTextColor(ILI9341_BLACK,ILI9341_WHITE);     tft.setCursor(10,60);     tft.println("Lange klik");     tft.println(p.x);     tft.println(p.y);   }
}

nietig instellen() {   Serie.beginnen(115200);   pinMode(TFT_LED, UITGANG);   digitalWrite(TFT_LED, HOOG);    // display inschakelen   // start stuurprogramma's   tft.beginnen();   aanraken.beginnen();   // toon de weergavenresolutie   Serie.afdrukken("tftx ="); Serie.afdrukken(tft.breedte()); Serie.afdrukken("tfty ="); Serie.println(tft.hoogte());   // init TouchEvent-instantie   tevent.setResolution(tft.breedte(),tft.hoogte());   tevent.setDblClick(300);   tevent.registerOnTouchSwipe(onSwipe);   tevent.registerOnTouchClick(bij klikken);   tevent.registerOnTouchDblClick(onDblClick);   tevent.registerOnTouchLong(onLongClick);   tevent.registerOnTouchDraw(onDraw);   tevent.registerOnTouchDown(op aanraking);   tevent.registerOnTouchUp(onTouch);   //Scherm
 teken_scherm(scr);
}

// scherm vullen met verschillende kleuren voor verschillende schermnummers
nietig teken_scherm(uint8_t nr) {   tft.fillScreen(bg[nr]);   tft.setFont(&FreeSans9pt7b);   tft.setTextColor(ILI9341_BLACK,ILI9341_WHITE);   tft.setCursor(10,20);   tft.afdrukken("Scherm Nr.");   tft.afdrukken(nr);    }

nietig lus() {   // enquête voor aanraakgebeurtenissen   tevent.pollTouchScreen();
}

Die TouchEvent Klasse holt in ihrer Hauptfunktion pollTouchScreen () die aktuellen Werte vom Touch-Screen und versucht Ereignisse zu erkennen. Wurde ein Ereignis erkannt und eine Callback-Funktion für dieses Ereignis registriert, so wird diese Funktion mit der aktuellen Positie in Bildschirm-Koordinaten aufgerufen. Eine Ausnahme ist die Callback-Funktion für das Swipe-Ereignis, in diesem Fall wird die Richtung der Wischbewegung als Parameter übergeben.

Für folgende Ereignisse kann eine Callback-Funktion registriert werden.

 

  • onTouchDown (TS_Point p) diese Funktion wird immer dann aufgerufen, wenn der Schirm berührt wird.
  • onTouchUp (ongeldig (TS_Point p)  diese Funktion wird immer dann aufgerufen wenn die Schirmberührung endet.
  • onTouchClick (ongeldig (TS_Point p) diese Funktion wird dann aufgerufen, wenn der Schirm kurz berührt wurde. Die Berührung darf nicht länger sein als die Zeit, die voor den langen Klick eingestellt wurde. (Standaard 1 Sekunde)
  • onTouchDblClick (TS_Point p)diese Funktion wird aufgerufen wenn der Schirm innerhals beiner einstellbaren Zeit (Standaard 500 ms) zweimal kurz berührt wurde. Jedes Doppelklick Ereignis löst beim ersten Klick auch ein Klick-Ereignis aus.
  • onTouchLong (TS_Point p)  diese Funktion wird dann aufgerufen wenn der Schirm mindestens eine einstellbare Zeit (Default 1 s) berührt wurde. In diesem Fall wird kein Klick-Ereignis ausgelöst.
  • onTouchDraw (TS_Point p) diese Funktion wird aufgerufen wenn der Berührungspunkt während der Berührung verändert wird. Über den einstellbaren Wert moveThreshold (standaard = 10) kann die Empfindlichkeit variiert werden. Das Ereignis wird nur aufgerufen wenn der Draw-Mode aktiv ist.
  • onTouchSwipe (richting uint8_t)  diese Funktion wird aufgerufen, wenn über den Bildschirm gewischt wird. Die mindest Wischlänge kann für x (default = 500) und y (default = 700) eingestellt werden. Der Funktion wird als parameter die Richtung migegeben. 0 = von rechts nach links, 1 = vonlinks nach rechts, 2 = von oben nach unten und 3 = von unten nach oben. Dieses Ereignis wird nicht ausgelöst, wenn der Draw-Mode nicht aktiv ist.

Als Zusammenfassung hier noch einmal alle Funktionen der Klasse:

  • pollTouchScreen ();
    die aktuelle Positie van touchscreen Wird abgefragt und je nach erkannten Ereignissen werden registrierte Callback-Funktionen aufgerufen
  • void setResolution (int16_t xResolution, int16_t yResolution);
    die Auflösung des Bildsch bevestigd in Pixel kann eingestellt werden (standaard 240 en 320)
  • void setDrawMode (boolean drawMode);
    schaltet den Zeichen-Modus ein oder aus (default = aus).
  • ongeldig kalibreren (uint16_t xMin, uint16_t yMin, uint16_t xMax, uint16_t yMax);
    dient zur Kalibrierung des Touch-Screens. Die Werte geben die linke obere und die rechte untere Ecke in Touch-Screen Koordinaten an (standaard = 230, 350, 3700 en 3900).
  • void setMoveTreshold (uint16_t drempel);
    stelt de wijziging in aanraakschermcoördinaten in die moet plaatsvinden zodat een onDraw-gebeurtenis wordt herkend (standaard = 10).
  • void setSwipe (uint16_t swipeX, uint16_t swipeY);
    stelt de lengte voor het wisproces in de coördinaten van het touchscreen in, zodat een wisgebeurtenis wordt herkend (standaard = 500.700).
  • void setLongClick (uint16_t clickLong);
    stelt de tijd in ms in hoe lang een aanraking moet duren voordat een lange klik wordt herkend (standaard = 1000ms).
  • void setDblClick (uint16_t dblclick);
    stelt de maximale tijd in tussen 2 klikken in ms zodat een dubbele klik wordt herkend (standaard = 500ms).
  • void registerOnTouchDown (void (* callback) (TS_Point p));
    registreert een callback-functie voor de gebeurtenis onTouchDown.
  • void registerOnTouchUp (void (* callback) (TS_Point p));
    registreert een callback-functie voor de gebeurtenis onTouchUp.
  • void registerOnTouchClick (void (* callback) (TS_Point p));
    registreert een callback-functie voor de gebeurtenis onTouchClick.
  • void registerOnTouchDblClick (void (* callback) (TS_Point p));
    registreert een callback-functie voor de gebeurtenis onTouchDblClick.
  • void registerOnTouchLong (void (* callback) (TS_Point p));
    registreert een callback-functie voor de gebeurtenis onTouchLong.
  • void registerOnTouchDraw (void (* callback) (TS_Point p));
    registreert een callback-functie voor de gebeurtenis onTouchDraw.
  • void registerOnTouchSwipe (void (* callback) (uint8_t direction));
    registreert een callback-functie voor de gebeurtenis onSwipeDown.
  • boolean isInArea (TS_Point p, int16_t x1, int16_t y1, int16_t x2, int16_t y2);
    De hulpfunctie retourneert Whar als het punt p binnen de rechthoek x1, y1 en x2, y2 ligt.

 

Nadat het demo-programma is gestart, wordt de eerste pagina "Scherm nr. 0" weergegeven met een witte achtergrond. De tekenmodus is actief op deze pagina en u kunt met uw vinger of beter tekenen met een zacht bot potlood.

Dubbelklik om de tekenmodus te verlaten. Nu kunt u schakelen tussen de pagina's door te vegen. Pagina 1 met een rode achtergrond, pagina 2 geel en pagina 3 groen. Klik, dubbelklik en lange klik met positie worden weergegeven op alle pagina's behalve pagina 0. Wanneer u naar pagina 0 overschakelt, wordt de tekenmodus automatisch opnieuw geactiveerd.

Veel plezier met klikken en vegen;)

 

DisplaysEsp-32Projekte für fortgeschrittene

3 Kommentare

OlliBaba

OlliBaba

Der Touch funktioniert nur mit 2 Änderungen:
Für das 2,4" mod Touch Display muss es heißen:
#define TOUCH_IRQ 27 //touch screen interrupt 27 anstatt 2 bei altem Display
und die Änderung von Manfred muss auch drin stehen:
digitalWrite(TFT_LED, LOW); // Display-Beleuchtung einschalten —>LOW nicht HIGH

André

André

Ja,
digitalWrite(TFT_LED, LOW); // Display-Beleuchtung einschalten
ist richtig
Die Lösung für die Touch fuktion ist:
Jumper von GPIO2 entfernen!
Für den TouchScreen Interrupt wird der GPIO2 Pin verwendet, der zum Flashen des ESP32 auf Low sein muss. Da der Interrupt Ausgang des Touchscreen Controller einen Pull Up Widerstand hat ist dieser Pin nicht auf Low, sodass das Hochladen des Programms nicht funktioniert.

Manfred

Manfred

Der Touch funktioniert nicht !
Diese Zeile ist falsch ,
digitalWrite(TFT_LED, HIGH); // Display-Beleuchtung einschalten
digitalWrite(TFT_LED, LOW); // Display-Beleuchtung einschalten
das ist richtig!
was ist noch falsch ?

Einen Kommentar hinterlassen

Alle Kommentare werden vor der Veröffentlichung moderiert

Aanbevolen blog berichten

  1. Installeer ESP32 nu van de raad van bestuur
  2. Lüftersteuerung Raspberry Pi
  3. Arduino IDE - Programmieren für Einsteiger - Teil 1
  4. ESP32 - das Multitalent
  5. OTA - Over the Air - ESP Programmeren via Wi-Fi