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.
Ohne Programm lässt sich da nur mit der Kristallkugel spekulieren
Vermutlich ein blockierendes delay() oder eine Schleife, die raus muss....
Also Code reinstellen, in Code-Tags nicht vergessen
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.
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.
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...
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...
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;
}
}
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());
}