Problème avec un système d'alarme

Bonjour,
En ce moment j’essaie de crée un système de sécurité via arduino en alliant un capteur de mouvement et un clavier matriciel. Mon idée est que quand le Capteur PIR détecte un mouvement , une alarme se met en route et n’est arrêtable que quand le bon mot de passe est entrer. Voici le code que j’utilise :

#include <Password.h>

#include <Keypad.h>

// LED de fermeture/ouverture :
const int LED_rouge = 2;
const int LED_vert = 3;

// Buzzer :
const int Buzzer = 22;

// LED RGB No.1 :
const int RGB1_rouge = 5;
const int RGB1_vert = 6;
const int RGB1_bleu = 7;

// LED RGB No.2 :
const int RGB2_rouge = 8;
const int RGB2_vert = 9;
const int RGB2_bleu = 10;

// Capteurs PIR :
const int PIR = 23;
int Etat_PIR = LOW;
int Memoire_PIR = 0;

// Pad numérique :
Password password = Password( "1234" );
const byte numRows= 4; 
const byte numCols= 4;
char keymap[numRows][numCols]=
{
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
}; 
byte rowPins[numRows] = {9,8,7,6}; 
byte colPins[numCols]= {5,4,3,2};
Keypad keypad= Keypad(makeKeymap(keymap), rowPins, colPins, numRows, numCols);




void setup()
{
  Serial.begin(9600);
  
  // LED de fermeture/ouverture :
  pinMode(LED_rouge, OUTPUT);
  pinMode(LED_vert, OUTPUT);
  digitalWrite(LED_rouge, LOW);
  digitalWrite(LED_vert, HIGH);
  
  // Buzzer :
  pinMode(Buzzer, OUTPUT);
  digitalWrite(Buzzer, HIGH);
  
  // LED RGB No.1 :
  pinMode(RGB1_rouge, OUTPUT);
  pinMode(RGB1_vert, OUTPUT);
  pinMode(RGB1_bleu, OUTPUT);
  digitalWrite(RGB1_rouge, HIGH);
  digitalWrite(RGB1_vert, HIGH);
  digitalWrite(RGB1_bleu, HIGH);
  
  // LED RGB No.2 :
  pinMode(RGB2_rouge, OUTPUT);
  pinMode(RGB2_vert, OUTPUT);
  pinMode(RGB2_bleu, OUTPUT);
  digitalWrite(RGB2_rouge, HIGH);
  digitalWrite(RGB2_vert, HIGH);
  digitalWrite(RGB2_bleu, HIGH);
  
  // Capteur PIR :
  pinMode(PIR, INPUT);
  
  // Pad Numérique :
  keypad.addEventListener(keypadEvent); 
  keypad.setDebounceTime(250);
}


void loop()
{
  Memoire_PIR = digitalRead(PIR);
  if (Memoire_PIR == HIGH)
  {
    );
    digitalWrite(Buzzer, LOW);
    digitalWrite(RGB1_rouge, LOW);
    digitalWrite(RGB2_rouge, LOW);
    keypad.getKey();
   }
  else
  {
   Memoire_PIR = digitalRead(PIR);
  } 
}


void keypadEvent(KeypadEvent eKey)
{
  switch (keypad.getState())
  {
    case PRESSED:
      Serial.print("Pressed: ");
      Serial.println(eKey);
      switch (eKey){
        case '#': guessPassword(); break;
         default:
               password.append(eKey);
  }
}
}

void guessPassword()
{
     Serial.print("Guessing password... ");
     if (password.evaluate())
     {         
             delay(500);                             
           Serial.println("VALID PASSWORD "); 
           digitalWrite(Buzzer, HIGH);
           digitalWrite(RGB1_rouge, HIGH);
           digitalWrite(RGB2_rouge, HIGH);
           digitalWrite(LED_rouge, HIGH);
           digitalWrite(LED_vert, LOW);  
     }
     else
     {
           Serial.println("INVALID PASSWORD ");
           password.reset(); 
              
     }
}

J’ai déjà tester les programmes de chaque composant à part et sa fonctionne sans problème. Mais là mon capteur détecte un mouvement , l’alarme se met en route et ne s’arrête pas malgré le fait que le bon mot de passe soit entré (Aussi je galère a rentrer le code car la carte ne détecte les touches appuyée que après une latence assez conséquente) . Si quelqu’un pouvait m’éclairer sur le sujet se serait sympa. Merci !

Yep!

Il y a de fortes chances que ton capteur détecte continuellement un mouvement et rend ainsi ta condition toujours vraie, il y a répétition du code.

Tu devrais, à mon humble avis, entrer dans une boucle du genre "tant que le code n'est pas le bon" dès détection d'un mouvement. Ça shunterait déjà d'un part le capteur (plus nécessaire puisque la détection est faite) et permettrait de passer à la partie "alarme" avec gestion du code et d'une tempo.

Tu peux aussi lancer tout simplement une tempo éludant la détection et écoutant uniquement le clavier.

Il ne faut pas oublier que le loop() répète en continu le programme.

@+

Zoroastre.

Rebonjour ! Désolé d’avoir mis du temps à répondre
J’ai suivis tes conseils zoroastre et ça a résolu le problème !

#include <Password.h>

#include <Keypad.h>

const int alarm = 12;
const int pir = 10;
int etat_pir = LOW;

Password password = Password( “1234” );
const byte numRows= 4;
const byte numCols= 4;
char keymap[numRows][numCols]=
{
{‘1’, ‘2’, ‘3’, ‘A’},
{‘4’, ‘5’, ‘6’, ‘B’},
{‘7’, ‘8’, ‘9’, ‘C’},
{’*’, ‘0’, ‘#’, ‘D’}
};
byte rowPins[numRows] = {9,8,7,6};
byte colPins[numCols]= {5,4,3,2};
Keypad keypad= Keypad(makeKeymap(keymap), rowPins, colPins, numRows, numCols);

void setup()
{
Serial.begin(9600);
keypad.addEventListener(keypadEvent);

pinMode(alarm, OUTPUT);
digitalWrite(alarm, HIGH);
//led et tt
pinMode(pir, INPUT);

etat_pir = digitalRead(pir);
}

void loop()
{
keypad.getKey();
checkIntrusion();
}

void checkIntrusion()
{
etat_pir = digitalRead(pir);
if(etat_pir == HIGH)
{
alarmintru();
}
else {
digitalRead(pir);
}
}

void alarmintru()
{
digitalWrite(alarm, LOW);
}

void keypadEvent(KeypadEvent eKey)
{
switch (keypad.getState()){
case PRESSED:
Serial.print("Pressed: ");
Serial.println(eKey);
switch (eKey){
case ‘#’:
guessPassword();
break;
default:
password.append(eKey);
}
}
}

void guessPassword(){
if(password.evaluate()){
Serial.println("VALID PASSWORD ");
digitalWrite(alarm, HIGH);
password.reset();
}
else
{
Serial.println("INVALID PASSWORD ");
password.reset();
}
}

Je voudrais juste savoir comment faire pour désactiver le capteur quand le mot de passe est correcte. Parce que pour l’instant, même après avoir mis le code, si je repasse ma main devant le capteur, le buzzer s’allume une nouvelle fois.

Merci encore !

bonjour, il te faut une variable en plus lorsque tu tape le code si code bon => desactive =1 (par exemple) dans ton loop ca pourrait donner ca

void loop()
{
 keypad.getKey();
if(desactive !=1) checkIntrusion();
}

ne pas oublier par la suite une autre chose pour réarmer le système ;)