Verwenden Sie den Raspberry Pi 3, um den Bewegungserkennungsstatus des menschlichen Sensors HC-SR501 zu lesen. Die Programmiersprache verwendet Java.
HC-SR501 |
---|
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
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".
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.
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.
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.
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 |
---|---|
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.
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