creation d'une alarme

bonjour je suis entrain de crée une alarme pour mon chalet

elle fonctionne appart un pti problème

  1. je l’enclenche "tout vas bien ";

  2. je déclenche un détecteur "tout vas bien"

  3. je l’arrête "tout vas bien"
    4) je la réarme """"" elle me réenclenche la tempo de capteur avant sirène """" !!!!!!!!!!!

  4. je la re désactive "tout vas bien"

  5. je la réarme "tout est redevenue parfait"

pour palier a ce problème j'ai ajouter :

void software_Reset()
{
  asm volatile ("  jmp 0"); 
}

a la désactivation de l'alarme "depuis plus de problème "

mais je trouve sa LIMITE

avez vous une idée ???

#include <SPI.h>
#include <MFRC522.h>

#define SS_PIN 53
#define RST_PIN 5

#define NOTE_DO 261
#define NOTE_RE 293
#define NOTE_MI 329
#define NOTE_FA 349
#define NOTE_SOL 392
#define NOTE_LA 440
#define NOTE_SI 493
#define NOTE_FA6 2793
#define NOTE_SOL6 3135

// bouton mise en marche
const int port_boutonOn = 2; //mise en marche de l'alarme
int etat_boutonOn = LOW;  //etat du bouton

//capteur
const int port_capteurPorte  = 10; //capteur
int etat_capteurPorte = 0;
int capteurPorte = LOW;  //etat du capteur

const int port_capteurMouv  = 6; //capteur
int etat_capteurMouv = 0;
int capteurMouv = LOW;  //etat du capteur


int timeOn = 5;
int timeCapteur = 5;

int timeSirene = 5;

//etat alarme origine
int etat_alarme = 0;

//liste des clef  nom[]={xxx,xxx,xxx,xxx};
int bluetag[]={xxx,xxx,xxx,xxx}; // masquer pour demande d'aide
int whitetag[]={xxx,xxx,xxx,xxx};// masquer pour demande d'aide


MFRC522 mfrc522(SS_PIN, RST_PIN);  
int correct=0;

void setup() {
        Serial.begin(9600);    
        SPI.begin();   
        mfrc522.PCD_Init();  
        pinMode(port_boutonOn, INPUT); //declare le bouton
        pinMode(port_capteurPorte, INPUT); //declare le capteur de porte
        pinMode(port_capteurMouv, INPUT); //declare le capteur de mouvement
        Serial.println("Alarme Neomega:");
}


void loop() {
 


  //
   etat_boutonOn = digitalRead(port_boutonOn);
   //pour allumer l'alarme on appui sur le boubon
  if(etat_boutonOn == HIGH){
    etat_alarme = 1;
    Serial.print("etat_alarme:");
    Serial.println(etat_alarme);
  }
  

  //si l'alarme est allumer
  if(etat_alarme == 1){
    rfid();
    digitalWrite(13,HIGH); // on allume la led pour indiquer alarme ON
    Serial.print("alarme initialise:");
    tempoOn(); //on lance la tempoOn pour sortir de la maison 
     
    
  }
 





}

/******************************************* tempoOnRISATION D'ALLUMAGE  **************************************************************/
void tempoOn(){
  int i = 0;
  while( i<timeOn && etat_alarme ==1){ 
      tone(8, 444);
      delay(500);
       rfid();
      noTone(8);
      delay(500);
      rfid();
      i++;
      Serial.print("tempo allumage =" );
      int temp = i - timeOn ;
      Serial.println(temp);
     if(i == timeOn){
        Serial.print("alarme ON !!!!" );
     }
  }
  alarme_on(); // la tempoOn est fini on scrute les capteurs
    
}

/******************************************* ALARME ON  **************************************************************/
void alarme_on(){
  while(etat_alarme == 1){
    digitalWrite(3,HIGH);
    rfid();
   
   if(capteurPorte == HIGH){
      etat_capteurPorte = 1;                    
    }
    if(capteurMouv == HIGH){
      etat_capteurMouv = 1;                    
    }
    
    capteurPorte = digitalRead(port_capteurPorte);
    capteurMouv = digitalRead(port_capteurMouv);

        
    if(etat_capteurPorte == 1){
      tempoCapteurPorte();
           
    }
    if(etat_capteurMouv == 1){
      Serial.println(capteurMouv);
      tempoCapteurMouv();
           
    }
  }                     
}
/******************************************* ALARME OFF **************************************************************/

void alarme_off(){
  etat_alarme = 0;
  etat_capteurPorte = 0;
  etat_capteurMouv = 0;
  digitalWrite(3,LOW);
  digitalWrite(4,LOW);
  Serial.print("etat alarme :");
    Serial.println(etat_alarme);
  Serial.print("etat capteru porte :");   
    Serial.println(etat_capteurPorte); 
  Serial.print("etat capteur mouv :");
    Serial.println(etat_capteurMouv);   
 Serial.println("alarme off:");
 delay(2000);
 software_Reset();
}



/****************************************** TEMPO CAPTEUR ************************************************************/


void tempoCapteurPorte(){

 int i = 0;
  while( i<timeCapteur && etat_capteurPorte ==1){ 
      Serial.println("alarme porte:");
      tone(8, NOTE_SOL);
      delay(500);
       rfid();
      noTone(8);
      delay(500);
      rfid();
      i++;
  }
  sirene();
}

void tempoCapteurMouv(){

 int i = 0;
  while( i<timeCapteur && etat_capteurMouv == 1){ 
      Serial.println("alarme radar:");
      tone(8, NOTE_SOL6);
      delay(500);
       rfid();
      noTone(8);
      delay(500);
      rfid();
      i++;
  }
  sirene();
}






/******************************************* LECTEUR RFID  **************************************************************/

void sirene(){
  int i = 0;
  while(i<20 && etat_alarme == 1){
    tone(8, NOTE_DO);
      delay(60);
      digitalWrite(4,HIGH);
       rfid();
       noTone(8);
       delay(NOTE_SI);
       rfid();
       digitalWrite(4,LOW);
 
  }
}


void rfid(){

 
        if ( ! mfrc522.PICC_IsNewCardPresent()) return;
        if ( ! mfrc522.PICC_ReadCardSerial())   return;
        Serial.println("Card UID:");
        for (byte i = 0; i < mfrc522.uid.size; i++) {
          Serial.println(mfrc522.uid.uidByte[i]);            
        } 
        for(int a=0; a<4; a++){
          if(mfrc522.uid.uidByte[a]==bluetag[a]){
            correct++;
            Serial.println(correct);
          }else if(mfrc522.uid.uidByte[a]==whitetag[a]){
            // correct+=2;
            correct++;
          }else if(correct<5 && mfrc522.uid.uidByte[a] != bluetag[a]){ 
            correct=0;
            Serial.println(correct);
          }else{
    
          }
        }// end for 

        if(correct==4){
          Serial.println("Access Autorise");
          
          tone(8, NOTE_DO); 
            delay(150);
            noTone(8);
            delay(60);
         tone(8, NOTE_RE); 
           delay(150);
           noTone(8);
           delay(60);
           tone(8, NOTE_MI); 
           delay(150);
           noTone(8);
           delay(60);
           tone(8, NOTE_SOL); 
           delay(150);
           noTone(8);
           delay(60);
           alarme_off();
     
           correct=0;
           
       }else{
        Serial.println("Access Denied");
           
                            tone(8, NOTE_DO); 
                            delay(140);
                            noTone(8);
                            delay(60);
                            tone(8, NOTE_DO); 
                            delay(140);
                            noTone(8);
                            delay(60);
                            tone(8, NOTE_DO); 
                            delay(140);
                            noTone(8);
                            digitalWrite(A1,LOW);
        correct=0;
        }

        
        delay(400);

}

void software_Reset()
{
  asm volatile ("  jmp 0"); 
}

je suis débutant et surtout preneur pour toute amélioration du code

merci par avance

up

as tu vérifié l'état du capteur avant le réarmement ?est-il bien à 0?

sachant qu'une fonction terminée retourne à son appelant.

tu armes, tu surveilles la porte, tu passes en tempo_porte suite à intrusion.

pendant la tempo tu lis le rfid et si il a été présenté, tu va dans alarm off, et à la sortie de alarm off, tu retournes dans la tempo qui est a l'origine de cet appel mais qui n'a pas fini d'incrémenter sa variable i

donc, après avoir présente ton badge, tu retournes dans la tempo_porte.

dans alarm off ajoute un flag "alarm annulée"=1
et dans tempo force la sortie si le flag =1

Bonsoir ,

Peut etre que je me trompe mais comparé un temps avec une incrementation de variable ne peut pas faire l ' affaire , d' ailleurs le compilateur devrait au moins affiché un avertissement voire une erreur .

void tempoCapteurPorte(){

 int i = 0;
  while( i<timeCapteur && etat_capteurPorte ==1){
      Serial.println("alarme porte:");
      tone(8, NOTE_SOL);
      delay(500);
       rfid();
      noTone(8);
      delay(500);
      rfid();
      i++;
  }
  sirene();
}

plutot que de faire cela tu devrais utiliser la fonction : " millis() " declarer une variable globale ; temps_lancement_debut_alarme de type unsigned long ( de memoire a verifier ) .

puis faire :

while ( ( (temps_lancement_debut_alarme - millis() ) < timeCapteur ) && etat_capteurPorte ==1) {

avec time capteur en milliseconde et ca devrait aller mieux .

dans le code, time_Capteur est une variable qui est initialisée à 5 au départ.
ensuite il s'en sert pour que la fonction appelée fasse 5 fois ce qu'ellle à a faire.
il n'y a aucune notion de temps

Bonjour , autant pour moi alors ....

le nom de la variable et le nom de la fonction pretent a confusion , j ' ai lu le code rapidos d' ou mon erreur . :confused:

Bonjour iznobe,

ton alarme semble inintéressante,est il possible d'en savoir plus, (photo, mode d'emploi, fonctionnement, materiel employé, code finale...) s'il te plait ?

merci
quelqu'un qui vient de se faire cambrioler... >:(