M5Dial Touch
Vorsicht Falle
Die Verwendung des Touchscreens hält noch einige Hürden bereit.
Das Grundprinzip ist mit M5.Touch.getCount() abzufragen, ob der Touchscreen berührt wird. Nicht berührt wird 0, bei Berührung 1 zurückgegeben.
Das funktioniert aber nicht als Argument für if und while!
Mit der Einschränkung umgehen
Das folgende Programm enthält eine Funktion Test_01 die bei jedem Aufruf den Touch-Status abfragt. Wenn dieser seit der letzten Abfrage von 0 auf 1 gewechselt hat, dann wird ein Flag gesetzt. Solange das Flag gesetzt ist, wird kein weiterer Tastendruck angenommen. Wenn der Touch-Status wieder 0 wird, wird das Flag zurückgesetzt und es kann ein neuer Tastendruck identifiziert werden.
Das hilft aber auch nicht wirklich weiter, weil der Aufruf von test_01 aus einer while-Schleife heraus ebenfalls scheitert.
Ich war auf dem Holzweg
Es gibt eine einfache in der Firmware enthaltene Möglichkeit einen Touch zu erkennen:
Aber auch diese Funktion arbeitet nicht in einer Schleife!
Wie kann ich damit auf einen Touch warten?
Hilfe aus dem Forum
Da habe ich 2 Tage erfolglos versucht den Touchscreen zum laufen zu bekommen. Zu meinem großen Erstaunen hat das M5-Forum dann tatsächlich Hilfe geliefert und das nach 14 Minuten. Bisher kam meistens keine Antwort.
Die Lösung
Ideen für eine Touch-Service-Routine
Ich möchte eine Funktion schreiben, die aktiverte Touch-Elemente findet.
Sie soll eine ID des aktivierten Elementes und die Dauer der Berührung zurückgeben oder eine Funktion ausführen und ggf. deren Rückgabe zurückgeben.
Als Eingabe bekommt sie eine Liste, die für jedes abzufragende Touch-Element die folgende Datenstruktur enthält:
Datenstruktur für jedes Touch-Element
Die unten dargestellte Datenstruktur soll für jedes aktuell zu überwachende Touch-Element erstellt und in einer Liste zusammengefasst werden. Diese Liste wird an die Funktion übergeben.
# so: touch_data = {'x1':0, 'y1':0, 'x2':100, 'y2':50, 'id':42, 'func':None} # oder so: touch_data_1 = {'startpoint':(0, 0), 'endpoint':(100, 50), 'id':42, 'func':None}
- x1, y1, startpoint
- die Koordinaten oben links des Touch-Elementes
- x2, y2, endpoint
- die Koordinaten unten rechts des Touch-Elementes
- id
- individuelle Kennung des Touch-Elementes
- func
- Name einer Funktion die ausgeführt werden soll, wenn das Touch-Element aktiviert wird.
Identifikation eines Touch-Elementes
Dieser Codeschnippsel kann als Orientierung dienen:
>>> def detect(x): if 0<x<42: print('innerhalb') else: print('ausserhalb') >>> x = 25 >>> detect(x) innerhalb >>> detect(125) ausserhalb
Mit folgender Abfrage kann ein Touch-Element identifiziert werden:
if x1<x<x2 and y1<y<y2: # dann wurde ein Element gefunden!
Das muss aber noch getestet werden!