Partage
  • Partager sur Facebook
  • Partager sur Twitter

Arduino DOMOTIQUE

Arreter l'alarme avec les touches entrees au clavier

    21 mars 2019 à 13:58:00

     Salut.. je suis entrain de bosser sur un projet de fin d'etude:domotique avec arduino mais je suis un peu bloquer quelque part.  l'utilisateur lorsqu'il a entree 3 fois mot de passe incorrect. xa declenche directement une alarme ou quand le systeme detecte le feux xa declenche automatiquement l'alarme===> le probleme je ne sais toujours pas comment arreter l'alarme(buzzer).
    //DIRECTIVES DE PREPROCESSEUR
    #include <Password.h> 
    #include <Keypad.h> 
    #include <Wire.h>
    #include <Servo.h>
    #include <LiquidCrystal_I2C.h>
    #include <dht.h>
    
    
    //LES VARIABLES ET CONSTANTES
    #define FLAME 12 //pin pour le detecteur de flame
    #define ALARME 11 //pin pour le led(alarm)
    #define LedB A2 //pin pour le led(alarm)
    #define dht_apin A1 //pin connecté  à la broche analogique A0
    dht DHT;
    Servo servo; //declaration du servo
    Password password = Password("1234");  // password pour activer le systeme ou desactiver le systeme
    bool statut = 0; //statut alarme
    int i;
    int cpt=0;
    int buzzer = 13;//pin pour le buzzer
    const byte ROWS = 4; // rows
    const byte COLS = 4; // cols
    char keys[ROWS][COLS] = 
    {
      {'1','2','3','A'},
      {'4','5','6','B'},
      {'7','8','9','C'},
      {'*','0','#','D'}
    };
    byte rowPins[ROWS] = {6,7,8,9}; //connecter to the row pinouts of the keypad
    byte colPins[COLS] = {5,4,3,2}; //connect to the column pinouts of the keypad
    LiquidCrystal_I2C lcd(0x27,16,2); //initialisation du lcd
    Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
    
    //***********PROTOTYPES*************
    void affichage();
    void fonctions();
    void alarm();
    void activer();
    void desactiver();
    void checkPassword();
    void codeInvalide();
    void TempHum();
    void flame();
    void ventillation();
    void chauffage();
    
    void setup()
    {
       Serial.begin(9600);
       pinMode(buzzer, OUTPUT); 
       pinMode(FLAME,INPUT);
       pinMode(LedB,INPUT);
       affichage();
       keypad.addEventListener(keypadEvent);
       //servo commandé dans sa position initiale
      
    }
    
    void loop()
    {
      fonctions();
      flame();
    }
    
    void fonctions(){
     keypad.getKey();
    }
    
    
    void keypadEvent(KeypadEvent eKey){
      switch (keypad.getState()){
      case PRESSED:
      int i;
    for( i = 1; i <= 1; i++ )
    {
      digitalWrite(buzzer, HIGH);   
      delay(50);            
      digitalWrite(buzzer, LOW);  
      delay(50);      
    } 
      lcd.print("*");
      Serial.println(eKey);
        switch (eKey){
        case '#':                 //# pour valider le password 
          checkPassword();  //verification du mot de passe s'il est correct ou non
          break;
        case '*':                 //* pour réinitialiser
          password.reset(); 
          break;
        default: 
          password.append(eKey);
        }
      }
    }
    
    
    void checkPassword(){                  // pour verifier si le PIN est correct
      if (password.evaluate())
      {  
        int i;
          for( i = 1; i <= 2; i++ )
          {
            digitalWrite(buzzer, HIGH);   
            delay(70);            
            digitalWrite(buzzer, LOW);  
            delay(70);      
          }
        if(statut == 0)
        {
          activer();
        } 
        else if(statut ==1) {
          desactiver();
        }
      } 
      else {
        codeInvalide();
      }
    }
    
    void activer()      //activer le systeme si le pin entre est correct et afficher un message a l'ecran
    {  
       digitalWrite(ALARME, HIGH);
       digitalWrite(LedB, HIGH);
       lcd.setCursor(0,0);
       lcd.print(" << BIENVENU >>");
       lcd.setCursor(0,1);
       lcd.print("SYSTEME ACTIVE");
       delay(2000);
       lcd.clear();
       servo.attach(10);//servo connecté sur la broche D10
       lcd.print("PORTE OUVERTE"); 
       servo.write(90);
       delay(4000);
       servo.write(0);
       TempHum();
       flame();
       statut = 1;
       password.reset();
      delay(2000);
    }
    
     
    void desactiver()
    {
      digitalWrite(ALARME, LOW);
      digitalWrite(LedB, HIGH);
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("SYSTEME DESACTIVE");
      statut = 0;
      password.reset();
      delay(5000);
      affichage();
    }
    
    
    void codeInvalide()    // afficher le message si PWD est incorrect
    {
      password.reset();
      lcd.clear();
      lcd.setCursor(0,1);
      lcd.print(" <<INCORRECT>>");
      cpt+=1;
      delay(2000);
      digitalWrite(ALARME, LOW);
      digitalWrite(LedB, HIGH);
      delay(1000);
      affichage();
       if (cpt>=3){
         alarm();
          }
    }
    
    void affichage()    // afficher
    {
       lcd.init();// initialize the lcd   
       lcd.backlight();
       lcd.setCursor(1,0);
       lcd.print("  SMART HOUSE");
       lcd.setCursor(0,1);
       lcd.print("CODE PIN: ");
    }
    
    
    void alarm(){
      password.reset();
      statut = 1;
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print(" ALARME ACTIVEE");delay(100);
        fonctions();
      affichage();
            for(int note=2000;note>=700;note++){
            tone(buzzer,note,125);
            delay(200);
        }delay(2000);
            
    }
    
    
    void TempHum(){
      DHT.read11(dht_apin);
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("  Humid:");
      lcd.print(DHT.humidity);
      lcd.print("%");
      //si l'humidity est inferieur 15% declencher le systeme de chauffage
       if((DHT.humidity) > 75.0){
        chauffage();
      }else{Serial.println("Taux d'Humidite Normal");}
      lcd.setCursor(0,1);
      lcd.print("  Temp:");
      lcd.print(DHT.temperature);
      lcd.print("C");
      //si la temperature est superieure a 24°c declencher la ventillation
      if((DHT.temperature) > 27.0){
        ventillation();
      }else{Serial.println("Temperature Normale");}
      delay(1000);  
    }
    
    void flame(){
      int FIRE=digitalRead(FLAME); //lire le flamme
      if(FIRE==HIGH){
      digitalWrite(ALARME,HIGH);
      Serial.println("FIRE FIRE FIRE!!!");
      lcd.clear();
      statut=1;
      lcd.setCursor(0,1);   
      lcd.print("Attention !!");            
      lcd.setCursor(1,0);           
      lcd.print("!!   Feu   !!");
      alarm();          
      delay(500);    
      }else{
        Serial.println("flame: NORMAL");  
      }
      delay(200);
    }
    
    void chauffage(){
      Serial.println("le chauffage est en marche");
    }
    
    void ventillation(){
      Serial.println("la ventillation est en marche");
    }

    -
    Edité par SadickyDave1 26 mars 2019 à 9:05:16

    • Partager sur Facebook
    • Partager sur Twitter
      21 mars 2019 à 15:54:55

      alors utilise le bouton </> de l'éditeur pour le code, c'est plus lisible.

      Sinon pour ton problème tu peux désactiver l'alarme après x secondes. En gros quand tu détectes le problème tu réinitialise un timer qui va compter x temps avant de s'éteindre  

      • Partager sur Facebook
      • Partager sur Twitter

      la connaissance est une chose qui ne nous appauvrit pas quand on la partage.

      Mon GitHub

        26 mars 2019 à 8:50:06

        merci ox223252. je veux essayer d'abord
        • Partager sur Facebook
        • Partager sur Twitter

        Arduino DOMOTIQUE

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown