Alarme arduino mega pb tempo

Bonjour, je souhaiterais créer un système d’alarme avec un arduino mega, capteur de porte, relais sur le qu’elle serait brancher une sirène, buzzer, clavier 4x4, lcd 16x2 et c’est tout il me semble… j’ai donc trouvé un code sur internet et commencer a l’adapter mais j’aurais besoin d’aide car quand j’active l’alarme il y as une temporisation de 30 secondes mais quand une porte est détectée ouverte l’alarme s’enclenche directement mais j’aimerais qu’il y est une temporisation de 15secondes au dela de quoi seulement le relais et le buzzer s’activeraient. Je pense que ce n’est pas compliqué mais je n’y arrive pas, j’ai trouvé sur internet un code qui fait ca mais je ne sais pas comment l’adapter… je vous mets les deux codes ci-joint.

Code avec la tempo que je ne sait pas comment adapter a mon code:


//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 = 8;
int led = 9;
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);

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()
unsigned long tempoSirene = 0; //Variable compteur permettant de savoir quand activer le buzzer dans le MODE SIRENE tout en évitant les delay() qui sont bloquant !!
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(led, OUTPUT);
  pinMode(buzzer, OUTPUT);
  pinMode(detecteurMouvement, INPUT);
  //Initialisation de l'LCD et activation du rétro-éclairage
  lcd.init();
  lcd.backlight();
  //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(15000);
      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 > 10) {
        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
    if (tempoSirene < 10000) {
      tone(buzzer, 1000, 50);
    }
    else {
      noTone(buzzer);
    }
    tempoSirene = tempoSirene + 1;
    if (tempoSirene > 20000) {
      tempoSirene = 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(led, HIGH);
  }
  else {
    digitalWrite(led, LOW);
  }
}

//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;
  compteur = 0;
}

Mon code:


#include <LiquidCrystal.h> // includes the LiquidCrystal Library
#include <Keypad.h>
const uint8_t buzzer = 15;
int autoprot = 14;
int capt1 = 22;
int capt2 = 23;
int relais1 = 8;
int ledarm = 9;
uint32_t duration;
int screenOffMsg =0;
String password="0903";
String tempPassword;
boolean activated = false; // State of the alarm
boolean isActivated;
boolean activateAlarm = false;
boolean alarmActivated = false;
boolean enteredPassword; // State of the entered password to stop the alarm
boolean passChangeMode = false;
boolean passChanged = false;
 
const byte ROWS = 4; //four rows
const byte COLS = 4; //four columns
 
const int L4=0; //declaration constante de broche
const int L3=1; //declaration constante de broche
const int L2=2; //declaration constante de broche
const int L1=3; //declaration constante de broche
const int C4=4; //declaration constante de broche
const int C3=5; //declaration constante de broche
const int C2=6; //declaration constante de broche
const int C1=7; //declaration constante de broche
 
 
//define the cymbols on the buttons of the keypads
char keyMap[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
byte rowPins[ROWS] = {0, 1, 2, 3}; //Row pinouts of the keypad
byte colPins[COLS] = {4, 5, 6, 7}; //Column pinouts of the keypad
 
char keypressed;
 
LiquidCrystal lcd(16, 17, 18, 19, 20, 21); // Creates an LC object. Parameters: (rs, enable, d4, d5, d6, d7)
Keypad myKeypad = Keypad( makeKeymap(keyMap), rowPins, colPins, ROWS, COLS);
  
void setup() {
  Serial.begin(9600);
  lcd.begin(16,2);
  pinMode(buzzer, OUTPUT);
  pinMode(relais1, OUTPUT);
  pinMode(ledarm, OUTPUT);
  pinMode(capt1, INPUT_PULLUP);
  pinMode(capt2, INPUT_PULLUP);
  pinMode(autoprot, INPUT_PULLUP);
  delay (100);
  digitalWrite(relais1, LOW);
}
void loop() {
  if (activateAlarm) {
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Activation syst");
    lcd.setCursor(0,1);
    lcd.print("dans:");
    
    int countdown = 30; // 9 seconds count down before activating the alarm
    while (countdown != 0) {
      lcd.setCursor(6,1);
      lcd.print(countdown);
      countdown--;
      tone(buzzer, 700, 100);
      delay(1000);
    }
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Alarme Activer");
    activateAlarm = false;
    alarmActivated = true;
  }
  if (alarmActivated == true){
    digitalWrite(ledarm, HIGH);
      if (digitalRead(capt1) == HIGH || digitalRead(capt2) == HIGH || digitalRead(autoprot) == HIGH) {
        tone(buzzer, 1000); // Send 1KHz sound signal
        digitalWrite(relais1, HIGH);
        lcd.clear();
        enterPassword();
      }
    }
  if (!alarmActivated) {
    if (screenOffMsg == 0 ){
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("A- Armer systeme");
      lcd.setCursor(0,1);
      lcd.print("B- Changer Code");
      digitalWrite(relais1, LOW);
      digitalWrite(ledarm, LOW);
      screenOffMsg = 1;
    }
    keypressed = myKeypad.getKey();
     if (keypressed =='A'){        //If A is pressed, activate the alarm
      tone(buzzer, 1000, 200);
      activateAlarm = true;           
    }
    else if (keypressed =='B') {
      lcd.clear();
      int i=1;
      tone(buzzer, 2000, 100);
      tempPassword = "";
      lcd.setCursor(0,0);
      lcd.print("Code Actuel");
      lcd.setCursor(0,1);
      lcd.print(">");
      passChangeMode = true;
      passChanged = true;  
      while(passChanged) {     
      keypressed = myKeypad.getKey();
      if (keypressed != NO_KEY){
        if (keypressed == '0' || keypressed == '1' || keypressed == '2' || keypressed == '3' ||
            keypressed == '4' || keypressed == '5' || keypressed == '6' || keypressed == '7' ||
            keypressed == '8' || keypressed == '9' ) {
         tempPassword += keypressed;
         lcd.setCursor(i,1);
         lcd.print("*");
         i++;
         tone(buzzer, 2000, 100);
        }
      }
      if (i > 5 || keypressed == '#') {
        tempPassword = "";
        i=1;
        lcd.clear();
        lcd.setCursor(0,0);
        lcd.print("Code Actuel");
        lcd.setCursor(0,1);
        lcd.print(">");
      }
      if ( keypressed == '*') {
        i=1;
        tone(buzzer, 2000, 100);
        if (password == tempPassword) {
          tempPassword="";
          lcd.clear();
          lcd.setCursor(0,0);
          lcd.print("Nouveau Code");
          lcd.setCursor(0,1);
          lcd.print(">");
          while(passChangeMode) {
            keypressed = myKeypad.getKey();
            if (keypressed != NO_KEY){
              if (keypressed == '0' || keypressed == '1' || keypressed == '2' || keypressed == '3' ||
                  keypressed == '4' || keypressed == '5' || keypressed == '6' || keypressed == '7' ||
                  keypressed == '8' || keypressed == '9' ) {
                tempPassword += keypressed;
                lcd.setCursor(i,1);
                lcd.print("*");
                i++;
                tone(buzzer, 2000, 100);
              }
            }
            if (i > 5 || keypressed == '#') {
              tempPassword = "";
              i=1;
              tone(buzzer, 2000, 100);
              lcd.clear();
              lcd.setCursor(0,0);
              lcd.print("Nouveau Code");
              lcd.setCursor(0,1);
              lcd.print(">");
            }
            if ( keypressed == '*') {
              i=1;
              tone(buzzer, 2000, 100);
              password = tempPassword;
              passChangeMode = false;
              passChanged = false;
              screenOffMsg = 0;
            }           
          }
        }
      }
    }
   }
 }
}
void enterPassword() {
  int k=5;
  tempPassword = "";
  activated = true;
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print(" *** ALARME *** ");
  lcd.setCursor(0,1);
  lcd.print("Code>");
      while(activated) {
      keypressed = myKeypad.getKey();
      if (keypressed != NO_KEY){
        if (keypressed == '0' || keypressed == '1' || keypressed == '2' || keypressed == '3' ||
            keypressed == '4' || keypressed == '5' || keypressed == '6' || keypressed == '7' ||
            keypressed == '8' || keypressed == '9' ) {
          tempPassword += keypressed;
          lcd.setCursor(k,1);
          lcd.print("*");
          k++;
        }
      }
      if (k > 9 || keypressed == '#') {
        tempPassword = "";
        k=5;
        lcd.clear();
        lcd.setCursor(0,0);
        lcd.print(" *** ALARME *** ");
        lcd.setCursor(0,1);
        lcd.print("Code>");
      }
      if ( keypressed == '*') {
        if ( tempPassword == password ) {
          activated = false;
          alarmActivated = false;
          noTone(buzzer);
          digitalWrite(relais1, LOW);
          screenOffMsg = 0;
        }
        else if (tempPassword != password) {
          lcd.setCursor(0,1);
          digitalWrite(relais1, HIGH);
          lcd.print("Code Errone !");
          delay(2000);
          lcd.clear();
          lcd.setCursor(0,0);
          lcd.print(" *** ALARME *** ");
          lcd.setCursor(0,1);
          lcd.print("Code>");
        }
      }   
    }
}

vous comprenez les code postés ?

on dirait que "votre" code c'est plutôt une copie de Arduino Security and Alarm System Project - HowToMechatronics

lisez ce que j’ai écrit, j’ai bien noté que j’avais tiré ce code sur internet et avait tenté de l’adapter !

Bonjour,

il te suffit juste de rajouter une condition de tempo juste après la lecture du capteur.

Du genre : Si capteur == true
alors tempoCapteur = millis()
si millis() - tempoCapteur < 15000
on boucle
sinon on lance la sirène

Cette tempo existe dans le code original

Tu devrais remplacer toutes les instructions delay() qui sont bloquantes ,la loop attend et ne fait rien pendant chaque instruction delay(), en utilisant millis().

Pourriez-vous me donner un exemple car j’ai essayé mais je n’y arrive pas :frowning:

Tu as le modèle à l’état 2 mode alerte du code originel

Il suffit d’adapter le temps et les variables à ton usage : 15000 à la place de 1000 et de créer une variable temps1 par exemple

cherche sur le net des exemples avec millis ça ne manque pas

bonjour, j’ai essayé de recopier le code dans l’exemple avec etat2 etc… mais ca ne marche pas et j’ai essayé un exemple millis d’internet mais ca ne marche pas non plus :frowning:

je commence à désespérer

Tu devrais lire les tutos d’eskimon. Ça va grandement t’aider à comprendre ce que tu fais.
Recopier du code sans le comprendre c’est jamais bon.
Regarde page 151 du document pdf, l’utilisation de l’instruction millis() est bien expliquée.

Tout à fait d'accord.
Et si l'on veut voir le déroulement d'un programme sur le terminal (moniteur série), autant commencer par le début, lire ceci :

je m’y connais quand meme en arduino j’ai juste jamais utilisé millis