Touch Sensor

Funktionsweise

Der Berührungssensor funktioniert im Wesentlichen wie jeder andere Knopf auch. Der Unterschied liegt darin das der Berührungs- oder Touch Sensor nicht gedrückt werden muss. Es reicht schon eine leichte Berührung, um den Sensor auszulösen. Beim CrowPi ist dieser Sensor am GPIO Pin Nummer 17 angeschlossen. Dabei kennt der Sensor nur zwei Zustände. Er ist entweder gedrückt oder eben nicht. Dies entspricht im Programm einem HIGH oder LOW. Der Sensor erkennt die Berührung durch die Veränderung des elektrischen Widerstandes durch den Kontakt mit der Haut. Es gibt auch andere Varianten von Berührungserkennung. Diese sind jedoch viel komplexer und werden zum Beispiel in Mobiltelefonen eingesetzt.

Eine oft verwendete Funktion bei digitalen Eingängen ist die Entprellung. Dies bedeutet das nach jeder Statusänderung des Eingangs jeweils erst eine «Abkühlzeit» verstreichen muss. Solche Mehrfachauslösungen kommen fast bei jeder Art von Hardware-Knopf vor und sollten deshalb immer berücksichtigt werden. Wird die Entprellzeit zu kurz gewählt, kann es vorkommen, dass durch 1x Betätigen mehrere Events ausgelöst werden. Das wäre natürlich unerwünschtes Verhalten der Software.

Die boolesche Verhaltensweise des Sensors macht die Benutzung während des Programmierens sehr einfach. Die Herausforderung liegt dabei meist mehr beim Gerüst rund um den Sensor herum. Zum Beispiel im Eventhandling, wenn der Knopf jederzeit funktionieren soll.

Voraussetzungen

DIP Switches

Für diese Komponente werden keine spezifischen DIP-Switches benötigt, sodass diese in der Standardkonfiguration belassen werden können:

ON(links)12345678ON(rechts)12345678

Verwendung

Nachfolgend wird die Verwendung der Klasse com.pi4j.crowpi.components.TouchSensorComponent Javadoc beschrieben.

Konstruktoren

Konstruktor Bemerkung
TouchSensorComponent(com.pi4j.context.Context pi4j) Initialisiert einen Touch Sensor mit dem Standard-Pin für den CrowPi.
TouchSensorComponent(com.pi4j.context.Context pi4j, int address, long debounce) Initialisiert einen Touch Sensor mit einem benutzerdefinierten Pin. Zusätzlich kann mit debounce noch eine Entprellzeit in Mikrosekunden angegeben werden

Methoden

Methode Bemerkung
boolean isTouched() Gibt true zurück falls der Berührungssensor gerade betätigt wird ansonsten false.
TouchState getState() Gibt den aktuellen Zustand des Berührungssensor zurück.
void onTouch() Setzt den Event Handler welcher beim Berühren des Sensors aufgerufen werden soll. null deaktiviert diesen Event Listener.
void onRelease() Setzt den Event Handler welcher beim Loslassen des Sensors aufgerufen werden soll. null deaktiviert diesen Event Listener.

Enumerationen

  • com.pi4j.crowpi.components.TouchSensorComponent Javadoc enthält alle möglichen Zustände, die vom Touch Sensor zurückgegeben werden können.

Beispielapplikation

Die nachfolgende Beispielapplikation registriert zwei Event Listener auf dem Touch Sensor. Diese Listener lösen dann für 20 Sekunden jeweils ein minimales Event aus. Es wird jedes Mal in dieser Zeit, wenn der Sensor berührt oder losgelassen wird ein kleiner Text mit dem Status ausgegeben. Nach Ablauf der Zeit werden die Listener wieder vom Berührungssensor entfernt und mittels der isTouched() Methode gewartet bis der Benutzer die Beispielapplikation beendet. Durch Verwendung des Konstruktors mit nur einem Argument wird in dieser Applikation die Standardeinstellung für die Entprellung benutzt. Diese liegt bei 10'000 Mikrosekunden und passt ganz gut für die meisten menschlichen Eingaben.

Pfad zum Codebeispiel: src/main/java/com/pi4j/crowpi/applications/TouchSensorApp.java
Auf GitHub ansehen
package com.pi4j.crowpi.applications;

import com.pi4j.context.Context;
import com.pi4j.crowpi.Application;
import com.pi4j.crowpi.components.TouchSensorComponent;

/**
 * Writes some Text output on Touch Sensor Events. After 20 seconds event handling is disable and the App waits for
 * termination by a final touch sensor press.
 */
public class TouchSensorApp implements Application {
    @Override
    public void execute(Context pi4j) {
        // create a touch sensor instance
        final var touchSensor = new TouchSensorComponent(pi4j);

        // create two listeners for detecting touch events
        touchSensor.onTouch(() -> System.out.println("Seems like you are touching the sensor!"));
        touchSensor.onRelease(() -> System.out.println("You stopped touching the sensor!"));

        // just any delay
        System.out.println("Touch Sensor is now activated.");
        for (int i = 20; i > 0; i--) {
            System.out.println("Time until event listeners are killed: " + i + " seconds...");
            sleep(1000);
        }

        // disable the event listeners we no longer need
        touchSensor.onTouch(null);
        touchSensor.onRelease(null);

        // end the program as soon as isTouched returns true
        System.out.println("Press again to end this application");
        while (!touchSensor.isTouched()) {
            sleep(10);
        }
    }
}

Weitere Möglichkeiten

  • Das Beispiel um beliebige Abfolgen von Berührungen erweitern. So wäre zum Beispiel eine Kombination aus langen und kurzen Berührungen möglich um ein kleines Spiel zu entwickeln.

  • Umsetzung des Morsealphabets mittels Touch Sensor und Events