Touchscreen dauerhaft während Programm abfragen

Hallo,

ich habe folgendes Problem:

In meinem Projekt habe ich ein Touchscreen Display (Adafruit 3.5" TFT Breakout).
Mein Problem ist, dass ich während des kompletten Programmablaufs zu jederzeit Berührungen auf dem Touchscreen registrieren und verarbeiten möchte (z.B. Druck auf einen Grafischen Button).

Wenn das Programm nun aber an einer anderen Stelle ist, als die Touchscreen-Abfrage, registriere ich ja die Aktion nicht, sondern erst, wenn das Programm wieder an der Abfrage-Stelle ist.

Wie kann ich dieses Problem lösen?

Ohne Programm lässt sich da nur mit der Kristallkugel spekulieren :wink:
Vermutlich ein blockierendes delay() oder eine Schleife, die raus muss....
Also Code reinstellen, in Code-Tags nicht vergessen

Indem du nicht-blockierend programmierst. Vernünftige Programme sind nie langsamer als Interaktionen mit dem Anwender

Ich vermute, dass es könnte an einigen Berechnungen liegen, die ich in dem Programme mache.
Delays habe ich gar keine drin.

Den Code kann ich leider nicht einstellen, da er Firmeneigentum ist und ich ihn nicht veröffentlichen darf :confused:

Vll habt ihr mir eine gute Herangehensweise, wenn ihr sowas in der Art programmieren könnt?

ProgoX:
Wie kann ich dieses Problem lösen?

Wie Lehmi sagt, ist es schwierig, diese Frage zu beantworten, wenn man sich nicht den Sketch ansehen kann.

Eine Lösung des Problems könnte sein, auf delay()s zu verzichten und einfach so oft wie möglich zu prüfen. Dazu musst Du Dein Vorhaben wahrscheinlich als „endlichen Automat“ programmieren. Dabei wird loop() ständig durchlaufen und dabei geprüft, ob bestimmte Zeitpunkte erreicht sind. Was mir zu endlichen Automaten eingefallen ist, habe ich hier ins Netz gekippt. Beachte ggf. auch die Folgeseite!

Gruß

Gregor

Nachtrag:
Noch zwei Möglichkeiten: Du erledigst die Abfrage des Touchscreens in einem Interrupt. Oder Du teilst umfangreiche Rechensachen auf und fragst den Touchscreen zwischen den einzelnen Rechenschritten ab.

ProgoX:
Ich vermute, dass es könnte an einigen Berechnungen liegen, die ich in dem Programme mache.
Delays habe ich gar keine drin.

Du musst dafür sorgen, dass oft genug der Touchscreen abgefragt wird. Das heißt, du fragst zwischen den Berechnungen ab und an den Touchscreen ab. Entweder wird in jedem Loop-Durchlauf nur ein Teilschritt mit Hilfe einer hochzählenden Statusvariable berechnet oder du packst die Touchscreenabfrage in eine Funktion, die nach jedem Rechenschritt aufgerufen wird.

Serenifly:
Indem du nicht-blockierend programmierst. Vernünftige Programme sind nie langsamer als Interaktionen mit dem Anwender

Hast du mir da irgendwelche Tipps, bzw. häufige Fehler die das verursachen?

Keine delay() - hast Du nicht, keine eigenen Schleifen (- wenn doch in jedem Durchlauf den Touch lesen und auswerten - das ist nicht trivial, evtl. musst Du die Schleife dann verlassen, je nachdem, was der User gewählst hat).
Am Besten nur die eine zentrale Schleife - loop() verwenden.

Mehr kann man ohne Sketch nicht sagen. Da ist man ja nur auf pauschale Urteile angewiesen.

Gruß Tommy

ProgoX:
Den Code kann ich leider nicht einstellen, da er Firmeneigentum ist und ich ihn nicht veröffentlichen darf :confused:

Da hab ich keine Lust zu helfen.
Grüße Uwe

Die Hilfe der OPEN Source Community nutzen wollen aber nix veröffentlichen wollen?
Geht das nich irgendwie am Konzept vorbei?

Wenn ihr so eine tolle Forma seid, könnt ihr euch sicherlich leisten einen Programmierer zu beauftragen…

Nun gut, wenn man keinen Sketch veröffentlichen darf, schneidet man sich so oder so ins eigene Fleisch... ich sehe da kein Problem zu helfen- letztendlich ist es im besten Fall nur Hilfe zur Selbsthilfe...

Ich hab auch ein Projekt mit Touchscreen- erfahrungsgemäß ist eine Berührung so lang, dass diese erkannt wird, auch wenn mal eine Berechnung ein paar millis() dauert. Ich habe bei mir eine zeitliche Verzögerung von 50ms einbauen müssen, damit mein Programm bei einer kurzen Berührung nicht durch alle Menuebenen blättert...

Ich schätze mal, dass da ein Loop- Durchlauf mehr als 20- 50ms dauern müßte, damit die Bedienung übers Touch spürbar hängt oder Eingaben verpaßt.

Und an dem Punkt muss ich sagen, dass der TE definitiv auf ein leistungsfähigeres Modell umsteigen soll.

uwefed:
Da hab ich keine Lust zu helfen.
Grüße Uwe

Ok, da muss ich genauere Infos geben: Ich bin Azubi und habe von der Berufsschule ein Projektauftrag bekommen, den ich im Betrieb machen soll.
Es geht also nicht um irgendetwas für die Firma, sondern letztendlich nur darum meinen Kenntnisstand zu erweitern.

Da ich das Projekt aber in der Firma mache, gelten dann auch die dortigen Richtlinien...

Das ist dann wohl Dein Pech.
Ohne Kenntnisse des Sketches lassen sich manche Antworten nur erwürfeln.

Gruß Tommy

ProgoX:
Da ich das Projekt aber in der Firma mache, gelten dann auch die dortigen Richtlinien...

Dann dürftest du das Projekt anschließend auch nicht in der Schule zeigen.
Also sehr fragwürdig....

Stell mal alle Infos rein, die du geben kannst- wie sieht deine Hardware aus? Beschreibe den Sketch sinngemäß, so wie du ihn tatsächlich geschrieben hast... vielleicht fällt dir da schon selbst ein Fehler auf...

Oder ich stelle die Frage so, dass du diese beantworten kannst, ohne zu sagen, was du in deinem Projekt machst:

Wenn ich ein ähnliches Projekt machen wollte, welche Hardware bräuchte ich und wie müßte ich diese verbinden? Und wie könnte ein Sketch aussehen, wenn ich so ein Projekt machen wollte?

Nun mußt du nichts über dein Projekt verraten, könntest mir aber Infos geben, wie ein ähnliches Projekt aussehen könnte...

Nicht blockierend programmieren:

keine Schleifen (zumindest keine langen), sonder alles in der loop() abarbeiten.

Struktur:

loop(){
 funktion1();
 funktion2();
 funktion3();
 ...
}

die gesamte loop sollte innerhalb der gewünschten Reaktionszeit abgearbeitet werden, wenn also innerhalb von 100ms auf Tastendruck reagiert werden soll: wiederholzeit <100ms.

dazu muß man z.b. Schleifen auslagern.
z.B. statt:

funktion1(){
  for (byte i=0; i<100;i++){
    tue was kompliziertes;
  }
}

besser

funktion1(){
  static byte i;
  if (i++ < 100){
    tue was kompliziertes;
  }
}

Gunther

ProgoX:
Da ich das Projekt aber in der Firma mache, gelten dann auch die dortigen Richtlinien…

Das ist natürlich richtig. Andererseits muß Dir aber auch die Möglichkeit gegeben werden, einen Bericht über Deine Arbeiten anzufertigen. Ich habe ein Praktikum gemacht, wo am Werkstor genau geprüft wurde. Da habe ich meinen ausbildenen Meister um Hilfe gebeten, weil ich ja nichts falsch machen wollte. Daraufhin wurden mir von der Firma Kopien zur Verfügung gestellt, die ich mitnehmen durfte.

An Deiner Stelle würde ich also fragen, ob der Sketch kritische Abschnitte enthält. Diese könntest Du durch unkritische Berechnungen gleichen Typs ersetzen. Da sollte Dich Dein Ausbilder unterstützen.

gregorss:
… Du erledigst die Abfrage des Touchscreens in einem Interrupt.

Wenn alle Maßnahmen, blockierenden Code zu vermeiden, keinen Erfolg zeigen, kannst Du diesen Tipp umsetzen. Dazu habe ich aus einem Beispiel einen kleinen Sketch gemacht, der das Prinzip zeigen soll:

// Abgeleitet von FlashLed.pde
#include <MsTimer2.h>

const int led_pin = LED_BUILTIN;  // 1.0 built in LED pin var

void flash()
{
  // Stattdessen koennte alle 30 ms die Abfrage des Touchscreens erfolgen.
  digitalWrite(led_pin, !digitalRead(led_pin));
}

void setup()
{
  Serial.begin(9600);
  Serial.println("Programmanfang");
  pinMode(led_pin, OUTPUT);

  MsTimer2::set(30, flash); // Alle 30 ms wird das normale Programm unterbrochen und per Interrupt flash aufgerufen
  MsTimer2::start();
}

void loop()
{
  delay(1000);  // Dies wird durch die langwierigen Berechnungen ersetzt
  Serial.print("Zeit seit Reset: ");
  Serial.println(millis());
}