Button

Funktionsweise

Bei einem Button handelt es sich schlicht um einen ganz einfachen Knopf, der entweder gedrückt wird oder eben nicht. Auf dem CrowPi stehen neben der Button Matrix auch vier unabhängige Knöpfe zur Verfügung, die mit den Richtungen Up (oben), Down (unten), Left (links), Right (rechts) bezeichnet sind.

Bei dieser Komponente wird der entsprechende GPIO-Pin direkt ausgelesen und ohne weitere Verarbeitung ausgewertet. Somit lässt sich diese Komponente sehr einfach verwenden und kann dennoch für viele unterschiedliche Zwecke eingesetzt werden.

Voraussetzungen

DIP Switches

Für diese Komponente müssen die DIP Switches 1-5, 1-6, 1-7 sowie 1-8 aktiviert werden, da sich die Buttons sonst nicht oder nur eingeschränkt nutzen lassen. Die Stellung der DIP Switches sollte anschliessend so aussehen:

ON(links)12345678ON(rechts)12345678

Verwendung

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

Konstruktoren

Konstruktor Bemerkung
ButtonComponent(com.pi4j.context.Context pi4j pi4j, Button button) Initialisiert einen Button für den angegebenen Knopf vom CrowPi.
ButtonComponent(com.pi4j.context.Context pi4j pi4j, int address, boolean inverted, long debounce) Initialisiert einen Button mit einer benutzerdefinierten Adresse und Entprellzeit. Der Parameter inverted kann gesetzt werden um einen Button mit Pull-Down Verfahren anzusprechen.

Methoden

Methode Bemerkung
boolean isDown() Gibt true zurück falls der Knopf zurzeit gedrückt wird, ansonsten false.
boolean isUp() Gibt true zurück falls der Knopf zurzeit nicht gedrückt wird, ansonsten true
ButtonState getState() Gibt den aktuellen Zustand vom Knopf zurück.
void onDown(SimpleEventHandler handler) Setzt den Event Handler welcher beim Drücken des Knopfs aufgerufen werden soll. null deaktiviert diesen Event Listener.
void onUp(SimpleEventHandler handler) Setzt den Event Handler welcher beim Loslassen des Sensors aufgerufen werden soll. null deaktiviert diesen Event Listener.

Enumerationen

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

  • com.pi4j.crowpi.components.definitions.Button Javadoc enthält die Pins der vier verschiedenen Knöpfe auf dem CrowPi und wird im Konstruktor verwendet werden, um den gewünschten Knopf anzugeben.

Beispielapplikation

Die Beispielapplikation ist sehr simpel gehalten und initialisiert alle 4 Knöpfe, um anschliessend auf jedem Knopf einen Event Handler für gedrückt (onDown) sowie losgelassen (onUp) zu registrieren. Anschliessend schläft die Applikation für 15 Sekunden, um ein Testen der verschiedenen Knöpfe zu ermöglichen.

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

import com.pi4j.context.Context;
import com.pi4j.crowpi.Application;
import com.pi4j.crowpi.components.ButtonComponent;
import com.pi4j.crowpi.components.definitions.Button;

/**
 * This example app initializes all four directional buttons and registers event handlers for every button. While this example itself does
 * not do much, it showcases how it could be used for controlling a player character in a game. Before the application exits it will cleanly
 * unregister all previously configured event handlers.
 */
public class ButtonApp implements Application {
    @Override
    public void execute(Context pi4j) {
        // Initialize all four button components
        final var upButton = new ButtonComponent(pi4j, Button.UP);
        final var downButton = new ButtonComponent(pi4j, Button.DOWN);
        final var leftButton = new ButtonComponent(pi4j, Button.LEFT);
        final var rightButton = new ButtonComponent(pi4j, Button.RIGHT);

        // Register event handlers to print a message for each button when pressed (onDown) and depressed (onUp)
        upButton.onDown(() -> System.out.println("Alright, moving upwards!"));
        downButton.onDown(() -> System.out.println("Aye aye, moving downwards!"));
        leftButton.onDown(() -> System.out.println("Gotcha, moving to the left!"));
        rightButton.onDown(() -> System.out.println("Yep, moving to the right!"));

        upButton.onUp(() -> System.out.println("Stopped moving upwards."));
        downButton.onUp(() -> System.out.println("Stopped moving downwards."));
        leftButton.onUp(() -> System.out.println("Stopped moving to the left."));
        rightButton.onUp(() -> System.out.println("Stopped moving to the right."));

        // Wait for 15 seconds while handling events before exiting
        System.out.println("Press any of the 4 independent / directional buttons to see them in action!");
        sleep(15000);

        // Unregister all event handlers to exit this application in a clean way
        // To keep the code more compact, we create a list of all four buttons and loop over it, unregistering both handlers for each
        for (final var button : new ButtonComponent[]{upButton, downButton, leftButton, rightButton}) {
            button.onDown(null);
            button.onUp(null);
        }
    }
}

Weitere Möglichkeiten

  • Mit den vier Knöpfen lassen sich leicht diverse Spiele realisieren, da jeder Knopf in eine bestimmte Richtung zeigt, was sich als Steuerung für einen Spieler beispielsweise verwenden lässt.

  • Mit den vier Knöpfen lässt sich der Cursor auf dem LCD Display steuerbar machen, um an eine beliebige Stelle zu navigieren.