Commande de volets battants avec Arduino uno et L298n

bonjour
j'ai trouvé la solution pour la mise en tuile des volets à l'aide d'une boucle
do {.actions.} while (conditions) :
la séquence est:
1 fermeture jusqu'à butée
2 ouverture pendant 3 secondes qui correspond à l'ouverture en tuile des battants.
ci dessous la vidéo de simulation avec Proteus.

ci dessous le code:

/* INITIALISATION DES BROCHES*/
// Association des entrées du L298N, aux sorties utilisées sur notre Arduino Uno //
#define borneENA        12      // j'associe la borne "ENA" du L298N à la pin D10 de l'arduino
#define borneENB       13       // j'associe la borne "ENB" du L298N à la pin D5 de l'arduino
#define borneIN1        8       // j'associe la borne "IN1" du L298N à la pin D9 de l'arduino
#define borneIN2        7       // j'associe la borne "IN2" du L298N à la pin D8 de l'arduino
#define borneIN3        6       // j'associe la borne "IN3" du L298N à la pin D7 de l'arduino
#define borneIN4        5       // j'associe la borne "IN4" du L298N à la pin D6 de l'arduino
/****************************Affectation des entrées boutons de commande et sortiess LED **************************/
int bp_ouverture = 2;
int bp_fermeture = 3;
int bp_arret = 4;
int bp_tuile = A2;
int led_ouv = 9 ;
int led_fer = 10 ;
int led_stop = 11;
int led_tuile = A3;
int led_intens = A4;
/* **************************variables  de stockage des valeurs lues sur les broches analogiques***************************************/
float val_A0 = 0;
float val_A1 = 0;
/* *******************************variables  de stockage des résultat de la conversion des précédentes valeurs en tension***************************************/
float U_A0 = 0;
float U_A1 = 0;
 /*****************************************************************************************************************************************************************/
/* SETUP */
/*******************************************************************************************************************************************************************/
void setup()
/***************4 premier pinMode pour les boutons poussoir en entrée avec activation de la résistance de Pullup interne.*/
/*******************************la résistance de Pullup interne sert à éviter de mettre une résistance sur le circuit imprime*/
{
pinMode(bp_ouverture, INPUT_PULLUP);
pinMode(bp_fermeture, INPUT_PULLUP);
pinMode(bp_arret, INPUT_PULLUP);
pinMode(bp_tuile, INPUT_PULLUP);
/*********** Configuration des pins de l'Arduino en "sortie" (car elles attaquent les entrées du module L298N et les led)*************/
pinMode(borneENA, OUTPUT);
pinMode(borneENB, OUTPUT);
pinMode(borneIN1, OUTPUT);
pinMode(borneIN2, OUTPUT);
pinMode(borneIN3, OUTPUT);
pinMode(borneIN4, OUTPUT);
 pinMode (led_ouv, OUTPUT);
 pinMode (led_fer, OUTPUT);
 pinMode (led_stop, OUTPUT);
 pinMode (led_tuile, OUTPUT);
 pinMode (led_intens, OUTPUT);

//cette ligne sert seulement pour développement afin de visualiser avec les moniteurs connectés Arduino et sur Poteus 8.0//
// sur les sorties tx et rx / 0 et 1 //
Serial.begin(9600);
}
//****************************************************************************************************************************************************************/
/************************************************** Boucle principale : LOOP qui appèle les sous fonctions ********************************************************/
void loop() 
{
if (digitalRead(bp_tuile) == LOW)        /****ordre de mise en tuile******/
{
tuile();
delay(500);
stop();
ouverture1();
Serial.println("ouverture pendant 3 sec");
delay(3000);                /* temps d'ouverture "3 secondes" qui determine l'angle d'ouverture en tuile*/
stop();
}
else if (digitalRead (bp_ouverture) == LOW)   /****ordre ouverture******/
{
delay(500);stop();
 Serial.println();
Serial.println("commade ouverture");
digitalWrite(led_ouv, HIGH);
ouverture1();  //appel fonction ouverture
intens();
}
else if (digitalRead (bp_fermeture) == LOW)            /****ordre fermeture******/
 
{
stop();
 Serial.println();
Serial.println("commade fermeture");
digitalWrite(led_fer, HIGH);
delay(500);
fermeture1();
intens();
} 
else if (digitalRead (bp_arret) == LOW)      /****ordre Stop******/
{
 Serial.println();
Serial.println("commade stop");
digitalWrite(led_stop, HIGH);
delay(500);
stop();
} 
else /*>>>>>>>>>>>>>>>>>>>> verifier les sur-intensité et eteindre les led*/
{
intens();
digitalWrite(led_stop, LOW); 
digitalWrite( led_fer, LOW);
digitalWrite(led_ouv,  LOW);
digitalWrite(led_tuile, LOW);
 
}
}
/***************************************************************************************************************************************************************************/
/****************************Sous Fonctions : ouverture1, fermeture1, mise en tuile, stopA, stopB, stop total, detection intensité ****************************************/

/******************************************** Macro ouverture************************************************************************/
void ouverture1() 
{
/***********************************Configuration du L298N en "ouverture", pour les moteurs. Selon sa table de vérité, il faut que :*/
digitalWrite(borneIN1, HIGH);                 // L'entrée IN1 doit être au niveau haut
digitalWrite(borneIN2, LOW);                  // L'entrée IN2 doit être au niveau bas
digitalWrite(borneIN3, HIGH);                 // L'entrée IN3 doit être au niveau haut
digitalWrite(borneIN4, LOW);                  // L'entrée IN4 doit être au niveau bas
digitalWrite(borneENA, HIGH);                 // Active l'alimentation du moteur 1
delay(500);                                   // attend 0.5 secondes pour decaler les battants
digitalWrite(borneENB, HIGH);                 // Active l'alimentation du moteur 2
intens();
}
/******************************************** Macro fermeture************************************************************************/
void fermeture1()
{  
// Configuration du L298N en "fermeture", pour les moteurs. Selon sa table de vérité, il faut que :
digitalWrite(borneIN1, LOW);                  // L'entrée IN1 doit être au niveau bas
digitalWrite(borneIN2, HIGH);                 // L'entrée IN2 doit être au niveau haut
digitalWrite(borneIN3, LOW);                  // L'entrée IN3 doit être au niveau bas
digitalWrite(borneIN4, HIGH);                 // L'entrée IN4 doit être au niveau haut
digitalWrite(borneENB, HIGH);                 // Active l'alimentation du moteur 2
delay(500);                                   // attend 0.5 secondes pour decaler les battants
digitalWrite(borneENA, HIGH);                 // Active l'alimentation du moteur 1
intens();
}
/******************************************** Macro arret moteur 1************************************************************************/
void stop_A ()
{
digitalWrite(borneENA, LOW);                  // desactive l'alimentation du moteur 1
digitalWrite(borneIN1, LOW);                  // L'entrée IN1 au niveau bas
digitalWrite(borneIN2, LOW);                  // L'entrée IN2 au niveau bas
}
/******************************************** Macro arret moteur 2************************************************************************/
void stop_B ()
{
digitalWrite(borneENB, LOW);                   // desactive l'alimentation du moteur 2
digitalWrite(borneIN3, LOW);                  // L'entrée IN3 au niveau bas
digitalWrite(borneIN4, LOW);                  // L'entrée IN4 au niveau bas
}
/******************************************** Macro stop total************************************************************************/
void stop ()
 {
digitalWrite(borneIN1, LOW);                  // L'entrée IN1 au niveau bas
digitalWrite(borneIN2, LOW);                  // L'entrée IN2 au niveau bas
digitalWrite(borneIN3, LOW);                  // L'entrée IN3 au niveau bas
digitalWrite(borneIN4, LOW);                  // L'entrée au niveau bas
digitalWrite(borneENA, LOW);                  // desactive l'alimentation du moteur 1
digitalWrite(borneENB, LOW);                  // desactive l'alimentation du moteur 2
digitalWrite(led_stop, LOW);                    // eteind le led_stop
digitalWrite( led_fer, LOW);                    // eteind le led_fer
digitalWrite(led_ouv,  LOW);                     // eteind le led_ouv
digitalWrite(led_tuile, LOW);                     // eteind le led_tuile
}
/******************************************** Macro de mise en tuile************************************************************************/
void tuile()
{
Serial.println("tuile");
 Serial.println();
 Serial.println("fermeture jusqu'a butee avant mis en tuile");

stop();
digitalWrite(led_tuile, HIGH);
delay(500); 
fermeture1();
/******************* boucle de détection de fermeture complète****do {instruction}  While (condition)********************/
do
{
intens();
digitalRead (borneENA);
digitalRead (borneENB);
}
while ((digitalRead (borneENA) != LOW)||(digitalRead (borneENB) != LOW));
delay(500); 
}

/******************************************** Macro de détection intensité fin de course ********************************************************/
void intens() 
{
/********** lecture des valeurs d'intensite des moteur******/
val_A0 = analogRead(A0); 
val_A1 = analogRead(A1);
/*********conversion  en tension ds valeurs lues*********/
U_A0 = ((val_A0 * 5.0) / 1024);  
U_A1 = ((val_A1 * 5.0) / 1024);

if (U_A0 > 2)
{ 
Serial.println ("fin de course_A");
 Serial.println();
digitalWrite(borneENA, LOW);    
digitalWrite(borneIN1, LOW);
digitalWrite(borneIN2, LOW);
}
if (U_A1 > 2)
{
Serial.println ("fin de course B");
 Serial.println();
digitalWrite(borneENB, LOW);    
digitalWrite(borneIN3, LOW);
digitalWrite(borneIN4, LOW);
digitalWrite(led_intens, HIGH);
}
}