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
}
}