ESP32 Bluetooth Tastatur und TFT Display, Anzeige flackert

Ich bin aktuell an einem Projekt, eine kleine Fräsmaschine per Kabellosem Bedienpult (ESP32 Bluetooth Keyboard) mit Tastern im Handbetrieb verfahren zu lassen.
Dabei soll bei Tasterdruck nicht nur der Tastenbefehl an die Maschine gesendet werden, sondern es soll auf einem kleinen TFT Display am Bedienpult die aktuelle Richtung angezeigt werden (z.B JOG X-, JOG Y-, usw).
Aktuell habe ich aber das Problem, dass wenn ich die Taster halte, der Text mit der Richtung JOGX+ usw. flackert. Ich möchte aber, dass solange die Taster gedrückt werden, der Text ohne zu flackern angezeigt wird.

//Bibliotheken einbinden
#include <BleKeyboard.h>
#include <PCF8574.h>
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_ST7735.h>
//Bibliotheken einbinden


//Variablen anlegen
int BetriebsartAlt = 0;
int merkerDisplay[17] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
//Variablen anlegen


//Objekte der verschiedenen Klassen anlegen
BleKeyboard bleKeyboard;
PCF8574 m1(0x21);
PCF8574 m2(0x22);
PCF8574 m3(0x24);
PCF8574 m4(0x25);
//Objekte der verschiedenen Klassen anlegen


//Display
#define TFT_CS 33
#define TFT_RST -1
#define TFT_DC 25
const int backlightLed = 26;
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);
//Display


void setup() {

  //Pins der PCF8574-GPIO-Erweiterungsmodule als INPUT oder OUTPUT konfigurieren
  m2.pinMode(P1, INPUT);
  m2.pinMode(P2, INPUT);
  m2.pinMode(P3, INPUT);
  m2.pinMode(P5, INPUT);
  m2.pinMode(P6, INPUT);
  m2.pinMode(P7, INPUT);
  m3.pinMode(P0, INPUT);
  m3.pinMode(P1, INPUT);
  //Pins der PCF8574-GPIO-Erweiterungsmodule als INPUT oder OUTPUT konfigurieren


  //Pins konfigurieren
  pinMode(backlightLed, OUTPUT);
  //Pins konfigurieren


  //Initialisierung der Schnittstellen
  bleKeyboard.begin();
  Serial.begin(9600);
  SPI.begin();
  m2.begin();
  m3.begin();
  //Initialisierung der Schnittstellen

  //Display initialisieren
  tft.initR(INITR_BLACKTAB);
  tft.fillScreen(ST7735_WHITE);
  tft.setRotation(3);
  tft.setTextColor(ST7735_BLACK);
  digitalWrite(backlightLed, HIGH);
  tft.setCursor(25, 55);
  tft.setTextSize(3);
  tft.print("BEDIENPULT");
  delay(1500);
  tft.fillScreen(ST7735_WHITE);
  

  // Display dauerhafter Text Drehzahl, Vorschub und "JOG"
  tft.fillScreen(ST7735_WHITE);
  tft.setCursor(2, 8);
  tft.setTextSize(2);
  tft.print("F=UGS ");
  tft.setCursor(85, 8);
  tft.print("n=0  %");
  tft.setCursor(90, 32);
  tft.print("JOG:");

  for (int k = 0; k < 2; k++)  //Waagerechte Linie unter F und n
  {
    tft.drawLine(75 + k, 0, 75 + k, 25, ST7735_BLACK);
  }

  for (int i = 0; i < 2; i++) {
    tft.drawLine(0, 25 + i, 160, 25 + i, ST7735_BLACK);  //Senkrechte Linie zwischen F und n
  }

  tft.setCursor(10, 30);  //Dauerhafter Text "Betr"
  tft.setTextSize(2);
  tft.print("Betr:");
  //Display initialisieren
}

void loop() {

  //Festlegen, dass Pins der PCF8574-Module als Digitale Werte ausgelesen werden
  uint8_t resetTaster = m2.digitalRead(P4);          // Taster  1: Reset-Taster
  uint8_t xTaster = m2.digitalRead(P5);              // Taster  2: X-Richtung
  uint8_t yTaster = m2.digitalRead(P6);              // Taster  3: Y-Richtung
  uint8_t zTaster = m2.digitalRead(P7);              // Taster  4: Z-Richtung
  uint8_t plusTaster = m3.digitalRead(P0);           // Taster  5: In Richtung + verfahren
  uint8_t minusTaster = m3.digitalRead(P1);          // Taster  6: In Richtung - verfahren
  uint8_t spindelEinTaster = m3.digitalRead(P2);     // Taster  7: Spindel einschalten
  uint8_t spindelAusTaster = m3.digitalRead(P3);     // Taster  8: Spindel ausschalten
  uint8_t ncStartTaster = m3.digitalRead(P4);        // Taster  9: NC-Programm starten
  uint8_t ncStopTaster = m3.digitalRead(P5);         // Taster 10: NC-Programm stoppen
  uint8_t greiferAusfTaster = m3.digitalRead(P6);    // Taster 11: Greifer ausfahren
  uint8_t greiferEinfTaster = m3.digitalRead(P7);    // Taster 12: Greifer einfahren
  uint8_t greiferOefTaster = m4.digitalRead(P0);     // Taster 13: Greifer öffnen
  uint8_t greiferSchlieTaster = m4.digitalRead(P1);  // Taster 14: Greifer schließen

  uint8_t powerSchalter = m2.digitalRead(P1);  // Schalter 2: Bedienpult einschalten --> Display über Transistor einschaltbar   -->0x22 P1
  uint8_t TippSchalter = m2.digitalRead(P2);   // Schalter 3: Betriebsart Tippbetrieb       -->0x22 P2
  uint8_t AutoSchalter = m2.digitalRead(P3);   // Schalter 3: Betriebsart Automatikbetrieb   -->0x22 P3
  //Festlegen, dass Pins der PCF8574-Module als Digitale Werte ausgelesen werden


  //Wenn der Betriebsartschalter auf Tippbetrieb ist
  if ((TippSchalter == 1) && (AutoSchalter == 0)) {
    if (BetriebsartAlt == 1) {
      tft.fillRect(10, 50, 150, 200, ST7735_WHITE);
      BetriebsartAlt = 0;
    }
    delay(20);
    //Wenn der Betriebsartschalter auf Tippbetrieb ist


    if ((xTaster == LOW) && (plusTaster == LOW)) {         //JOG X+
      bleKeyboard.press('d');                              //
      delay(10);                                           //                         //
      tft.setCursor(93, 50);                               //
      tft.setTextSize(2);                                  //
      tft.print("X+");                                     //                                                   //
    }                                                      //
    else if ((xTaster == HIGH) || (plusTaster == HIGH)) {  //
      delay(10);                                           //
      bleKeyboard.release('d');                          //
      tft.fillRect(93, 50, 30, 20, ST7735_WHITE);  //
      merkerDisplay[0] = 0;                        //
    }                                              //


    if ((xTaster == LOW) && (minusTaster == LOW)) {         //JOG X-
      bleKeyboard.press('a');                               //
      delay(10);                                            //
      tft.setCursor(93, 50);                                //
      tft.setTextSize(2);                                   //
      tft.print("X-");                                      //
    }                                                       //
    else if ((xTaster == HIGH) || (minusTaster == HIGH)) {  //
      delay(10);                                            //
      bleKeyboard.release('a');                             //
      tft.fillRect(93, 50, 30, 20, ST7735_WHITE);  //
    }                                              //


    if ((yTaster == LOW) && (plusTaster == LOW)) {         //JOG Y+
      bleKeyboard.press('w');                              //
      delay(10);                                           //
      tft.setCursor(93, 50);                               //
      tft.setTextSize(2);                                  //
      tft.print("Y+");                                     //
    }                                                      //
    else if ((yTaster == HIGH) || (plusTaster == HIGH)) {  //
      delay(10);                                           //
      bleKeyboard.release('w');                            //
      tft.fillRect(93, 50, 30, 20, ST7735_WHITE);          //
    }                                                      //


    if ((yTaster == LOW) && (minusTaster == LOW)) {         //JOG Y-
      bleKeyboard.press('s');                               //
      delay(10);                                            //
      tft.setCursor(93, 50);                                //
      tft.setTextSize(2);                                   //
      tft.print("Y-");                                      //
    }                                                       //
    else if ((yTaster == HIGH) || (minusTaster == HIGH)) {  //
      delay(10);                                            //
      bleKeyboard.release('s');                             //
      tft.fillRect(93, 50, 30, 20, ST7735_WHITE);           //
    }                                                       //


    if ((zTaster == LOW) && (plusTaster == LOW)) {         //JOG Z+
      bleKeyboard.press('e');                              //
      delay(10);                                           //
      tft.setCursor(93, 50);                               //
      tft.setTextSize(2);                                  //
      tft.print("Z+");                                     //
    }                                                      //
    else if ((zTaster == HIGH) || (plusTaster == HIGH)) {  //
      delay(10);                                           //
      bleKeyboard.release('e');                            //
      tft.fillRect(93, 50, 30, 20, ST7735_WHITE);          //
    }                                                      //


    if ((zTaster == LOW) && (minusTaster == LOW)) {         //JOG Z-
      bleKeyboard.press('q');                               //
      delay(10);                                            //
      tft.setCursor(93, 50);                                //
      tft.setTextSize(2);                                   //
      tft.print("Z-");                                      //
    }                                                       //
    else if ((zTaster == HIGH) || (minusTaster == HIGH)) {  //
      delay(10);                                            //
      bleKeyboard.release('q');                             //
      tft.fillRect(93, 50, 30, 20, ST7735_WHITE);           //
    }                                                       //
  }


  if ((AutoSchalter == 1) && (TippSchalter == 0)) {
    //Wenn Betriebartschalter auf Automatikbetrieb
    if (BetriebsartAlt == 0) {
      tft.fillRect(10, 50, 60, 30, ST7735_WHITE);
      BetriebsartAlt = 1;
    }
    delay(20);

    tft.setCursor(10, 50);
    tft.setTextSize(2);
    tft.print("Auto");
    tft.setCursor(10, 70);
    tft.setTextSize(2);
    tft.print("Eingaben nur ");
    tft.setCursor(10, 85);
    tft.setTextSize(2);
    tft.print("per Laptop ");
    tft.setCursor(10, 103);
    tft.setTextSize(2);
    tft.print("bzw. UGS ");
    tft.setCursor(93, 50);
    tft.setTextSize(2);
    tft.print("N/A");
  }
  //Wenn Betriebartschalter auf Automatikbetrieb
}

Vermutlich löscht tft.fillRect(93, 50, 30, 20, ST7735_WHITE); den Anzeigebereich, wird keine Taste gedrückt. Leider hast Du da einen logischen Fehler, denn der Bereich darf nur gelöscht werden, wenn keine der Tasten gedrückt ist.

Beispiel: JOG X+ ist gedrückt, dann wird "X+" angezeigt. Weil aber JOG X- nicht gedrückt ist, wird die Anzeige gleich wieder gelöscht.

Eine von vielen Lösungen:

    if ((xTaster == LOW) && (plusTaster == LOW)) {         //JOG X+
      bleKeyboard.press('d');                              //
      delay(10);                                           //                         //
      tft.setCursor(93, 50);                               //
      tft.setTextSize(2);                                  //
      tft.print("X+");                                     //                                                   //
    }                                                      //
    else if ((xTaster == LOW) && (minusTaster == LOW)) {         //JOG X-
      bleKeyboard.press('a');                               //
      delay(10);                                            //
      tft.setCursor(93, 50);                                //
      tft.setTextSize(2);                                   //
      tft.print("X-");                                      //
    }                                                       //
...
    else ((xTaster == HIGH) || (plusTaster == HIGH)) {  //
      delay(10);                                           //
      bleKeyboard.release('d');                          //
      tft.fillRect(93, 50, 30, 20, ST7735_WHITE);  //
      merkerDisplay[0] = 0;                        //
    }                                              //

Alternativ kann man einen Merker setzen.

1 Like

Vielen Dank, ein Merker hats gelöst.
Ohne die Hilfe hätte ich das Problem wohl nicht so schnell gelöst bekommen, bin noch ein Arduino-Anfänger.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.