Servomoteur et poussoir

Bonjour!!
J'essaye de fabriquer un petit système du style iris avec un servo 180 pour protéger l'objectif d'une caméra. Le clapet sur le palonnier se déplace a 90° et est actionné à l'aide d'un capteur de proximité (poussoir de test dans mon code).
Pas de problème pour mettre en place le servo et le capteur par contre je bloque sur la la mise en place d'une pause de la position servo lorsque le capteur est actif.

Je ne sais pas si je suis sur la bonne voie en tentant un retour?

#include <Servo.h>

int pinBouton;
const int Led = 4;

Servo clapet;  


 
void setup() {
Serial.begin(9600);
pinBouton = 2;
pinMode(pinBouton, INPUT); 
pinMode(Led, OUTPUT); // led témoin

}

void loop() {

  boolean etatBouton = digitalRead(pinBouton);

  if (etatBouton==HIGH)
  {
     Serial.println("ok");
     digitalWrite(Led, LOW); // led de test
     moteur();
  }
 
 
  else {
  Serial.println("stop");
  digitalWrite(Led, HIGH); //allumer L1
  moteur2();

  }

}

 void moteur(){
  clapet.attach(9);
int pos = 0;
 
    for (pos = 0; pos <= 60; pos += 1) { 
  
    clapet.write(pos);             
   delay(15);                      
  }
}

// retour du servo
   void moteur2(){
  clapet.attach(9);
  int pos = 0; 
    for (pos = 60; pos >= 0; pos -= 1) { 
  
    clapet.write(pos);             
   delay(70);                      
  }
  }

Quelqu'un aurait-il une piste?
Merci!!

hello

je pense que tu simules mal ( avec ton BP) le fonctionnement du PIR

le PIR maintien son flag de sortie pendant un temps programmable dans le code

VOIR ICI

du coup, un servo peut-il garder sa position tant que le poussoir est actionné? et revenir à 0 lorsque le poussoir est relâché?

J'ai fini par réussir avec l'aide d'un super tuto et en abordant les notions d'événements:

Je met mon code si cela peut aider:

#include <Servo.h>
 
const byte SERVO_A_ANGLE_MIN = 0;
const byte SERVO_A_ANGLE_MAX = 1;
const byte SERVO_EN_MOUVEMENT_VERS_ANGLE_MAX = 2;
const byte SERVO_EN_MOUVEMENT_VERS_ANGLE_MIN = 3;
 
const int angleMin = 1250;
const int angleMax = 1750;
 
Servo monServo;
int vitesse = 0;
int angle = angleMin;
byte etatServo = SERVO_A_ANGLE_MIN;
 
const int pinBouton = 0; /* le bouton est connecté à la broche A0 */
 
const boolean PRESSE = true;
const boolean RELACHE = false;
 
boolean etatBouton = RELACHE;
 
const byte AUCUN_EVENEMENT = 0;
const byte EVENEMENT_PRESSE = 1;
const byte EVENEMENT_RELACHE = 2;
 
/*
 * fonctions de gestion du poussoir
 */
boolean lirePoussoir()
{
    boolean resultat = RELACHE;
    if (analogRead(pinBouton) > 512) {
        resultat = PRESSE;
    }
    return resultat;
}
 
byte lireEvenement()
{
    byte evenement;
    boolean nouvelEtat = lirePoussoir();
    if (nouvelEtat == etatBouton)
        evenement = AUCUN_EVENEMENT;
    if (nouvelEtat == PRESSE && etatBouton == PRESSE)
        evenement = EVENEMENT_PRESSE;
    if (nouvelEtat == RELACHE && etatBouton == RELACHE)
        evenement = EVENEMENT_RELACHE;
    etatBouton = nouvelEtat;
    return evenement;
}
 
/*

 */
void setup()
{
  monServo.attach(9);
}
 
/*
 
 */
void loop()
{
    /* actualisation de l'angle du servo */
    monServo.writeMicroseconds(angle);
  
    angle = angle + vitesse;
  
    if (angle > angleMax) {
        angle = angleMax;
        vitesse = 0;
        etatServo = SERVO_A_ANGLE_MAX;
    }
    else if (angle < angleMin) {
        angle = angleMin;
        vitesse = 0;
        etatServo = SERVO_A_ANGLE_MIN;
    }
 
    /* lecture de la commande de l'utilisateur */
    byte evenement = lireEvenement();
  
    if (evenement == EVENEMENT_PRESSE) {
        switch (etatServo) {
            case SERVO_A_ANGLE_MIN:
            case SERVO_EN_MOUVEMENT_VERS_ANGLE_MIN:
                vitesse =  1;
                etatServo = SERVO_EN_MOUVEMENT_VERS_ANGLE_MAX;
                break;
        
        } 
    }


     if (evenement == EVENEMENT_RELACHE) {
        switch (etatServo) {
          
            case SERVO_A_ANGLE_MAX:
            case SERVO_EN_MOUVEMENT_VERS_ANGLE_MAX:
                vitesse = -1;
                etatServo = SERVO_EN_MOUVEMENT_VERS_ANGLE_MIN;
                break;
        } 
    }

    
    delay(3);
}