Désactivation alarme par password avec délai d'entrée

j'ai dit le code fonctionne car il fait ce pour quoi il est programmé mais ne fait pas ce que vous souhaitez :grin:
j'ai pris le code dont je vous ai parlé et je l'ai modifié pour qu'il corresponde a vos câblages
a vérifier quand même...
Vous avez la possibilité de modifier les temps de sortie, d'entrée avant de faire le code et le temps ou la sirène sonne.
bref plus grand chose a faire !!
juste a télécharger le programme dans l’Arduino .
j'ai laissé le buzzer ça peut être utile (mais si pas câblé ça change rien !)
et le mot de pass je l'ai laissé a 1234
j'ai ajouté une fonction qui fait clignoter la led rouge si un éventement a eu lieu, sinon on ne sait pas si l'alarme s'est déclenché

//Importation des bibliothèques nécessaires au projet
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
#include <Password.h>

LiquidCrystal_I2C lcd(0x27, 16, 2); //L'adresse de l'lcd pourrait etre différente de 0x27 -> si besoin lancez un code pour scanner les périphériques I2C (I2C Scanner)
//On spécifie les pins sur lesquelles sont connectés le détecteur, la led et le buzzer
int detecteurMouvement = A0;
int redLed = A2;
int greenLed = A3;
int relais = A1;
int buzzer = 10;

const byte lignes = 4; //Nombre de lignes et colonnes sur le clavier
const byte colonnes = 4;
char boutons[lignes][colonnes] = { //Matrice de caractères correspondant à chacun des boutons du clavier
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'}
};
byte pinsLignes[lignes] = {7, 6, 5, 4}; //On spécifie les pins où sont branchés les fils correspondant aux lignes du clavier
byte pinsColonnes[colonnes] = {3, 2, 1, 0}; //On spécifie les pins où sont branchés les fils correspondant aux colonnes du clavier
Keypad clavier = Keypad(makeKeymap(boutons), pinsLignes, pinsColonnes, lignes, colonnes);

const long tempoSortie = 5000; // temps de sortie apres alarme activé
const long tempoBuzzer = 5000; // Temps avant alarme/temps pour desactiver l'alarme
const long tempoSirene = 5000; //Temps de fonctionnement de la sirene

unsigned long tempoLed = 0;
boolean evenement = false;
char bouton; //Variable permettant de stocker le caractère du bouton sur lequel on a appuyé
boolean alarme = false; //Variable permettant de savoir si l'alarme est activée ou désactivée
boolean code = false; //Variable permettant de controler si le code entré est correct ou non
boolean detection = false; //Variable permettant de savoir si un mouvement à été détecté
boolean timeout = false; //Variable permettant de savoir si on a dépassé le temps dans l'état ALERTE et qu'on doit passer en MODE SIRENE
boolean tempsMort = true; //Variable qui permet de gérer l'inactivité du détecteur de mouvement
int etape = 1; //Variable permettant de contrôler les événements dans le loop()
int compteur = 0; //Variable compteur permettant de compter le nombre de bip dans le MODE ALERTE
long temps; //Variable utilisée pour des mesures de temps locales lorsque l'alarme est en MODE ALERTE
int posLCD = 12; //Position sur l'LCD (colonne) où on print le 1er caractère du code
Password motDePasse = Password("1234"); //Mot de passe permettant d'activer et désactiver l'alarme


void setup() {
  //Déclaration des pins de l'Arduino en sortie pour la led et le buzzer et en entrée pour le détecteur
  pinMode(redLed, OUTPUT);
  pinMode(greenLed, OUTPUT);
  pinMode(relais, OUTPUT);
  pinMode(buzzer, OUTPUT);
  pinMode(detecteurMouvement, INPUT);
  //Initialisation de l'LCD et activation du rétro-éclairage
  lcd.init();
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print(" PROTECTION");
  lcd.setCursor(0, 1);
  lcd.print(" ATELIER ");
  delay(5000);
  lcd.clear();
  digitalWrite(greenLed, HIGH);
  //Appel de la fonction (voir plus bas dans le code) qui gère l'affichage de l'état de l'alarme sur l'LCD -> par défaut l'alarme est désactivée
  ecranEtatAlarme();
}


void loop() {
  bouton = clavier.getKey(); //On lit le clavier et on stocke le résultat dans la variable bouton
  if (bouton != NO_KEY) {
    switch (bouton)//On exécute une action en fonction de la touche qui a été appuyée
    {
      case '*' : reinitialiserCode(); break; //Si on appuye sur *, on efface le code sur l'LCD
      case '#' : verifierCode(); break; //Si on appuye sur #, on vérifie que le code entré par l'utilisateur = mot de passe de l'alarme
      case 'A' : break; //On ne fait rien lorsqu'il s'agit des 4 lettres
      case 'B' : break;
      case 'C' : break;
      case 'D' : break;
      default : ajouter(); //Si on appuye sur un chiffre, on l'ajoute au code utilisateur (concaténation) et on print sur l'LCD
    }
  }

  //ETAT 1
  //Si l'alarme vient d'être ACTIVEE,on attend 15 secondes et puis on commence à prendre des mesures avec le détecteur de mouvement
  //Dès que le capteur a détecté un mouvement, l'alarme passe en MODE ALERTE
  if (alarme == true && etape == 1) {
    if (tempsMort) {
      delay(tempoSortie);
      tempsMort = false;
    }
    else {
      if (digitalRead(detecteurMouvement) == HIGH) {
        detection = true;
        etape = 2;
      }
    }
  }

  //ETAT 2 (MODE ALERTE)
  //On émet un bip toutes les secondes pendant environ 10 secondes (=tant que compteur <=10)
  //On utilise la fonction millis pour la mesure du temps à la place d'un delay (bloquant) qui rendrait le clavier indisponible or on veut lire le clavier à tout moment
  if (detection == true && etape == 2) {
    if ((millis() - temps) > 1000)
    {
      tone(buzzer, 1000, 50);
      temps = millis();
      compteur = compteur + 1;

      if (compteur > tempoBuzzer/1000) {
        timeout = true;
        etape = 3;
        compteur = 0;
      }
    }
  }

  //ETAT 3 (MODE SIRENE)
  //On active le buzzer pendant 10000 tours de boucle et on le désactive pendant 10000 autres tours
  //Le choix du nombre de boucle s'est fait par essai-erreur jusqu'à obtenir le résultat sonore souhaité
  //Une fois de plus, on évite la fonction delay grâce à une nouvelle astuce
  if (timeout == true) { //L'alarme passe en MODE SIRENE
    noTone(buzzer);
    digitalWrite(relais, HIGH);
    evenement = true;

    if ((millis() - temps) >= tempoSirene)
    {
      temps = millis();
      timeout = false;
      etape = 1;
      digitalWrite(relais, LOW);

    }
  }

  else {
    digitalWrite(relais, LOW);
  }


  if (evenement == true) { //fait clignoter la led rouge en cas d'evenement

    if (tempoLed < 4000) {
      digitalWrite(redLed, HIGH);
    }
    else {
      digitalWrite(redLed, LOW);
    }
    tempoLed = tempoLed + 1;
    if (tempoLed > 8000) {
      tempoLed = 0;
    }
  }

}

//----------FONCTIONS----------//

//Fonction qui change l'état de l'alarme sur l'écran LCD
void ecranEtatAlarme() {
  if (alarme) {
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("ACTIVEE");
    lcd.setCursor(0, 1);
    lcd.print("SAISIR CODE:");
  }
  else {
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("DESACTIVEE");
    lcd.setCursor(0, 1);
    lcd.print("SAISIR CODE:");
  }
}

//Fonction qui affiche un écran de confirmation lorsqu'on valide le code
void ecranValiditeCode() {
  if (code) {
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("---CORRECT---");
  }
  else {
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("---INCORRECT---");
  }
}

//Fonction qui change l'état de la LED statut en fonction de l'état de l'alarme
void etatLed() {
  if (alarme) {
    digitalWrite(redLed, HIGH);
    digitalWrite(greenLed, LOW);

  }
  else {
    digitalWrite(redLed, LOW);
    digitalWrite(greenLed, HIGH);
  }

}

//Fonction qui permet de réinitialiser le code et l'effacer de l'écran LCD
void reinitialiserCode() {
  motDePasse.reset();
  ecranEtatAlarme();
  posLCD = 12;
}

//Fonction qui permet de tester si le code entré par l'utilisateur et correct
//Si c'est le cas, on change l'état de l'alarme (ACTIVEE->DESACTIVEE ou DESACTIVEE->ACTIVEE)
//On met à jour l'état de la led
//On réinitialise le code ainsi que les variables de contrôle
void verifierCode() {
  if (motDePasse.evaluate()) {
    code = true;
    ecranValiditeCode();
    delay(1000);
    alarme = !alarme;
    etatLed();
    reinitialiserCode();
    reinitialiserVariablesControle();
  }
  else {
    code = false;
    ecranValiditeCode();
    delay(1000);
    reinitialiserCode();
  }
}

//On ajoute le chiffre sur lequel on a appuyé au code entré (concaténation)
//On l'affiche sur l'écran LCD
void ajouter() {
  motDePasse.append(bouton);
  lcd.setCursor(posLCD, 1);
  lcd.print(bouton);
  posLCD = posLCD + 1;
  if (posLCD > 15) {
    posLCD = 12;
  }
}

//Fonction qui permet de réinitialiser les variables de contrôle
void reinitialiserVariablesControle() {
  etape = 1;
  detection = false;
  timeout = false;
  tempsMort = true;
  evenement = false;
  compteur = 0;
}