Utilisez Raspberry Pi 3 pour lire l'état de détection de mouvement du capteur humain HC-SR501. Le langage de programmation utilise Java.
HC-SR501 |
---|
Ce capteur humain détecte le mouvement des rayons infrarouges, et lorsqu'il y a un changement, la sortie devient un niveau élevé (3,3 V), et lorsqu'il n'y a pas de changement, il devient un niveau bas (0 V).
Il y a deux résistances semi-fixes orange sur le côté du module, et si vous tournez le côté gauche dans le sens des aiguilles d'une montre, le temps de retard après la détection sera dans la plage d'environ 5 à 300 secondes, et si vous tournez le côté droit dans le sens des aiguilles d'une montre , La distance de détection peut être ajustée dans une plage d'environ 3 à 7 mètres.
(Référence) Fiche technique HC-SR501
Utilisez Pi4J pour contrôler le GPIO du Raspberry Pi à partir de Java. Pour l'environnement Pi4J, reportez-vous à «Installation de Pi4J» dans l'article suivant.
Lorsque Pi4J est installé, divers exemples de programmes seront copiés ensemble sous le répertoire / opt / pi4j / examples. Vous pouvez utiliser le code source de cet exemple pour vérifier l'état de détection de mouvement.
Etant donné que l'état de détection de mouvement voit uniquement si le niveau de sortie est haut ou bas, la même logique de programme que le commutateur peut être utilisée.
Si vous voulez faire quelque chose en fonction de l'état du niveau de la broche GPIO, vous pouvez faire une boucle autour du programme pour vérifier périodiquement le niveau de la broche, mais le processus est exécuté lorsque l'état de la broche change. Vous pouvez écrire des programmes dits événementiels.
ListenGpioExample.java dans / opt / pi4j / examples est le code source pour faire cela.
Pour essayer le programme, connectez le Raspberry Pi et le HC-SR501 comme suit.
Le programme implémente l'interface GpioPinListenerDigital et enregistre une instance de la classe anonyme qui remplace la méthode du listener handleGpioPinDigitalStateChangeEvent () avec l'instance de la broche GPIO.
ListenGpioExample.Partie de java (réécriture des commentaires)
//Créer une instance GpioController
final GpioController gpio = GpioFactory.getInstance();
//Spécifiez la broche cible comme broche d'entrée
final GpioPinDigitalInput myButton = gpio.provisionDigitalInputPin(RaspiPin.GPIO_02, PinPullResistance.PULL_DOWN);
//Enregistrer un écouteur à appeler lorsque l'état de la broche change
myButton.addListener(new GpioPinListenerDigital() {
@Override
public void handleGpioPinDigitalStateChangeEvent(GpioPinDigitalStateChangeEvent event) {
//Afficher l'état des broches sur la console
System.out.println(" --> GPIO PIN STATE CHANGE: " + event.getPin() + " = " + event.getState());
}
});
Cela entraînera l'appel du processus ci-dessus à chaque fois que l'état de la broche change.
Vous pouvez vérifier l'opération en copiant ListenGpioExample.java dans un répertoire approprié et en le compilant avec la commande suivante.
pi@raspberrypi:~ $ pi4j -c ListenGpioExample.java
--------------------------------------------
Pi4J - Compiling: ListenGpioExample.java
--------------------------------------------
+ javac -classpath '.:classes:*:classes:/opt/pi4j/lib/*' -d . ListenGpioExample.java
pi@raspberrypi:~ $
Après la compilation, exécutez avec les privilèges root. Entrez Ctrl + C pour quitter.
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:~ $
C'est une bonne idée de démarrer le programme avec le bouton de temps de retard complètement tourné dans le sens antihoraire pour pouvoir lire instantanément le changement d'état.
En plus du capteur humain ci-dessus, j'ai créé un programme de démonstration qui combine un écran LCD 1602 avec une interface I2C et un commutateur tactile.
I2C 1602 LCD | Changement de tact |
---|---|
Ce programme fonctionne comme suit.
・ Lorsque le programme est lancé, la date et l'heure sont affichées sur l'écran LCD. ・ Chaque fois que vous appuyez sur la touche tactile, l'affichage de l'heure bascule entre la notation 12 heures et la notation 24 heures. ・ Le rétroéclairage LCD s'allume lorsqu'une personne s'approche et s'éteint lorsqu'il n'y a aucun mouvement.
1602 Activez la fonction de communication I2C du Raspberry Pi pour utiliser l'écran LCD. Pour plus d'informations sur l'activation et le programme d'utilisation de l'écran LCD 1602, reportez-vous aux articles suivants.
Afficher les caractères sur l'écran LCD I2C 1602 avec Raspberry Pi 3 et Java
Le Raspberry Pi et chaque partie ont été connectés comme suit.
Si vous voulez essayer le programme de démonstration en action, modifiez la valeur de la variable i2cAddress pour qu'elle corresponde à l'adresse attribuée au 1602 LCD (comment trouver l'adresse est également mentionnée dans l'article ci-dessus).
Comme mentionné ci-dessus, la structure de traitement du commutateur et du capteur humain est exactement la même.
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 {
//Spécification de la broche à laquelle le commutateur est connecté
private static final Pin gpioTactSwitch = RaspiPin.GPIO_07;
//Désignation de la broche à laquelle le capteur humain est connecté
private static final Pin gpioPirSensor = RaspiPin.GPIO_02;
//I2C 1602 Spécification du numéro et de l'adresse du bus I2C auquel le module LCD est connecté
private static final int i2cBus = 1;
private static final int i2cAddress = 0x27;
//Définition du format d'affichage
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");
//Format d'affichage de l'heure actuelle (vrai: 12 heures faux:24 heures)
private static boolean timeFormat = true;
public static void main(String[] args) throws Exception {
//I2C 1602 Création d'objets pour les modules LCD
final I2CLcdDisplay lcd = new I2CLcdDisplay(2, 16, i2cBus, i2cAddress, 3, 0, 1, 2, 7, 6, 5, 4);
//Création d'une instance GpioController
final GpioController gpio = GpioFactory.getInstance();
//Définissez la broche à laquelle le commutateur est connecté comme broche d'entrée
final GpioPinDigitalInput pinTactSwitch = gpio.provisionDigitalInputPin(gpioTactSwitch);
//final GpioPinDigitalInput pinTactSwitch = gpio.provisionDigitalInputPin(gpioTactSwitch, PinPullResistance.PULL_DOWN);
//Enregistrer un écouteur qui sera appelé lorsque l'état de la broche à laquelle le commutateur est connecté change
pinTactSwitch.addListener(new GpioPinListenerDigital() {
@Override
public void handleGpioPinDigitalStateChangeEvent(GpioPinDigitalStateChangeEvent event) {
//Changez le format d'affichage de l'heure à chaque fois que vous appuyez sur l'interrupteur (tirez vers le haut)
if (event.getState().isHigh()) timeFormat = !timeFormat;
}
});
//Définissez la broche à laquelle le capteur humain est connecté comme broche d'entrée
final GpioPinDigitalInput pinPirSensor = gpio.provisionDigitalInputPin(gpioPirSensor);
//Définir l'état initial du rétroéclairage LCD
lcd.setBacklight(pinPirSensor.isHigh());
//Enregistrer un écouteur qui sera appelé lorsque l'état de la broche à laquelle le capteur humain est connecté change
pinPirSensor.addListener(new GpioPinListenerDigital() {
@Override
public void handleGpioPinDigitalStateChangeEvent(GpioPinDigitalStateChangeEvent event) {
//Active le rétroéclairage de l'écran LCD lorsqu'un mouvement est détecté (pull-up) et l'éteint lorsqu'il n'est pas détecté (pull-up).
lcd.setBacklight(event.getState().isHigh());
}
});
while (true) {
//Obtenez la date et l'heure actuelles
LocalDateTime dateTime = LocalDateTime.now();
//La date sur la première ligne de l'écran LCD et l'heure sur la deuxième ligne sont centrées.
lcd.writeln(0, dateTime.format(dateFormatter), LCDTextAlignment.ALIGN_CENTER);
lcd.writeln(1, dateTime.format(timeFormat ? timeFormatter12 : timeFormatter24), LCDTextAlignment.ALIGN_CENTER);
Thread.sleep(100);
}
}
}
Pour exécuter ce programme, placez le fichier ci-dessus dans un répertoire de votre choix et compilez-le.
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:~ $
Après la compilation, exécutez avec les privilèges root. Entrez Ctrl + C pour quitter.
pi@raspberrypi:~ $ sudo pi4j HC_SR501Demo
+ java -classpath '.:classes:*:classes:/opt/pi4j/lib/*' HC_SR501Demo
^Cpi@raspberrypi:~ $
Si le rétroéclairage est irritant, vous pouvez l'ajuster en tournant légèrement le bouton du temps de retard dans le sens des aiguilles d'une montre pour obtenir une bonne sensation.
Recommended Posts