"Bildschirmschoner" für Touchdisplay

Hey ihr,

ich will bei einem Touch-Display folgendes erreichen: Nach 5 Sekunden ohne Berührung soll die Hintergrundbeleuchtung ausgeschaltet werden, damit es z.B. im dunklen nicht stört. Tippt man dann auf das Display, so soll die Hintergrund Beleuchtung wieder angehen. Bis dahin funktioniert auch alles schon sehr gut.
Nun will ich aber, dass beim Berühren während das Hintergrundlicht aus ist, nicht direkt auch eine Aktion ausgeführt wird welche ich auf meine Touch-Buttons gelegt habe. Also habe ich dafür eine Überprüfung eingebaut die erst nach 500ms die Touchflächen weiterverarbeiten würde (das passiert in der Funktion check_touch(). Das klappt die ersten 30-60 Sekunden Betrieb vom Arduino UNO auch sehr gut. Danach wird diese Überprüfung irgendwie ignoriert bzw. irgendetwas passt nichtmehr, wodurch die Touch-Buttons wieder direkt ausgeführt werden.
Ich hoffe ich habe mich verständlich eingedrückt. :sweat_smile:

Hier mal mein Code, ich würde mich freuen wenn sich einer von euch das erklären kann:

unsigned long screensave_start = 0;
const int INACTIVITY_TIMEOUT = 5000; // Zeit in Millisekunden für Inaktivität
int previous_touch_x = -1;
int previous_touch_y = -1;
bool screensaver_active = false;
int touch_active_time = 0;

void check_screensaver()
{
  // Schaut ob der Bildschirm berührt wird
  if(t_x != previous_touch_x && t_y != previous_touch_y)
  {
    if(screensaver_active == true)
    {
      touch_active_time = millis();
    }
    digitalWrite(BACKLIGHT, HIGH); // macht das Hintergrundlicht an
    screensaver_active = false; // setzt denn "Bildschirmschoner" auf aus
    screensave_start = millis(); // speichert die Zeit um später zu überprüfen wann zueletzt gedrückt wurde
    Serial.println("Aktiviere hintergrundlicht"); 
  }

  // Schaut ob bereits 5 Sekunden lang nichts gedrückt wurde
  if(millis() - screensave_start >= INACTIVITY_TIMEOUT && screensaver_active == false)
  {
    digitalWrite(BACKLIGHT, LOW); // Macht das Hintergrundlicht aus
    screensaver_active = true; // setzt denn "Bildschirmschoner" auf ein
    // touch_active_time = millis(); // Speichert die Zeit um später alle Touch-Flächen (in check_touch()) nur zu kontrollieren wenn bereits 500ms das Hintergrundlicht eingeschaltet ist
    Serial.println("Dektiviere hintergrundlicht");
  }

  

  // Schaut ob der Bildschirmschoner aus ist & es bereits 500ms her ist als dieser deaktiviert wurde
  if(millis() - touch_active_time >= 500 && screensaver_active == false) 
  {
    check_touch();
    Serial.println("Checke Touchflächen");
  }

  // Aktualisiere die vorherigen Touch-Koordinaten
  previous_touch_x = t_x;
  previous_touch_y = t_x;
}

Es handelt sich hierbei nur um die Funktion welche den Bildschirmschoner überprüft.
Im loop sieht es so aus:

void loop()
{

  TSPoint p = Waveshield.getPoint();
  Waveshield.normalizeTsPoint(p);

  touch_x = 480 - p.x;
  touch_y = 320 - p.y;

  check_screensaver();

  if(seitenzahl == 1)
  {
    if(gezeichnet == false)
    {
      draw_1();
    }
  }

  if(seitenzahl == 2)
  {
    if(gezeichnet == false)
    {
      draw_2();
    }
  }
}

das sind meine Bibliotheken für das Display:

#include <Adafruit_GFX.h>
#include <Waveshare_ILI9486.h>

a) wenn du den Wert aus millis speichern willst, musst du schon einen großen Datentypen verwenden, der auch die ganzen millis() aufnehmen kann. Z.B. uint32_t
Siehe auch das Beispiel Blink Without Delay in der IDE.

b) aktiviere in der IDE die Warnungen beim Compilieren, der Compiler hätte dir das vermutlich rausgeschrieben, dass du versucht einen unsigned 32bit Wert in einen signed 16bit Wert zu speichern.

1 Like

Danke dir das macht natürlich sinn.
Werde ich heute Nachmittag wenn ich daheim bin direkt anpassen und testen :+1:

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