Problème avec temporisation millis Arduino

a marqué ce sujet comme résolu.

Bonjour à toutes et tous, Je me permet de demander votre aide car je tourne en rond depuis plusieurs jours déjà. Je ne suis qu’un débutant en programmation Arduino mais il est vrai que ce monde est passionnant. Bref je vous explique mon cas dans le code posté ci-dessous, il s’agit d’un petit système d’alarme qui en résumé fonctionne comme ceci :

  • Appuis sur un bouton et enclenchement après tempo de 20 secondes (temps de sortie) mais cette partie n’est pas encore réalisée donc on ne s’en occupe pas.

  • Si détection d’une alarme via détecteur IR on active une tempo de 20 secondes (tempo à l’entrée) et si le code correct n’a pas été entré au clavier dans ce délais, on enclenche un relais qui lui enclenche un transmetteur SMS externe.

Si je résume dans ce code, toute la partie clavier et détection des codes fonctionne très bien pas de problème à ce niveau.

Description du problème:

Le problème se situe dans la première partie temporisation: Code pour la temporisation de retard à l’enclenchement de la transmission GSM lors de l’entrée (après détection du détecteur IR).

Quand je charge le code dans l’Arduino et que j’appuie sur le BP (qui simule le détecteur IR) la diode rouge qui indique un détection IR s’allume en permanence (ce qui est correct via la variable Val_IR qui est mise à la valeur 1: Val_IR = 1 ce qui lance la tempo d’entrée) et 20 secondes après (temps d’entrée) la diode qui indique l’enclenchement du relais de transmission SMS s’allume sauf si un des 3 codes correct à été introduis avant la fin de la tempo d’entrée ce qui a pour effet d’allumer pendant 3 secondes la led verte et remet à 0 toutes les variables et éteint toutes les Led (ce qui est apparement toujours correct). Mais où ça bug, c’est quand j’appuie de nouveau sur le BP pour relancer la séquence précédente pour re tester là j’ai immédiatement les 2 diodes (rouge pour la détection IR ça c’est ok et celle du relai SMS ça ce n’est plus ok) qui s’allume en même temps et immédiatement, il n’y a plus de tempo ou s’il y en a une elle n’est plus de 20 secondes mais de 2 ou 5 bref complètement aléatoire. Si je retape un code correct tout s’éteint de nouveau mais après un nouvel appuis sur la BP de nouveau le même phénomène bizarre … Bref je sèche

Pouvez-vous m’aiguiller svp merci pour votre investissement Bien à vous

Voici le code:

////////////////////////////////////////////////////////////////
//LIBRAIRIES
#include <Servo.h> //librairie pour la commande simple des servomiteurs

#include <Password.h> //http://www.arduino.cc/playground/uploads/Code/Password.zip
// librairie pour la gestion de mots de passe

#include <Keypad.h> //http://www.arduino.cc/playground/uploads/Code/Keypad.zip
// librairie pour le clavier
//*************************************************


#define Ld_cd_OK 14                    // broche de la led verte (alarme désactivée)
#define Ld_Al_Fonct 16                   // broche de la led Rouge (Defaut détecté = clignotement et en transmission SMS = Fixe)
#define Ld_cd_Non_OK 15                 // broche de la led bleu (Code NON OK)
#define Det_IR 17                        //broche de l'entrée du détectyeur IR
#define Rel_Trans_GSM 18                 // broche du relai de transmission GSM
int Etat_Ld_Al_Fonct = 0;               // Variable qui aura comme valeur l'état de la led alarme en fonctionnement
int Etat_IR ;       // variable qui aura comme valeur l'état de l'entrée du détecteur IR 
int Val_IR = 0;  //Variable qui dit aura comme valeur l'état de la led rouge (détection d'une alarme) et qui gardera cette valeur tant que un code correct n'a pas été introduit



unsigned long timer_IR = 0;      // définition des variables temps (Timer pour detection IR)
unsigned long temps = 0;         // définition des variables temps (partie clavier)
long touche;
boolean bleu;

Password password = Password( "4501" );  // 1er mot de passe exemples ici arbitraires, on peut très bien choisir des mots de passe plus long
Password password2 = Password( "5521" );  // 2e mot de passe
Password password3 = Password ("8910");  // 3e mot de passe

const byte ROWS = 4; // clavier à 4 lignes
const byte COLS = 3; //clevier à 3 colonnes
char keys[ROWS][COLS] = {
  {
    '1','2','3'  }
  ,                      //définitioon du clavier, touche par touche
  {
    '4','5','6'  }
  ,
  {
    '7','8','9'  }
  ,
  {
    '*','0','#'  }
};
byte colPins[COLS] = {
  6,7,8}; //numéro des ports connectés aux lignes
byte rowPins[ROWS] = {
  2,3,4,5}; //numéro des ports connectés aux colonnes du clévier


// création du clavier
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
//___________________________________________________________________________________________________________________________


void setup(){                            // void setup est l'initialisation

  keypad.addEventListener(keypadEvent); //ajout d'un évènement qui écoute le clavier, il regarde si une touche est appuyée
  pinMode(Ld_cd_OK, OUTPUT);                // définition de la pins sortie de la led bleu
  pinMode(Ld_Al_Fonct, OUTPUT);             // définition de la pins sortie de la led rouge
  pinMode(Ld_cd_Non_OK,OUTPUT);             // définition de la pins sortie de la led rouge
  pinMode(Rel_Trans_GSM,OUTPUT);            //définition de la pin de la sortie du relai transmission GSM 
  pinMode (Det_IR, INPUT);                  // définition de la pin entrée du détecteur infra rouge
  digitalWrite(Rel_Trans_GSM,LOW);         //On coupe le relai de transmission GSM
  digitalWrite(Ld_Al_Fonct,LOW);           // On coupe la led rouge led alarme fonctionnement
  digitalWrite(Ld_cd_Non_OK,LOW);          // On coupe la led bleu code non OK
  digitalWrite(Ld_cd_OK,LOW);             // On coupe la led verte code OK
  bleu = 0;                            // veriable pour l'activation ou désactivation de la led bleu
  
}

//___________________________________________________________________________________________________________________________


void loop()
{                           


    // Code pour la temporisation de retard à l'enclenchement de la transmission GSM lors de l'entrée (après détection du détecteur IR) (Le problème se trouve probablement ici)
    //_________________________________________________________________________________________________________________________________

    
      Etat_IR = digitalRead(Det_IR);  //On attribue la valeur de la variable Etat_IR en lisant l'entrée Dét_IR
      if ( Etat_IR == 1) // Si détection alors Etat_IR = 1
      {
        Val_IR = 1; //
      }
      if (Val_IR == 1)
      {
         digitalWrite(Ld_Al_Fonct,HIGH);//OK
         if ((millis() - timer_IR) > 15000)        // temps au bout duquel on supprime les numéros composés si  le mot de passe n'est pas bon  //OK
         {
          timer_IR = millis();            // on prend le temps  //OK
          digitalWrite(Rel_Trans_GSM,HIGH);      // on eteind la led bleu   //OK
         } 
      } 
  
// Code pour la partie clavier et contrôle du mots de passe (fonctionne correctement)
//________________________________________________________________________________________________________________________________________

  keypad.getKey();
  if ((millis() - temps) > 10000)        // temps au bout duquel on supprime les numéros composés si  le mot de passe n'est pas bon
  {
    temps = millis();            // on prend le temps
    digitalWrite(Ld_cd_Non_OK,LOW);      // on eteind la led bleu
    password.reset();             //on oublie les touches composées, stockées dans le comparateur avec le premier mot de passe
    password2.reset();             // pareil avec le second
    password3.reset();              // et le troisième
    bleu = 0;                  // on demande que la LED soit éteinte
  } 
 

}

//take care of some special events
void keypadEvent(KeypadEvent eKey){        // fonction de lecture des touches appuyées
  temps = millis();                // on prend le temps
  switch (keypad.getState()){
  case PRESSED:                // si une touche est pressés
    switch (eKey){
    case '*': 
      checkPassword(); 
      break;        // si c'est la touche *, on sort de la fonction
    case '#':                                // si c'est le #, on réinitialise le mot de passe et on demande l'activation de la led en blanc
      password.reset();   // On reset le Password 
      password2.reset();  // On reset le Password 2
      password3.reset();  // On reste le Password 3
      if(bleu==1){                    // si la variable blanc = 1 , on etein led Led bleu
      digitalWrite(Ld_cd_Non_OK,LOW);//On éteint la led bleu
      bleu=0;                
      }
     
      break;
    default: 
      password.append(eKey);                      // pour toutes les autres touches, on les stocke dans les variables qui les compareront aux bons mot de passes
      password2.append(eKey);
      password3.append(eKey);
      digitalWrite(Ld_cd_OK,LOW); // on eteind la led verte code OK     

          
    }

  }

}

void checkPassword(){                                    // fonction de vérification du des mots de passes
  temps = millis();                                    // on prend le temps
  if (password.evaluate()||password2.evaluate()||password3.evaluate()){      // si un des 3 mots de passe correspond

   
    digitalWrite(Ld_Al_Fonct,LOW);      // rouge éteinte
    digitalWrite(Ld_cd_OK,HIGH);       // verte allumée
    digitalWrite(Rel_Trans_GSM,LOW);   // on coupe la transmission GSM
    digitalWrite(Ld_cd_Non_OK,LOW);   // on coupe la led bleu code non OK
    Etat_Ld_Al_Fonct = 0;             // On remet la variable Etat_ld_Al_Fonct à 0
    Val_IR = 0;                        //On remet la variable Val_IR à 0
    delay(2000);                       // temps d'allumage led verte 
    digitalWrite(Ld_cd_OK,LOW);        //vert éteint
    password.reset();                 //on supprime les 3 mots de passe des variables de comparaison
    password2.reset();
    password3.reset();
    //Add code to run if it works
  }
  else{                                    // si le mot de passe n'est pas le bon
    digitalWrite(Ld_cd_OK,LOW);
    digitalWrite(Ld_cd_Non_OK,HIGH);      // on allume la led rouge
    delay(150);
    digitalWrite(Ld_cd_Non_OK,LOW);       // on l'éteint
    delay(150);
    digitalWrite(Ld_cd_Non_OK,HIGH);      // allume ...
    delay(150);
    digitalWrite(Ld_cd_Non_OK,LOW);
    delay(150);
    digitalWrite(Ld_cd_Non_OK,HIGH);
    bleu=!bleu;                        // après avoir clignoté 3 fois, on change la variable bleu

  }
}
 
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte