Verarbeiten Sie die vom menschlichen Sensor HC-SR501 erkannte Bewegung mit Raspberry Pi 3 & Java

Einführung

Verwenden Sie den Raspberry Pi 3, um den Bewegungserkennungsstatus des menschlichen Sensors HC-SR501 zu lesen. Die Programmiersprache verwendet Java.

HC-SR501
HC-SR501.png

Dieser menschliche Sensor erfasst die Bewegung von Infrarotstrahlen, und wenn sich etwas ändert, wird der Ausgang zu einem hohen Pegel (3,3 V), und wenn sich nichts ändert, wird er zu einem niedrigen Pegel (0 V).

Auf der Seite des Moduls befinden sich zwei orangefarbene halbfeste Widerstände. Wenn Sie die linke Seite im Uhrzeigersinn drehen, liegt die Verzögerungszeit nach der Erkennung im Bereich von etwa 5 bis 300 Sekunden, und wenn Sie die rechte Seite im Uhrzeigersinn drehen Der Erfassungsabstand kann im Bereich von ca. 3 bis 7 Metern eingestellt werden.

(Referenz) HC-SR501-Datenblatt

Vorbereitung

Verwenden Sie Pi4J, um den GPIO des Raspberry Pi von Java aus zu steuern. Informationen zur Pi4J-Umgebung finden Sie im folgenden Artikel unter "Installieren von Pi4J".

Stellen Sie die Sensorinformationen von Raspberry Pi grafisch dar und bereiten Sie eine Umgebung vor, die mit einem Webbrowser überprüft werden kann

Bei der Installation von Pi4J werden verschiedene Beispielprogramme zusammen unter das Verzeichnis / opt / pi4j / examples kopiert. Sie können den Quellcode in diesem Beispiel verwenden, um den Status der Bewegungserkennung zu überprüfen.

Beispielprogramm

Da der Bewegungserkennungsstatus nur erkennt, ob der Ausgangspegel hoch oder niedrig ist, kann dieselbe Programmlogik wie der Schalter verwendet werden.

Wenn Sie etwas gemäß dem GPIO-Pin-Level-Status tun möchten, können Sie das Programm durchlaufen, um den Pin-Level regelmäßig zu überprüfen. Der Vorgang wird jedoch ausgeführt, wenn sich der Pin-Status ändert. Sie können sogenannte ereignisgesteuerte Programme schreiben.

ListenGpioExample.java in / opt / pi4j / examples ist der Quellcode dafür.

Um das Programm auszuprobieren, verbinden Sie den Raspberry Pi und den HC-SR501 wie folgt.

HC-SR501

Das Programm implementiert die Schnittstelle GpioPinListenerDigital und registriert eine Instanz der anonymen Klasse, die die Listener-Methode handleGpioPinDigitalStateChangeEvent () mit der GPIO-Pin-Instanz überschreibt.

ListenGpioExample.Teil von Java (Kommentare umschreiben)



//Erstellen Sie eine GpioController-Instanz
final GpioController gpio = GpioFactory.getInstance();

//Geben Sie den Ziel-Pin als Eingangs-Pin an
final GpioPinDigitalInput myButton = gpio.provisionDigitalInputPin(RaspiPin.GPIO_02, PinPullResistance.PULL_DOWN);

//Registrieren Sie einen Listener, der aufgerufen werden soll, wenn sich der Pin-Status ändert
myButton.addListener(new GpioPinListenerDigital() {
    @Override
    public void handleGpioPinDigitalStateChangeEvent(GpioPinDigitalStateChangeEvent event) {
        //Pin-Status auf der Konsole anzeigen
        System.out.println(" --> GPIO PIN STATE CHANGE: " + event.getPin() + " = " + event.getState());
    }
});

Dies führt dazu, dass der obige Prozess jedes Mal aufgerufen wird, wenn sich der Pin-Status ändert.

Sie können den Vorgang überprüfen, indem Sie ListenGpioExample.java in ein geeignetes Verzeichnis kopieren und mit dem folgenden Befehl kompilieren.

pi@raspberrypi:~ $ pi4j -c ListenGpioExample.java
--------------------------------------------
Pi4J - Compiling: ListenGpioExample.java
--------------------------------------------
+ javac -classpath '.:classes:*:classes:/opt/pi4j/lib/*' -d . ListenGpioExample.java
pi@raspberrypi:~ $

Führen Sie nach dem Kompilieren die Root-Berechtigungen aus. Geben Sie zum Beenden Strg + C ein.

pi@raspberrypi:~ $ sudo pi4j ListenGpioExample
+ java -classpath '.:classes:*:classes:/opt/pi4j/lib/*' ListenGpioExample
<--Pi4J--> GPIO Listen Example ... started.
 ... complete the GPIO #02 circuit and see the listener feedback here in the console.
 --> GPIO PIN STATE CHANGE: "GPIO 2" <GPIO 2> = HIGH
 --> GPIO PIN STATE CHANGE: "GPIO 2" <GPIO 2> = LOW
 --> GPIO PIN STATE CHANGE: "GPIO 2" <GPIO 2> = HIGH
 --> GPIO PIN STATE CHANGE: "GPIO 2" <GPIO 2> = LOW
^Cpi@raspberrypi:~ $

Es ist eine gute Idee, das Programm mit dem Verzögerungszeitknopf gegen den Uhrzeigersinn zu starten, damit Sie die Statusänderung sofort lesen können.

Demo-Programm

Zusätzlich zu dem oben genannten menschlichen Sensor habe ich ein Demo-Programm erstellt, das ein 1602-LCD-Display mit einer I2C-Schnittstelle und einem Taktschalter kombiniert.

I2C 1602 LCD Taktschalter
I2C 1602 LCD Taktschalter

Dieses Programm funktioniert wie folgt.

・ Wenn das Programm gestartet wird, werden Datum und Uhrzeit auf dem LCD angezeigt. ・ Jedes Mal, wenn Sie den Taktschalter drücken, wechselt die Zeitanzeige zwischen der 12-Stunden-Notation und der 24-Stunden-Notation. ・ Die LCD-Hintergrundbeleuchtung wird eingeschaltet, wenn sich eine Person nähert, und ausgeschaltet, wenn keine Bewegung erfolgt.

1602 Aktivieren Sie die I2C-Kommunikationsfunktion des Raspberry Pi, um das LCD zu verwenden. Ausführliche Informationen zum Aktivieren und zum Programm zur Verwendung des 1602 LCD finden Sie in den folgenden Artikeln.

Zeichen auf dem I2C 1602 LCD mit Raspberry Pi 3 und Java anzeigen

Der Raspberry Pi und jedes Teil wurden wie folgt verbunden.

HC-SR501 Demo

Wenn Sie das Demo-Programm in Aktion ausprobieren möchten, ändern Sie den Wert der Variablen i2cAddress so, dass er mit der dem 1602 LCD zugewiesenen Adresse übereinstimmt (Informationen zum Auffinden der Adresse finden Sie auch im obigen Artikel).

Wie oben erwähnt, ist die Verarbeitungsstruktur des Schalters und des menschlichen Sensors genau gleich.

HC_SR501Demo.java


import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

import com.pi4j.component.lcd.LCDTextAlignment;
import com.pi4j.component.lcd.impl.I2CLcdDisplay;
import com.pi4j.io.gpio.GpioController;
import com.pi4j.io.gpio.GpioFactory;
import com.pi4j.io.gpio.GpioPinDigitalInput;
import com.pi4j.io.gpio.Pin;
//import com.pi4j.io.gpio.PinPullResistance;
import com.pi4j.io.gpio.RaspiPin;
import com.pi4j.io.gpio.event.GpioPinDigitalStateChangeEvent;
import com.pi4j.io.gpio.event.GpioPinListenerDigital;

public class HC_SR501Demo {
    //Angabe des Pins, an den der Switch angeschlossen ist
    private static final Pin gpioTactSwitch = RaspiPin.GPIO_07;
    //Bezeichnung des Stifts, an den der menschliche Sensor angeschlossen ist
    private static final Pin gpioPirSensor = RaspiPin.GPIO_02;

    //I2C 1602 Angabe der I2C-Busnummer und der Adresse, an die das LCD-Modul angeschlossen ist
    private static final int i2cBus = 1;
    private static final int i2cAddress = 0x27;

    //Anzeigeformatdefinition
    private static final DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("y/MM/dd eee.", Locale.ENGLISH);
    private static final DateTimeFormatter timeFormatter12 = DateTimeFormatter.ofPattern("h:mm:ss a", Locale.ENGLISH);
    private static final DateTimeFormatter timeFormatter24 = DateTimeFormatter.ofPattern("HH:mm:ss");

    //Aktuelles Zeitanzeigeformat (true: 12 Stunden false:24 Stunden)
    private static boolean timeFormat = true;

    public static void main(String[] args) throws Exception {
        //I2C 1602 Objekte für LCD-Module erstellen
        final I2CLcdDisplay lcd = new I2CLcdDisplay(2, 16, i2cBus, i2cAddress, 3, 0, 1, 2, 7, 6, 5, 4);

        //Erstellen einer GpioController-Instanz
        final GpioController gpio = GpioFactory.getInstance();

        //Stellen Sie den Pin, an den der Schalter angeschlossen ist, als Eingangspin ein
        final GpioPinDigitalInput pinTactSwitch = gpio.provisionDigitalInputPin(gpioTactSwitch);
        //final GpioPinDigitalInput pinTactSwitch = gpio.provisionDigitalInputPin(gpioTactSwitch, PinPullResistance.PULL_DOWN);

        //Registrieren Sie einen Listener, der aufgerufen wird, wenn sich der Status des Pins ändert, an den der Switch angeschlossen ist
        pinTactSwitch.addListener(new GpioPinListenerDigital() {
            @Override
            public void handleGpioPinDigitalStateChangeEvent(GpioPinDigitalStateChangeEvent event) {
                //Wechseln Sie das Zeitanzeigeformat bei jedem Drücken des Schalters (Pull-up).
                if (event.getState().isHigh()) timeFormat = !timeFormat;
            }
        });

        //Stellen Sie den Pin, an den der menschliche Sensor angeschlossen ist, als Eingangspin ein
        final GpioPinDigitalInput pinPirSensor = gpio.provisionDigitalInputPin(gpioPirSensor);
        //Stellen Sie den Ausgangszustand der LCD-Hintergrundbeleuchtung ein
        lcd.setBacklight(pinPirSensor.isHigh());

        //Registrieren Sie einen Listener, der aufgerufen wird, wenn sich der Status des Pins ändert, an den der menschliche Sensor angeschlossen ist
        pinPirSensor.addListener(new GpioPinListenerDigital() {
            @Override
            public void handleGpioPinDigitalStateChangeEvent(GpioPinDigitalStateChangeEvent event) {
                //Schaltet die LCD-Hintergrundbeleuchtung ein, wenn eine Bewegung erkannt wird (Pull-up), und schaltet sie aus, wenn sie nicht erkannt wird (Pull-up).
                lcd.setBacklight(event.getState().isHigh());
            }
        });

        while (true) {
            //Holen Sie sich das aktuelle Datum und die Uhrzeit
            LocalDateTime dateTime = LocalDateTime.now();

            //Das Datum in der ersten Zeile des LCD und die Uhrzeit in der zweiten Zeile werden zentriert.
            lcd.writeln(0, dateTime.format(dateFormatter), LCDTextAlignment.ALIGN_CENTER);
            lcd.writeln(1, dateTime.format(timeFormat ? timeFormatter12 : timeFormatter24), LCDTextAlignment.ALIGN_CENTER);
            Thread.sleep(100);
        }
    }
}

Um dieses Programm auszuführen, legen Sie die obige Datei in einem Verzeichnis Ihrer Wahl ab und kompilieren Sie sie.

pi@raspberrypi:~ $ pi4j -c HC_SR501Demo.java
--------------------------------------------
Pi4J - Compiling: HC_SR501Demo.java
--------------------------------------------
+ javac -classpath '.:classes:*:classes:/opt/pi4j/lib/*' -d . HC_SR501Demo.java
pi@raspberrypi:~ $

Führen Sie nach dem Kompilieren die Root-Berechtigungen aus. Geben Sie zum Beenden Strg + C ein.

pi@raspberrypi:~ $ sudo pi4j HC_SR501Demo
+ java -classpath '.:classes:*:classes:/opt/pi4j/lib/*' HC_SR501Demo
^Cpi@raspberrypi:~ $

Wenn die Hintergrundbeleuchtung irritiert, können Sie sie einstellen, indem Sie den Verzögerungszeitknopf leicht im Uhrzeigersinn drehen, um ein gutes Gefühl zu erhalten.

Recommended Posts

Verarbeiten Sie die vom menschlichen Sensor HC-SR501 erkannte Bewegung mit Raspberry Pi 3 & Java
Zeigen Sie benutzerdefinierte Zeichen auf dem I2C 1602 LCD mit Raspberry Pi 3 und Java an
Stellen Sie die Sensorinformationen von Raspberry Pi in Java grafisch dar und überprüfen Sie sie mit einem Webbrowser
Anmerkung: [Java] Raspberry Pi-Daten mit SFTP abrufen
Zeigen Sie Zeichen auf dem I2C 1602 LCD mit Raspberry Pi 3 und Java an
Lesen Sie Temperatur / Luftfeuchtigkeit von Raspberry Pi 3 & DHT11 mit Java ab
[Java] Ändern Sie die Verarbeitung entsprechend der Situation mit dem Strategiemuster
Lesen Sie Druck und Temperatur von Raspberry Pi 3 & BMP180 mit Java ab
[Java] Ausgabe durch Angabe des Formats mit printf% s,% d,% f [Formatbezeichner]
Überprüfen Sie den MX-Eintrag der E-Mail-Adresse mit Java und die Domain