Bonjour à toutes et tous je suis nouveau sur le forum et je penses être dans la bonne rubrique mais corrigez moi si je me trompe. 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:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
#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
    bleu=!bleu;                        // on change la variable bleu
 
  }
}