Single leaf gate

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
}

Welcome to the forum

Please follow the advice given in the link below when posting code, in particular the section entitled 'Posting code and common code problems'

Use code tags (the < CODE/ > icon above the compose window) to make it easier to read and copy for examination

https://forum.arduino.cc/t/how-to-get-the-best-out-of-this-forum

In my experience the easiest way to tidy up the code and add the code tags is as follows
Start by tidying up your code by using Tools/Auto Format in the IDE to make it easier to read. Then use Edit/Copy for Forum and paste what was copied in a new reply. Code tags will have been added to the code to make it easy to read in the forum thus making it easier to provide help.

Thanks for telling. What is the question?

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.