Motion sensor. I worked on a single-leaf gate where I had to make a program to open the swing gate and activate the infrared sensors. What I would like to do now is add a motion sensor in D7 so that if there is an object passing in front of the sensor the gate will stop :
#include <Servo.h> // Bibliothèque Servo moteur
Servo servo_pin_3;
const int bouton_poussoirPin = 2; // Broche pour le bouton poussoir
const int irPin = 8; // Broche pour le capteur infrarouge
const int mouvementPin = 7; // Broche pour le capteur de mouvement
const int servoPin = 3; // Broche pour le servo
const int ledPin = 6; // Broche pour la première LED
const int ledPin2 = A3; // Broche pour la deuxième LED
const int buzzerPin = 4; // Broche pour le buzzer
bool portailOuvert = false; // État du portail
bool dernierEtatBouton = LOW; // Dernier état du bouton poussoir
bool dernierEtatIR = LOW; // Dernier état de la barrière infrarouge
bool dernierEtatMouvement = LOW; // Dernier état du capteur de mouvement
void setup() {
servo_pin_3.attach(servoPin); // Attacher le servo à la broche 3
pinMode(bouton_poussoirPin, INPUT_PULLUP); // Configurer le bouton poussoir en entrée avec résistance de pull-up interne
pinMode(irPin, INPUT); // Définir la broche du capteur infrarouge en entrée
pinMode(mouvementPin, INPUT); // Définir la broche du capteur de mouvement en entrée
pinMode(ledPin, OUTPUT); // Définir la broche de la première LED en sortie
pinMode(ledPin2, OUTPUT); // Définir la broche de la deuxième LED en sortie
pinMode(buzzerPin, OUTPUT); // Définir la broche du buzzer en sortie
// Initialiser l'état du portail
initialiserEtatPortail();
}
void loop() {
// Lecture de l'état du bouton poussoir
int etatBouton = digitalRead(bouton_poussoirPin);
// Lecture de l'état du capteur de mouvement
int etatMouvement = digitalRead(mouvementPin);
// Vérifier si le bouton poussoir a été enfoncé
if (etatBouton == HIGH && dernierEtatBouton == LOW) {
// Inverser l'état du portail seulement s'il n'y a pas de mouvement détecté
if (etatMouvement == LOW) {
portailOuvert = !portailOuvert;
// Ouvrir ou fermer le portail en fonction de son état
if (portailOuvert) {
ouvrirPortail();
} else {
fermerPortail();
}
} else {
// Indiquer qu'un mouvement a été détecté, empêchant l'ouverture du portail
digitalWrite(buzzerPin, HIGH); // Allumer le buzzer pour avertir
delay(500); // Attendre 500 ms
digitalWrite(buzzerPin, LOW); // Éteindre le buzzer
}
}
// Mémoriser l'état actuel du bouton poussoir pour la prochaine itération
dernierEtatBouton = etatBouton;
// Lecture de l'état de la barrière infrarouge
int etatIR = digitalRead(irPin);
// Vérifier si la barrière infrarouge a détecté un objet
if (etatIR == HIGH && dernierEtatIR == LOW) {
// Inverser l'état du portail
portailOuvert = !portailOuvert;
// Ouvrir ou fermer le portail en fonction de son état
if (portailOuvert) {
ouvrirPortail();
} else {
fermerPortail();
}
}
// Mémoriser l'état actuel de la barrière infrarouge pour la prochaine itération
dernierEtatIR = etatIR;
}
void initialiserEtatPortail() {
// Lecture de la position actuelle du servo pour déterminer l'état du portail
int positionServo = servo_pin_3.read();
if (positionServo > 0) {
// Si la position du servo est supérieure à 0, le portail est ouvert
portailOuvert = true;
digitalWrite(ledPin2, LOW); // Éteindre la deuxième LED
} else {
// Si la position du servo est 0, le portail est fermé
portailOuvert = false;
digitalWrite(ledPin2, LOW); // Éteindre la deuxième LED
}
}
void ouvrirPortail() {
digitalWrite(ledPin2, HIGH); // Allumer la deuxième LED lorsque le portail commence à s'ouvrir
for (int pos = 0; pos <= 120; pos++) { // Ouvrir le portail progressivement
// Vérifier le capteur de mouvement avant chaque mouvement du servo
if (digitalRead(mouvementPin) == HIGH) {
// Arrêter le portail si un mouvement est détecté
digitalWrite(buzzerPin, HIGH); // Allumer le buzzer pour avertir
delay(500); // Attendre 500 ms
digitalWrite(buzzerPin, LOW); // Éteindre le buzzer
return; // Sortir de la fonction pour arrêter l'ouverture
}
servo_pin_3.write(pos); // Définir la position du servo
clignoterLEDsEtBuzzer(); // Faire clignoter la première LED et le buzzer
delay(15); // Attendre 15 ms pour un mouvement progressif
}
digitalWrite(ledPin2, LOW); // Éteindre la deuxième LED lorsque le portail est complètement ouvert
}
void fermerPortail() {
digitalWrite(ledPin2, HIGH); // Allumer la deuxième LED lorsque le portail commence à se fermer
for (int pos = 120; pos >= 0; pos--) { // Fermer le portail progressivement
// Vérifier le capteur de mouvement avant chaque mouvement du servo
if (digitalRead(mouvementPin) == HIGH) {
// Arrêter le portail si un mouvement est détecté
digitalWrite(buzzerPin, HIGH); // Allumer le buzzer pour avertir
delay(500); // Attendre 500 ms
digitalWrite(buzzerPin, LOW); // Éteindre le buzzer
return; // Sortir de la fonction pour arrêter la fermeture
}
servo_pin_3.write(pos); // Définir la position du servo
clignoterLEDsEtBuzzer(); // Faire clignoter la première LED et le buzzer
delay(15); // Attendre 15 ms pour un mouvement progressif
}
// Éteindre les LEDs lorsque le portail est complètement fermé
digitalWrite(ledPin, LOW);
digitalWrite(ledPin2, LOW); // Éteindre la deuxième LED après la fermeture complète du portail
digitalWrite(buzzerPin, LOW); // Éteindre le buzzer
}
void clignoterLEDsEtBuzzer() {
digitalWrite(ledPin, HIGH); // Allumer la première LED
digitalWrite(buzzerPin, HIGH); // Allumer le buzzer
delay(100); // Attendre 100 ms
digitalWrite(ledPin, LOW); // Éteindre la première LED
digitalWrite(buzzerPin, LOW); // Éteindre le buzzer
delay(100); // Attendre 100 ms
}