Alarme maison avec arduino nano et HC-SR501

Bonjour à tous,

Tout d'abord c'est mon premier post sur le forum donc s'il n'est pas au bon endroit, n'hésitez pas à me le faire savoir.

Alors voilà, j'ai eu comme projet de créer une alarme pour chez mes parents à partir d'un arduino nano.
Plusieurs acteur entre en jeux pour ce système.

  • Un clavier 4x4 qui me permet de renseigner le code afin d'activer ou non l'alarme.
  • 3 Capteur HC-SR501 pour la détection de mouvement
  • Un relais pour le buzzer
  • Un batterie avec chargeur pour l'alimentation du système
  • Une led pour indiquer si l'alarme est activé ou non

J'ai au préalable testé mon sytème avec un seul capteur. Tout fonctionnait correctement. Lorsque que j'ai mis plusieurs capteur en série, un premier problème est apparu. En effet lorsque qu'un mouvement est détecté, il es sensé renvoyer 3.3V, mais là avec deux capteur il envoyé seulement 1.65V et avec 3 capteur 1.1V. J'ai compris que si un capteur sur 3 envoyé 3.3v et les autres 0V, en entrée de l'arduino, je n'avait que (3.3+0+0)/3 donc 1.1V.
Pour y remédier j'ai mis une diode en sortie de chaque capteur. Problème réglé !
Malheureusement depuis, lorsque aucun capteur activé, au lieux d'avoir 0V, j'ai environ 1V (Pourquoi ?).

Dans mon programme, la loop principal est en attente d'un appuie sur une touche du claiver.
L'entrée correspondant aux capteur est sur la pin digital 2 pour pouvoir utiliser les interruption externe(que je découvre avec ce projet).Cette interruption viens stoper la boucle d'attente d'un appuie sur la clavier pour lancer une minuterie (MsTimer2) qui est le laps de temps permettant d'écrire le code avant que l'alarme ne sonne via l'appel de la fonction "alarm_on".

SAUF que l'interruption s'active même à 1V ! Alors que d'après les doc des arduino nano, elle ne devrait s'activer qu'a 1.5V.

Donc si quelqu'un a une solution pour régler le problème des 1V résiduel ou de l'interruption, je suis preneur.

Cela fait un moment que je suis sur ce projet et je pensais finir par y arriver mais la je sature de ne plus avancer !

Voici le montage

Voici le code

#include <MsTimer2.h>

#include <Key.h>         // Biblio pour clavier
#include <Keypad.h>      // Idem

#define capteur_mouvement 2 // Pin du/des capteur(s) de mouvement

#define relais 13 //Pin du relais de l'alarme
#define led 12 // Pin + de la LED
/*#####################*/
   String mdp ="1";
/*#####################*/

String alarme="ON";

String caractere,code_courant,mouvement;
int nb_essai=0;
int temps_pour_partir = 10000; //Temps en ms
int temps_pour_mettre_code = 5000; //Temps en ms
const byte LIGNES = 4; //4 Lignes
const byte COLONNES = 4; //4 Colonnes
//Définition des symbole sur le clavier
char hexaKeys[LIGNES][COLONNES] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
byte LignesPins[LIGNES] = {6, 5, 4, 3}; //Connecter les sorties des lignes du clavier (blanc)
byte ColonnesPins[COLONNES] = {10, 9, 8, 7}; //Connecter les sorties des colonnes du clavier (noir)

// Initialise un instant de classe de NewKeypad
Keypad customKeypad = Keypad( makeKeymap(hexaKeys), LignesPins, ColonnesPins, LIGNES, COLONNES); 

void setup() 
{
  pinMode(capteur_mouvement,INPUT);
  pinMode(relais,OUTPUT);
  pinMode(led,OUTPUT);
  attachInterrupt(digitalPinToInterrupt(capteur_mouvement),detection_mouvement,CHANGE); //détecte un changement d'état                                                                     //sur le signal du capteur
  Serial.begin(9600);
  MsTimer2::set(temps_pour_mettre_code, alarme_on); // 5s period
  Serial.println("################DEBUT################");
  digitalWrite(led,HIGH);
 
}

void loop()
{
  
  char customKey = customKeypad.getKey();
  if (customKey) // Si une touche est appuyé
  {
        detachInterrupt(digitalPinToInterrupt(capteur_mouvement));
        if (String(customKey)!="#") // Si la touche n'est pas #
        {
              caractere=String(customKey);          //On lit la touche appuyé
              code_courant=code_courant+caractere;  // On l'ajoute à l'ensemble du code courant
              Serial.print("mdp=");         //On l'affiche sur le moniteur serie
              Serial.println(code_courant);
        }
        
        else // Si c'est la touche # qui est appuyé
         {
              Serial.print("Mot de passe final :");
              Serial.println(code_courant);
        
              if (code_courant==mdp) // Si le code est bon
              {
                    digitalWrite(relais,LOW);
                    nb_essai=0;
                    MsTimer2::stop();
                    Serial.println("Mot de passe valide");
                    code_courant="";
                    if (alarme == "ON")
                    {
                        Serial.println("Alarme désactivé");
                        digitalWrite(led,LOW);
                        alarme = "OFF";
                    }
                    else if (alarme == "OFF")
                    {
                        Serial.println("Alarme activé");
                        alarme = "ON";
                        digitalWrite(led,HIGH);
                        delay(temps_pour_partir);
                        attachInterrupt(digitalPinToInterrupt(capteur_mouvement),detection_mouvement,CHANGE);
                    }
              }
              
              else // Si le code est faux
              {
                    nb_essai=nb_essai+1; // On incrémente le nombre d'essai effectué
                    Serial.println("Mot de passe erroné");
                    code_courant="";            // On ré initialise le mot courant
                    
                    if (nb_essai>=3)          // Si on a déjà fait trois fois le code sans y arriver
                    {
                          Serial.println("ALARME"); // L'alarme se déclanche
                          digitalWrite(relais,HIGH);
                          alarme ="ON";
                    }
                    
                    else          // Sinon c'est qu'il reste des tentatives
                    {
                          Serial.print("Nombre de tentatives restantes avant alarme: ");
                          Serial.println(3-nb_essai);  // On affiche le nombre de tentative restante
                    }
                    attachInterrupt(digitalPinToInterrupt(capteur_mouvement),detection_mouvement,CHANGE);
             }
         }

   }
   


}
void detection_mouvement()
{
  if(digitalRead(capteur_mouvement)==HIGH)      //si le signal est à l'état haut
  {  
    
      mouvement="oui";
      Serial.println("Mouvement détecté");
      MsTimer2::start();
      detachInterrupt(digitalPinToInterrupt(capteur_mouvement));
  }
  else if(digitalRead(capteur_mouvement)==LOW)       //si le signal est à l'état bas
  {
      mouvement="non";
      Serial.println("Pas de mouvement détecté");  
  }

}
void alarme_on()
{
  Serial.println("fonction alarme_on");
  digitalWrite(relais,HIGH);
  attachInterrupt(digitalPinToInterrupt(capteur_mouvement),detection_mouvement,CHANGE);
  
}

Merci !