Mon projet de répondeur arrive à son terme, toutefois je bloque sur une dernière mise au point, à savoir, utilisant la fonction gérer séquence de la librairie de Bricoleau, je n'arrive pas à contourner une partie ou raccourcir une étape en présence d'un évènement extérieur. Dans mon code, de 0 à 10 les étapes se succèdent jusqu'au terme du temps maximum d'enregistrement, et ça fonctionne parfaitement. En cas de coupure d'appel de l'appelant, je souhaite raccourcir l'enregistrement à l'essentiel, les 11000 ms allouées étant un maximum. Dans cette éventualité, il me faut soit intervenir au niveau étape 7 ou 8 , soit créer une fonction propre à un évènement extérieur, mettant fin à la séquence et prenant en charge les paramètres d'arrêt du système. C'est l'option que j'ai tenté de choisir, vainement.
y_a_t_il possibilité d'intervenir en cours de séquence et de la modifier en conséquence?
J'ai adjoint la partie concernée du code, l'intégralité étant conséquente.`
bool initial = false; // variable fin d'appel
bool confirmation = false; // variable confirmant vouloir mettre fin à la séquence
bool memorec1 = false; // variable mémoire présence message 1 sur recorder
bool arret = false; // variable pour arret séquence en absence de code reçu
bool enreg = false; // variable autorisation enregistrement si code reçu
void gerersequence() // Déclaration fonction séquence
{
static byte etape = 0;
static unsigned long chrono = 0;
unsigned long delai = millis() - chrono; // calcul durée de chaque étape
if (etape == 0 && lancerSequence)
{
lancerSequence = false;
digitalWrite(Religne, HIGH); // relais ligne
digitalWrite(Alan, HIGH); // Alim module annonce
digitalWrite(PchangMute, HIGH); // commutateurs reed niveau audio
digitalWrite(Pchang200, HIGH);
digitalWrite(Pchang100, HIGH);
etape++;
chrono = millis();
}
else if (etape == 1 && delai >= 3000)
{
pinMode(LectA, OUTPUT); // impulsion départ lecture annonce
etape++;
chrono = millis();
}
else if (etape == 2 && delai >= 500)
{
pinMode(LectA, INPUT); // fin impulsion lecture annonce
etape++;
chrono = millis();
}
else if (etape == 3 && delai >= 30000) // fin de 1ère partie lecture annonce
{
digitalWrite(Refct, HIGH); // basculement relais fonction en réception
etape++;
chrono = millis();
}
else if (etape == 4 && delai >= 11000)
{
if (memoDTMF == false) // si code DTMF absent,variable arret bascule vraie pour la condition de coupure appel
{
arret = true;
}
else
digitalWrite(Refct, LOW); // relais fonction re bascule en émission
etape++;
chrono = millis();
}
else if ( etape == 5 && delai >= 6000) // delai diffusion 2ème partie annonce
{
digitalWrite ( Alan, LOW); // fin d'annonce, coupure alim module annonce
enreg = true;
etape++;
chrono = millis();
}
else if (etape == 6 && delai >= 400)
{
arret = false; // remise à zéro de la variable, le code ayant été reçu
pinMode(Rec, OUTPUT); // impulsion démarrage enregistrement
etape++;
chrono = millis();
}
else if (etape == 7 && delai >= 200)
{
pinMode(Rec, INPUT); // fin impulsion démarrage enregistrement
digitalWrite(Refct, HIGH); // relais fonction re bascule en réception
if (confirmation == true) // condition d'activation fin enregistrement sur coupure ligne appelant
{ cloture(); // fonction de cloture séquence anticipée
lancerSequence = false;
etape = 0;
}
etape++;
chrono = millis();
}
else if (etape == 8 && delai >= 110000) // délai maximum d'enregistrement message
{ pinMode (Rec, OUTPUT); // impulsion de fin enregistrement
etape++;
chrono = millis();
}
else if (etape == 9 && delai >= 500)
{
pinMode(Rec, INPUT); // fin d'impulsion fin enregistrement.
etape++;
chrono = millis();
}
else if (etape == 10 && delai >= 500)
{
digitalWrite(Arec1, LOW); // paramètres de cloture en fin de séquence au terme du temps maximum imparti
digitalWrite (Arec2, LOW);
digitalWrite(Religne, LOW);
digitalWrite(Refct, LOW);
digitalWrite(PchangMute, LOW);
digitalWrite(Pchang200, LOW);
digitalWrite(Pchang100, LOW);
memorec1 = true;
enreg = false;
memoDTMF = false;
lancerSequence = false;
etape = 0;
}
if (digitalRead(A1) == HIGH)memoDTMF = true; // origine variable mémoire code reçu
if (( memorec1 == false) && ( enreg == true))digitalWrite(Arec1, HIGH); // si pas de mémoire M1, déclenche Alim recorder 1
if (memorec1 == true)
digitalWrite(13, HIGH); // 5 volts pin 13 vient bloquer optocoupleur activation démarrage séquence
if ( memorec1 == true)clignoter1(); // fonction clignotement led présence message
if ((enreg = true) && (initial == true))
confirmation = true;
// variable confirmation(fin de séquence)vraie, si enregistrement activé lors de la coupure appel
// confirmation active " void cloture " avec tous les paramètres de fin de séquence.
}
void setup {}
void loop {}
void cloture() {
pinMode(Rec, OUTPUT);
delay(500);
pinMode(Rec, INPUT);
delay(500);
digitalWrite(Arec1, LOW); // si enreg en cours + mémoire M1 fausse lors fin coupure appel, déclenche arrêt enreg = séquence clôture appel
digitalWrite (Arec2, LOW);
digitalWrite(Religne, LOW);
digitalWrite(Refct, LOW);
digitalWrite(Arec2, LOW);
digitalWrite(Alan, LOW);
digitalWrite(PchangMute, LOW);
digitalWrite(Pchang200, LOW);
digitalWrite(Pchang100, LOW);
arret = false;
enreg = false;
initial = false;
memoDTMF = false;
memorec1 = true;
confirmation = false;
lancerSequence = false;
etape = 0;
}
}