Bonjour à tous,
d'abord je me présente : CREB, utilisateur (vraiment newbie) ARDUINO, dont je souhaite me servir pour domotiser quelque peu mon domicile.
J'aurais pu faire simple en achetant des systèmes tout prêts, mais je suis tombé amoureux d'Arduino...
Alors voilà mon souci:
je suis en train de monter un système d'ouverture / fermeture de mes volets battants.
Toute la partie électrique et mécanique est prête et fonctionne très bien en manuelle, mais je rencontre un problème avec mon programme test.
Ma séquence se décompose comme suit:
- mise en marche d'un avertisseur sonore et lumineux pour prévenir de l'activité prochaine des volets
- après 5 secondes, un relais vient mettre un moteur dans la bonne polarité (soit pour l'ouverture soit pour la fermeture)
- après une demi-seconde le moteur se met en route jusqu'à ce qu'une fin de course soit détectée sur l'interruption 1
- dès contact en fin de course, le moteur s'arrête
- après une demi seconde , le relais se remet en position de repos
- après 1.5 secondes l'avertisseur se coupe
jusque là tout va bien avec un de mes programmes de test. Le souci se pose car je souhaite mettre en interruption 0 un bouton d'arrêt de séquence au cas où...
tout s'arrête rapidement, mais le souci est que après l'arrêt se soit réalisé, le programme continue, et remet tout en marche.
En gros je souhaiterais savoir comment on peut revenir au tout début de la fonction loop après une interruption
voici mon code si quelqu'un peut m'aider (j'ai remplacé sur cet exemple mon interruption générée par les fins de course par une temporisation de 10 secondes pour ne pas trop embrouiller l'affaire):
// Définition des variables
const int relaismoteur = 4; // le relais de contrôle du moteur est branché sur la broche 4
const int relaisinverseur = 5; // le relais de contrôle de l'inverseur est branché sur la broche 5
const int relaisavertisseur = 8; // le relais de contrôle de l'avertisseur est branché sur la broche 8
const int boutonouverture = 6; // le bouton d'ouverture est branché sur la broche 6
const int boutonfermeture = 7; // le bouton de femreture est branché sur la broche 7
const int findecourse = 3; // les fins de course sont branchées sur la broche 2 (interruption 0)
const int boutonarret = 2; // le bouton d'arrêt est branché sur la broche 3 (interruption 1)
int etatboutonouverture = LOW; // le bouton d'ouverture est déclaré comme relaché
int etatboutonfermeture = LOW; // le bouton de fermeture est déclaré comme relaché
int etatfindecourse = LOW; // les fins de course sont déclarées comme relachées
int etatboutonarret = LOW; // le bouton d'arrêt est déclaré comme relaché
// Initialisation
void setup()
{
pinMode (relaismoteur, OUTPUT); // la broche du relais de contrôle moteur (broche 4) est une sortie
pinMode (relaisinverseur, OUTPUT); // la broche du relais de contrôle de l'inverseur (broche 5) est une sortie
pinMode (relaisavertisseur, OUTPUT); // la broche du relais de contrôle de l'avertisseur d'activité (broche 8) est une sortie
pinMode (boutonouverture, INPUT); // la broche du bouton d'ouverture (broche 6) est une entrée
pinMode (boutonfermeture, INPUT); // le broche du bouton de fermeture (broche 7) est une entrée
pinMode (findecourse, INPUT); // la broche des capteurs de fin de course (broche 3) est une entrée (interruption 1)
pinMode (boutonarret, INPUT); // la broche du bouton d'arrêt de séquence (broche 2) est une entrée (interruption 0)
}
// boucle principale
void loop()
{
attachInterrupt (0, procedurearret, CHANGE); // l'interruption 0 (broche 2) déclenchée par le changement détat du bouton d'arrêt de séquence lance l'exécution de la fonction "procedurearret"
digitalWrite (relaismoteur, HIGH); // le relais de contrôle du moteur est inactif (moteur arrêté)
digitalWrite (relaisinverseur, HIGH); // le relais inverseur est inactif (position de fermeture)
digitalWrite (relaisavertisseur, HIGH); // le relais de contrôle de l'avertisseur d'activité est inactif (avertisseur à l'arrêt)
etatboutonouverture = digitalRead (boutonouverture); // etatboutonouverture correspond à la lecture de l'état du bouton d'ouverture (broche 6)
etatboutonfermeture = digitalRead (boutonfermeture); // etatboutonfermeture correspond à la lecture de l'état du bouton de fermeture (broche 7)
if (etatboutonouverture == LOW) // si le bouton d'ouverture est appuyé...
{
procedureouverture(); // ... lancement de la fonction "procedureouverture"
}
else if (etatboutonfermeture == LOW) // sinon, si le bouton de fermeture est appuyé...
{
procedurefermeture(); // lancement de la fonction "procedurefermeture"
}
}
// Procédure d'ouverture
void procedureouverture()
{
delay (1000); // attendre 1 seconde
digitalWrite (relaisavertisseur, LOW); // activer le relais de contrôle de l'avertisseur d'activité (avertisseur d'activité en marche)
delay (5000); // attendre 5 secondes
digitalWrite (relaisinverseur, LOW); // activer le relais inverseur (mise en position d'ouverture)
delay (500); // attendre 0,5 seconde
digitalWrite (relaismoteur, LOW); // activer le relais de contrôle du moteur (moteur en marche)
delay (10000); // attendre 10 secondes
digitalWrite (relaismoteur, HIGH); // désactiver le relais de contrôle du moteur (moteur arrêté)
delay (500); // attendre 0,5 secondes
digitalWrite (relaisinverseur, HIGH); // désactiver le relais inverseur (mise en position de fermeture)
delay (1500); // attendre 1,5 secondes0
digitalWrite (relaisavertisseur, HIGH); // désactiver le relais de contrôle de l'avertisseur d'activité (avertisseur d'activité arrêté)
}
// Procédure de fermeture
void procedurefermeture()
{
delay (1000); // attendre 1 seconde
digitalWrite (relaisavertisseur, LOW); // activer le relais de contrôle de l'avertisseur d'activité (avertisseur d'activité en marche)
delay (5000); // attendre 5 secondes
digitalWrite(relaisinverseur, HIGH); // désactiver le relais inverseur (mise en position de fermeture)
delay(500); // attendre 0,5 seconde
digitalWrite (relaismoteur, LOW); // activer le relais de contrôle moteur (moteur en marche)
delay (10000); // attendre 10 secondes
digitalWrite (relaismoteur, HIGH); // désactiver le relais de contrôle moteur (moteur arrêté)
delay (500); // attendre 0,5 seconde
digitalWrite (relaisinverseur, HIGH); // désactiver le relais inverseur (mise en position de fermeture)
delay (1500); // attendre 1,5 secondes
digitalWrite (relaisavertisseur, HIGH); // désactiver le relais de contrôle de l'avertisseur d'activité (avertisseur d'activité arrêté)
}
// Procédure d'arrêt de séquence
void procedurearret()
{
digitalWrite (relaismoteur, HIGH); // désactiver le relais de contrôle moteur (moteur arrêté)
delay (500); // attendre 0,5 seconde
digitalWrite (relaisinverseur, HIGH); // désactiver le relais inverseur (mise en position de fermeture)
delay (3000); // attendre 3 secondes
digitalWrite (relaisavertisseur, HIGH); // désactiver le relais de contrôle de l'avertisseur d'activité (avertisseur d'activité arrêté)
}
Merci d'avance et énormément pour votre aide