M5Dial Touch

Aus Micropython Referenz
Zur Navigation springen Zur Suche springen

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!



So funktioniert es:

So nicht:


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


M5.update() ist die Lösung! Mir ist noch immer nicht klar was diese Funktion macht, aber hier wirkt sie Wunder.

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!