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