Problème de départ différé résolu

Je bute sur un problème de chrono au démarrage d'un système à double sens. Devant imposer un retard sur 2 relais de 1 à 2 secondes uniquement au démarrage à contre sens. celà dans le but de désactiver les sondes de fin de course entrant en contradiction avec la logique du système d'arrêt automatique ,basé sur un compteur.
Tant par millis qu'à l'aide de simple minuteur, impossible de combiner quoique ce soit, l'exemple de code ci-contre ne fonctionne pas avec un retard comme souhaité sur les relais 24 et 5 volts. Par contre, le procédé de différé et direct fonctionne très bien dans les deux sens, ne tenant donc pas à le modifier.
J'ai douté de mon matériel, ayant codé auparavant sans autant de difficultés des timers avec millis ou simple minuteur, là, j'échoue bizarrement.
Autant, j'ai essayé avec 3 nano différentes, supprimé l'IDE et les librairies du PC, réinstallés ensuite , le problème a la vie dure!
Merci à ceux qui accepteront me remettre sur les bons rails.

if (fonction == 1 )
{ digitalWrite (relais1; HIGH);
  systeme = true;
  if ((position == 0) && (systeme))
  { Serial.println("différé");
    differe = true;
    direct = false;
  }
  else
  { Serial.println("direct");
    differe = false;
    direct = true;
  }
}

if (fonction == 3)
{ digitalWrite(relaisO, HIGH);
  systeme = true;
  if ((Position == 8) && (systeme))
  { Serial.println("différé");
    differe = true;
    direct = false;
  }
  else
  { Serial.println("direct");
    differe = false;
    direct = true;
  }
}

if ((direct) && (systeme))
{ digitalWrite (relais24, HIGH);
  digitalWrite(relais, HIGH);
  Serial.println("direct actif"):
  }
  else
{ digitalWrite(relais24, LOW);
  digitalWrite(relais5, LOW);
}

if ((differe) && (systeme))                     
{ topdepart = millis();
  if (millis() - topdepart >= 2000)           // NE FONCTIONNE PAS , pas davantage avec simple minuteur
  { digitalWrite(relais24, HIGH);
    digitalWrite(relais, HIGH);
    Serial.println("differe actif"):
    }
    else
  { digitalWrite(relais24, LOW);
    digitalWrite(relais5, LOW);
  }
}

Est-ce bien nécessaire de tester si système est vrai quand vous établissez sa valeur à la ligne du dessus?


Sinon c’est typiquement une définition de programme qui se prête bien à la programmation par machine à états (cf mon tuto éventuellement)

Bonjour et merci JML pour votre avis éclairé
Effectivement, en écrivant tout simplement if (!differe ) , le chrono fonctionne.

Autrement, a partir d'un compteur, comment puis-je déclencher une action, si le temps entre une incrémentation ou à l'inverse une dés incrémentation dépasse une valeur de référence?

la piste du code suivant va t elle dans le bon sens ?

type void controle()

if ( tourne droite)
{ memoposition = Position;
  topdepart = millis();
  if (millis() - topdepart >= 5000)
    if (Position = memoposition)
      " action "
    }
else if (Position = memoposition + 1)
  // revenir ci dessus en boucle à
{ memoposition = Position;

  void ( tourne gauche)

  // idem ci dessus avec
  if (Position = memoposition - 1)or paste code here

En faisant de nouvelles recherches et de plus en inversant les lignes par rapport à celles citées plus avant.
ce genre de boucle ci-après peut elle déclencher une action
si la position(compteur) ne varie pas avant 5 secondes, auquel cas la boucle est infinie, sauf arrêt par sa propre condition ou une cause externe par " boucle = false " ?

Ayant bien entendu déclaré auparavant
unsigned long topdepart = 0;

do
{ memo = Position;
  topdepart = millis();
  if (millis()-topdepart >= 5000)
      boucle = false;
  if (Position = memo + 1)
  }

while (boucle)

Ca ressemble à une erreur. Pour les comparaisons il faut utiliser == et non pas =

Bonjour vangel

Cette condition ne sera jamais vraie du fait que juste avant ce test tu as topdepart = millis();, donc résultat toujours ~0

Pourrais tu détailler pas à pas ce que doit faire ton système, ce serai mieux pour pouvoir t'aider.

A+
Cordialement
jpbbricole

Si vous ne voulez le faire que lors de la modification du compteur

Vous déclarez une variable globale
unsigned long chrono;
lorsque vous allez modifier le compteur vous testez d’abord

if (millis() - chrono > dureeMax) {
  // temps dépassé traiter le timeout
  •••
} else {
  // temps pas dépassé 
  compteur++; // Modifier le compteur
  chrono = millis();  // mémoriser la dernière modif 
}

Il faudra traiter la première modif suivant vos besoins (chrono vaudra 0 et peut être ça déclencherait un temps dépassé alors que ce n’est pas le cas).


Si vous voulez le faire en dehors de l’augmentation du compteur, vous mémorisez le temps à chaque modif du compteur

compteur++; // on modifie le compteur 
chrono = millis();  // mémoriser la dernière modif 

Et dans la loop vous regardez si le temps est dépassé

void loop() {
  if (millis() - chrono > dureeMax) {
    // temps dépassé traiter le timeout
    •••
  } else {
    // temps pas dépassé tout va bien 
    ••• // (le code normal du programme)
  }

}

Merci à tous les trois pour votre coopération. Chacun ayant mis le doigt sur mes différentes erreurs. JML me semble avoir cerné ma demande et me propose une solution qui paraît bien coller à ma requête, je vais tenter dans un premier pas de modifier mon code en conséquence.
Pour répondre à JPbricole, mon système est un enrouleur - dérouleur dont je veuille qu'un compteur fasse d'une part une mise en sécurité en début et fin de course, et d'une autre, une sécurité " obstacle" basée sur un dépassement de temps de référence entre 2 impulsions de ce même compteur. tant en sens + que - .
Chaque tout d'enrouleur créant une impulsion d'un capteur inductif.
La sécurité de fin de course de mon code, fonctionne , j'ai plus de mal avec la seconde.
Ci après, la partie de code du compteur position opérationnelle sur laquelle je souhaite baser la seconde sécurité "obstacle". Cette dernière, comprenant donc une référence temps entre deux impulsions ( d'où l'idée "impuls" ), y compris au démarrage compteur entre 0 et 1 ou en sens inverse entre 8 et 7 par exemple.
Si le décompte temps dépasse la référence, a sécurité est déclenchée. par un codage du type fonction == 2; où cette variable correspond à l'arrêt complet du système dans un sens, fonction == 4; dans le sens inverse.
j'adapte mon code et reviens vers vous dès que possible. Remplaçant impuls par ce
que JML a proposé.


   if ((capteur.vientDEtreEnfonce())  && ( ouverture )) 
  { Position--;
    impuls = true;                 // ? variable utile pour sécurité obstacle? ( dépassement référence temps)
    Serial.println(Position);}
     
   if ((capteur.vientDEtreEnfonce()) && ( fermeture ))
   { Position++;
    impuls = true;
    Serial.println(Position); }
       
    if ((Position == 0)&&(ouverture))                                                 
    { fonction = 4; }                                          // position 0 déclenche fin ouverture auto
     //  Serial.println(" fin ouverture par le 0");}                        
                           
    if (( Position == 8) &&(fermeture))       
    { fonction = 2;}                                           // position 8 déclenche fin fermeture auto
     //  Serial.println(" fin fermeture par le 8");}    

Voici des news à propos du chrono détection obstacle projeté.
Bonne nouvelle, le test dont le code ci après, fonctionne très très bien. j'avoue être heureux de quasi finaliser l'ensemble après déjà 3 semaines sur le projet complet.
Merci encore à ceux m'ayant aidé, finalement je me mélangeait les pinceaux, oubliant ci et là quelque chose, la fatigue aidant vraisemblablement, comme par exemple actualiser simple bouton. Reste encore à adapter ce code test au code du projet complet, à commencer par les positions en sens opposé..
A vrai dire, la dernière difficulté fut de résoudre l'arrêt de la détection obstacle, du chrono en fait, la variable systeme étant déterminante à cette fin. Sinon, le système devient aléatoire. Tant entre le démarrage que les impulsions position, le chronométrage est bien pris en compte identiquement, le tout s'enchaine bien, donc le procédé correspond aux attentes.

#include <simpleBouton.h>
simpleBouton plus = 2;
simpleBouton fermeture = 4;
simpleBouton arret = 6;
int relaisF = 10;
unsigned long chrono1;
bool systeme = false;
int Position ;
bool obstacle = false;

void setup() {

  Serial.begin(9600);

  pinMode(plus, INPUT_PULLUP);
  pinMode(fermeture, INPUT_PULLUP);
  pinMode(12, OUTPUT);
  pinMode(relaisF, OUTPUT);
  pinMode(arret, INPUT_PULLUP);
}

void loop() {

  if (Position == 255)
    Position = 0;
  fermeture.actualiser();
  plus.actualiser();
  arret.actualiser();

  if (plus.vientDEtreEnfonce())        // capteur enrouleur
  { Position++;
    Serial.println(Position);
    chrono1 = millis();
  }            // chrono en cours rotation enrouleur

  if (millis() - chrono1 > 5000)    // reference temps sécurité obstacle

  { obstacle = true;                 // mise en sécurité vraie
    digitalWrite(12, HIGH);
  }    // " témoin simulation action sécurité"

  if (fermeture.vientDEtreEnfonce())
  { systeme = true;
    chrono1 = millis();                // chrono au démarrage systeme
    digitalWrite(relaisF, HIGH);
  }       // relais moteur enrouleur

  if (!systeme)   //  condition d'arrêt détection obstacle en position de veille

  { digitalWrite(12, LOW);  // le témoin s'éteint
    chrono1 = millis();
    obstacle = false;
  }         // annule la mise en sécurité

  if (arret.vientDEtreEnfonce()) // cde arrêt systeme manuelle pour le test
    systeme = false;
}



Le code test est bon, l'application au code complet pose problème.
Dans le test, autant fermeture que arrêt sont 2 boutons fugitifs.
Dans le code de l'enrouleur , c'est un compteur qui détermine fonction des appuis, une boucle de 1 à 4 où :
1 = fermeture, soit la variable nommée fonction 1
2 = arrêt, soit la variable nommée fonction 2
3= ouverture, soit la variable nommée fonction 3
4= arrêt , soit la variable nommée fonction 4 et la boucle revient sur 1 ensuite
Chacune d'entre elles étant à l'origine d'une suite d'opérations.
j'obtiens donc des états figés, la variable étant vraie jusqu'à arrêt de la fonction.
De ce fait me bloque chrono = millis() ; au départ d'une fermeture ou ouverture, contrairement à un switch où l'état est fugitif.
j'ai tenté poser une variable memofermeture dans la fonction 1, et en dehors de la boucle fonction1 coder if(! memofermeture) suivi de chrono=millis();, sans résultat. Ayant cependant parfois avec (! variable) lancer le départ d'un chrono.
Comment puis-je m'y prendre, sans tout modifier?

Peut-être une autre piste
Cependant, comment et où faire le changement d'état ?
Si la solution se trouve par là!

if (fonction 1)
  Etat = 1

         if (fermeture || ouverture)
           Etat = 0;

if (Etat = ! etatPrcédent)
  chrono = millis();

// je pense que l'idée état précédent est valable, le hic c'est que la fonction 1 et fermeture ne font qu'un puisque vrai simultanément.

// idem en ouverture

Reste une énigme, du moins pour moi.
Tant le chrono fonctionne bien en adaptant le code De JML, traité en extérieur du compteur Position, tant lors du démarrage ça ne veut fonctionner puisque la fonction1 qui est sensé initialiser le chrono comme une première impulsion de compteur, est permanente tout au long de la fermeture. En somme posée ainsi, la ligne de code chrono=millis(); semble bloquer le chrono.
En séparant les chronos, l'un pour le démarrage, le second pour Position , c'est un peu mieux, le principe fonctionne, sauf que des erreurs apparaissent.
Le test par boutons fugitifs étant concluant, comment en somme simuler par codage, une commande fugitive lorsque le fonction 1 est activée.? Afin de n'user que d'un seul chrono.
j'ai tenté avec des états inverses tel etat = ! etatprecedent sans succès.

je reste sur l'idée qu'il vous faut faire une machine à états pour structure le code

Je n'en doute pas un seul instant, reste à maîtriser ce genre de bestiole!
Aussi ai-je persévéré en code basique et paré au défaut par rajout de la variable "valid" immédiatement fausse dès le départ d'un cycle ouverture ou fermeture, simulant ainsi le contact fugitif d'un capteur ou d'un switch.
Plusieurs paramètres seront à modifier à la mise en service du système, vraisemblablement au printemps prochain.
MinuteurA et minuteurB déterminent le temps maximum d'un cycle complet du volet, ici de 30 secondes pour le test, modifié en conséquence in situ.
Le chrono de même, le temps réel d'une révolution de l'enrouleur viendra remplacer les 6 secondes du test atelier.
Enfin, le compteur "Position" de 8 sera plus vraisemblablement indexé vers un nombre largement supérieur, le 0 restant quant à lui la référence départ immuable.
Je vous affiche le code complet, estimant être redevable envers les autres quand on sollicite de temps à autre une aide dans ce forum. Maintenant, ce code même s'il fonctionne est loin d'être parfait, aussi je prendrai vos critiques avec bienveillance, si tenté qu'il y en ai, comme par exemple une reformulation plus concise, tournant vraisemblablement autour d'une machine à états!!!!


#include <EEPROM.h>                          // bibliothèque EEprom
#include <simpleBouton.h>                    // bibliothèque de gestion des entrées
#include <simpleMinuteur.h>                  // bibliothèque de gestion minuteurs
simpleBouton dog = 5;                        // entrée info coupure secteur
simpleBouton capteur = 4;                    // entrée capteur induction enrouleur
simpleBouton Tlc = 2;                        // entrée info fonction depuis la télécommande 
simpleMinuteur minuteurA (30000);            // temporisation du time out fermeture : temps maxi fermeture complète
simpleMinuteur minuteurB (30000);            // temporisation du time out ouverture : temps maxi ouverture complète 

unsigned long topdepart = 0;                 // mémoire référence chrono différé relais 5 volts alim RFID 
static unsigned long chrono = 0;             // mémoire référence chrono time out impulsions capteur 
int outcoupure = 6;                          // sortie activant le PUT EEPROM
const unsigned adEeprom = 0;                 // mémoire adresse EEprom
bool systeme = false;                        // mémoire cycle en cours
int fonction = 0 ;                           // déclaration du compteur nommé fonction,servant à gérer le système
int Position;                                // déclaration du compteur nommé position,servant aux sécurités et arrêts automatiques  
int relaisF = 7;                             // déclaration sortie relais fermeture
int relaisO = 8;                             // déclaration sortie relais ouverture
int relais24 = 9;                            // déclaration sortie relais 24 volts capteur induction
int relais5 = 10;                            // déclaration sortie relais 5 volts capteur RFID
int RFID = 11;                               // entrée RFID
bool differe = false;                        // mémoire différé relais 5 volts RFID en cours
bool direct = false;                         // mémoire direct relais 5 volts en cours    
bool fermeture = false;                      // mémoire fermeture en cours
bool ouverture = false;                      // mémoire ouverture en cours
bool closetime= false;                       // mémoire fermeture affectée au différé et chrono impulsions 
bool opentime = false;                       // mémoire ouverture affectée au différé et chrono impulsions
bool valid = false;                          // mémoire d'état au départ chrono impulsions
     

void powerLoss()                            // fonction appelée si coupure courant
{
  EEPROM.put (adEeprom,Position);}          // enregistrement position en cours volet lors d'une coupure secteur

void setup(){

  Serial.begin(9600);
  EEPROM.get(adEeprom,Position);     // relecture EEprom adresse compteur POSITION à l'intialisation suite coupure pour récupération position volet
  Serial.println(Position);
  pinMode(capteur, INPUT_PULLUP);      // capteur inductif créant une impulsion par tour d'enrouleur
  pinMode(Tlc, INPUT_PULLUP);          // entrée télécommande  
  pinMode (relaisF, OUTPUT);           // sortie relais fermeture
  pinMode (relaisO, OUTPUT);           // sortie relais ouverture
  pinMode (relais24, OUTPUT);          // sortie relais 24 volts capteur inductif
  pinMode (relais5, OUTPUT);           // sortie relais 5 volts RFID
  pinMode(outcoupure,OUTPUT);          // sortie boucle vers pin D5 activation enregistrement position en EEprom
  pinMode (dog, INPUT_PULLUP);         // Entrée boucle EEprom depuis un optocoupleur via alimentation secteur(transfo 24 volts)
  pinMode(A5,OUTPUT);                  // Sortie led témoin test time out impulsions
  pinMode(RFID,INPUT);}                // entrée RFID   
  
  void loop()
{  if (Position == 255)                               // utile seulement à la première mise en service
      Position = 0;
 
  dog.actualiser();                    // mise à jour entrée info coupure secteur
  capteur.actualiser();                // mise à jour entrée capteur inductif
  Tlc.actualiser();                    // mise à jour entrée télécommande
  
  if (dog.estRelacheDepuisAuMoins(250))             // condition de déclenchement enregistrement EEprom
    digitalWrite(outcoupure, LOW);                  // sortie à l'état bas active l'interruption via R 1K liaison PIN7 vers PIN2
  else
    digitalWrite(outcoupure, HIGH);                 // blocage exécution enregistrement EEprom

  attachInterrupt(digitalPinToInterrupt(3), powerLoss, FALLING);     // exécution enregistrement EEprom

  
  if (Tlc.vientDEtreEnfonce())
  { fonction++;                          // Incrementation d'une valeur au compteur fonction
    Serial.println(fonction);}           // affichage du numéro de fonction (1,2,3 ou 4) sur console IDE
 
  if (fonction == 1)                     // déclenche la fermeture volet
  { digitalWrite(relaisF,HIGH);
    fermeture = true;                    // mémoire prenant en compte la fermeture en cours
    closetime = true;                    // mémoire prenant en compte l'activation chrono time out Fermeture 
    systeme = true;                      // mémoire prenant en compte cycle en cours
     if ((Position==0)&&(systeme))       // si le cycle démarre depuis la position 0
     {Serial.println("différé");         // affichage textuel pour la console IDE
      differe = true;                    // mémoire différé est vraie, permettant de démarrer 5 volts après 2 secondes 
      direct = false;}}                  // mémoire direct est fausse,permettant de bloquer la commande instantanée du relais 5 volts  
      
    if ((differe == false)&&(systeme))   // inversion des mémoires, permuttant le relais 5 volts entre différé et direct
         direct= true;  
  
  if (fonction == 2)                         // désactivation fonction fermeture
  { digitalWrite(relaisF, LOW);              // relais fermeture passe en repos
     fermeture = false;                      // mémoire fermeture bloquée                
     valid=false;                            // mémoire bloquant l'autorisation départ chrono durée entre impulsions
     closetime = false;                      // mémoire bloquant le chrono time out fermeture
    differe = false;                         // mémoire bloquant le relais 5 volt RFID en différé 
    direct=false;                            // mémoire bloquant le relais 5 volt RFID en direct 
    digitalWrite(relais24, LOW);             // relais 24 volts désactivé
    digitalWrite(relais5, LOW);              // relais 5 volts désactivé 
    systeme = false;}                        // mémoire prenant en compte que le système est au repos
  
    
  if (fonction == 3)                         // déclenche l'ouverture
  { digitalWrite(relaisO,HIGH);
     ouverture = true;                       // mémoire ouverture en cours  
    opentime=true;                           // variable d'activation chrono time out ouverture
    systeme = true;                          // mémoire prenant en compte qu'un cycle est en cours
   // Serial.println(" 3");}
    if((Position==8)&&(systeme))             // si le cycle démarre depuis la position 8
    {Serial.println("différé");
      differe = true;                       // mémoire différé est vraie, permettant de démarrer 5 volts après 2 secondes 
      direct = false;}}                     // mémoire direct est fausse,permettant de différer le 5 volts capteur RFID  
    

    if(fonction==0)                         // lorsque le compteur fonction est à zéro, le système est également au repos
    systeme=false;   
                       
   if(!differe)                             // Si départ différé activé  ( position 0 ou 8 )
   topdepart = millis();                    // démarrage tempo différant le relais 5 volts d'être activé
   if(millis()-topdepart>=2000)             // boucle de temporisation
      digitalWrite(13,HIGH);                // le relais 5 volts est activé au terme de la temporisation
      else        
       digitalWrite(13,LOW);
             
    if(direct)                              // si départ direct autorisé ( 8 > position > 0 )
    digitalWrite(relais5,HIGH);             // le relais5 volts est activé immédiatement ( simultanément au moteur enrouleur)
    else
    digitalWrite(relais5,LOW);              // relais 5 volts désactivé
       
  if (fonction == 4)                       // désactive l'ouverture
  { digitalWrite(relaisO, LOW);            // relais ouverture désactivé
     valid=false;                          // mémoire validation impulsion démarrage chrono obstacle réinitialisée
    ouverture = false;                     // mémoire ouverture en cours réinitialisée 
    opentime = false;                      // mémoire départ chron time out ouverture réinitialisée
    direct=false;                          // mémoire activation direct 5 volts réinitialisée
    differe=false;                         // memoire activation différée 5 volts réinitialisée
   
    digitalWrite(relais24, LOW);           // désactivation relais 24 volts
    digitalWrite(relais5, LOW);            // désactivation relais 5 volts
    systeme = false;                       // mémoire système réinitialisée, mettant le système au repos 
    fonction = 0; }                        // boucle 4 = 0 nécessaire pour reboucler le compteur position
  
      if(!closetime)                                // condition depart chrono temp maxi fermeture
       { minuteurA.demarrer();                      // démarrage chrono time out fermeture
           valid=true;}                             // mémoire validant l'impulsion de démarrage du chrono obstacle à la fermeture
           
      if(!opentime)                                 // condition depart chrono temp maxi ouverture                               
       { minuteurB.demarrer();                      // démarrage chrono time out ouverture
          valid=true;}                              // mémoire validant l'impulsion de démarrage du chrono obstacle à l'ouverture
          
       if (minuteurA.estTermine())                  // le chrono time out fermeture est terminé 
           {fonction = 2;                           // l'arrêt automatique ouverture ou fermeture par dépassement time out
            closetime=false;}                       //  mémoire condition time out fermeture réinitialisée
           
       if (minuteurB.estTermine())                  // le chrono time out ouverture est terminé
            { fonction = 4;                         // l'arrêt automatique ouverture
              opentime=false;}                      // mémoire condition time out ouverture réinitialisée

  if ((capteur.vientDEtreEnfonce())  && ( ouverture ))   // prise en compte impulsions capteur inductif à l'ouverture
  { Position--;                                          // le compteur position évolue en négatif
   chrono = millis();                                    // top départ chrono obstacle à chaque impulsion
   valid=false;                                          // condition d'exécution du chrono obstacle
      Serial.println(Position);}                         // ordre d'affichage de la position actuelle sur la console IDE 
     
   if ((capteur.vientDEtreEnfonce()) && ( fermeture ))   // prise en compte impulsions capteur inductif à la fermeture
   { Position++;                                         // le compteur position évolue en positif
     chrono=millis();                                    // top départ chrono obstacle à chaque implusion
     valid=false;                                        // condition d'exécution du chrono obstacle
     Serial.println(Position); }                         // ordre d'affichage position actuelle sur la console IDE
        
    if ((Position == 0)&&(ouverture))                    // si le compteur position arrive à 0 en cours ouverture                                   
     {valid=false;                                       // réinitialise la mémoire chrono,le désactivant ainsi. 
      fonction = 4;                                      // met le système au repos par la fonction 4
      Serial.println(" fin de course ouverture");}       // affichage textuel par la console IDE 
                                             
    if (( Position == 8) &&(fermeture))                  // si le compteur position arrive à 8 en cours fermeture
     {fonction = 2;                                      // met le système au repos par la fonction 2
       valid=false;                                     // réinitialise la mémoire chrono,le désactivant ainsi.
       Serial.println("fin de coursefermeture");}        // affichage textuel par la console IDE 
 
            
        if(!valid)                                       // la première impulsion au démarrage ouverture ou fermeture 
         {chrono= millis();                              // déclenche le démarrage chrono obstacle
          valid=false;}                                  // réinitialisation mémoire impulsion immédiate, parce que nécessairement unique.
                                           
          if((millis()-chrono>6000)&&(systeme)&&(valid)) // le cycle en cours et la condition chrono autorise le décompte temps(6 secondes)
          { digitalWrite(A5,HIGH);                       // led témoin de mise au point chrono
            fonction++;                                  // Par un pas supplémentaire, le compteur fonction déclenche l'arrêt système
            Serial.println("arrêt par obstacle");}       // affichage textuel par la console IDE
                                                         // temporisation maximum entre impulsions, si plus de 6 secondes, arrêt système   
          if((!systeme)||(!valid))                       // lorsque le système ou le chrono obstacle sont désactivés, 
           {digitalWrite(A5,LOW);                        // le témoin chrono est désactivé 
            chrono=millis();}                            // le chrono obstacle est également désactivé
            
         if ((digitalRead (RFID) == HIGH) && fermeture)  // en cours fermeture, si le capteur RFID envoie une impulsion
         { fonction=2;                                   // arrêt instantané de la fermeture 
           if(Position <=7)                              // contrôle position volet actuelle
           { Position = 8;                               // correction position  sens fermeture en butée si besoin
             Serial.println("arrêt fermeture par RFID");}}  // affichage textuel par la console IDE 
  
      if ((digitalRead (RFID) == HIGH) && ouverture)     // en cours ouverture, si le capteur RFID envoie une impulsion   
          { fonction = 4;                                // arrêt instantané de l'ouverture 
            if (Position >=1)                            // contrôle position volet actuelle
             {Position = 0;                              // correction position sens ouverture en butée si besoin
              Serial.println("arrêt ouverture par RFID");}}} // affichage textuel par la console IDE

           
                                                      //  FIN  DE PROGRAMME
    



           

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