Un coup d'oeil frais pour un petit projet

Bonsoir,
je me suis lancé dans une petite alarme à “détection de mouvement”, pour une maquette de jeu. J’utilise donc un bouton pressoir à la place d’un émetteur IF. Même si de nombreux programmes tout chauds sont dispos sur le net, je tiens à finir celui que j’ai commencé ; mais voilà que je bloque sur l’activation/désactivation de l’alarme.
J’utilise une variable alarmestatut pour allumer l’alarme et alarmeOK sert pour le déclenchement.
Pour le code" (veuillez excusez cet horrible enchainement de digitalwrite à la fin, mais je n’ai pas su retrouver comment faire une répétition!):

#include <Keypad.h>
#include <Password.h>


int alarmeOK= 0; //0 alarme non activée, 1=alarme activée, intrus!
int alarmestatut = 0; //0=alarme étieite, 1=alarme allumée




String newPasswordString; 
char newPassword[4]; //mot de passe avec 4 caractères
Password password = Password( "1748" );
byte maxPasswordLength = 4; 
byte currentPasswordLength = 0;

const byte ROWS = 4; //4 lignes
const byte COLS = 4; //4 colonnes
char keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
//Brancher le clavier sur 2 3 4 5 (colonnes) et 6 7 8 9 (lignes)
byte rowPins[ROWS] = {9, 8, 7, 6}; //Lignes
byte colPins[COLS] = {5, 4, 3, 2}; //Colonnes
// Connections des touches
/*
S1  contact 4 8
S2  contact 3 8
S3  contact 2 8
S4  contact 1 8
S5  contact 4 7
S6  contact 3 7
S9  contact 4 6
S10  contact 3 6
S11  contact 2 6
S12  contact 1 6
S13  contact 4 5
S14  contact 3 5
S15  contact 2 5
S16  contact  1 5
*/

// Initialiser une instance de la classe keypad
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
void setup(){
  Serial.begin(9600);   //Serial monitor
  Serial.println("Test de clavier 16 touches");

  pinMode(1,INPUT);
  pinMode(13,OUTPUT);
  // Pour activer l'état HOLD
  unsigned int time_hold = 4;
  keypad.setHoldTime(time_hold);
  
  //Anti rebond
  unsigned int time_anti_rebond = 4;  //4 ms
  keypad.setDebounceTime(time_anti_rebond);
    
}

void resetPassword() {
   password.reset(); 
   currentPasswordLength = 0; 
}

void checkPassword() { 
   if (password.evaluate()){ //si le mdp est bon,
      Serial.println(" OK.");
      if(alarmeOK == 0 && alarmestatut == 0){
        alarmestatut = 1;//alarme op
        resetPassword();
        //Serial.println("edd");
        active();       
      }
      if((alarmeOK == 1 && alarmestatut == 1)){
        resetPassword();
        desactive();
        //Serial.print("chec3k");  
      }
   }
   else {
    Serial.println(" Mauvais mot de passe !");
    resetPassword();
   }
}

void desactive(){ //tout est désactivé
  alarmestatut = 0;
  Serial.println("SYSTEME DESACTIVE");
  alarmeOK = 0;
  resetPassword();
  
}

void active(){//l'alarme est opérationelle(alarmestatut=1)
  Serial.println("SYSTEME ACTIVE");
  //Serial.println("fefe");
  //Serial.println(digitalRead(1));
  if (alarmestatut=1){ 
    if((digitalRead(1)==HIGH)){
      alarmeOK = 1;
      //Serial.println("ala");
      //Serial.println(alarmeOK);
      //Serial.println(alarmestatut);
      delay(5000);   
    }
  }
}//fin active

void processNumberKey(char key) { //vérification du mot de passe
   Serial.println(key);
   currentPasswordLength++;
   password.append(key);
   if (currentPasswordLength == maxPasswordLength) {
      checkPassword();
   } 
}

void loop(){
  char key = keypad.getKey();

  if (key != NO_KEY){ 
      delay(60); 
      switch (key){
      case '#': checkPassword(); break;
      case '*': resetPassword(); break;
      default: processNumberKey(key);
      }
       //Affiche la touche saisie
  }
  //Serial.println(alarmeOK);
  if (alarmeOK == 1){
    delay(6000);//attente de 6sec afin de pouvoir rentrer le code
     intrus();
  }//if alarmOk
}//voidloop


void intrus(){
  Serial.println("Intrus détecté.");
  digitalWrite(13,LOW);
  delay(10);
    digitalWrite(13,HIGH);
  delay(100);
  digitalWrite(13,LOW);
  delay(10);
    digitalWrite(13,HIGH);
  delay(100);
  digitalWrite(13,LOW);
  delay(10);
    digitalWrite(13,HIGH);
  delay(100);
  digitalWrite(13,LOW);
  delay(10);
    digitalWrite(13,HIGH);
  delay(100);
  digitalWrite(13,LOW);
  delay(10);
    digitalWrite(13,HIGH);
  delay(100);
  digitalWrite(13,LOW);
  delay(10);
    digitalWrite(13,HIGH);
  delay(100);
  digitalWrite(13,LOW);
  delay(10);
    digitalWrite(13,HIGH);
  delay(100);
  digitalWrite(13,LOW);
  delay(10);
    digitalWrite(13,HIGH);
  delay(100);
  digitalWrite(13,LOW);
  delay(10);
    digitalWrite(13,HIGH);
  delay(100);
  digitalWrite(13,LOW);
  delay(10);
    digitalWrite(13,HIGH);
  delay(100);
  digitalWrite(13,LOW);
  delay(10);
    digitalWrite(13,HIGH);
  delay(100);
  digitalWrite(13,LOW);
  delay(10);
    digitalWrite(13,HIGH);
  delay(100);
  digitalWrite(13,LOW);
  delay(10);
    digitalWrite(13,HIGH);
  delay(100);
  digitalWrite(13,LOW);
  delay(10);
    digitalWrite(13,HIGH);
  delay(100);
  digitalWrite(13,LOW);
  delay(10);
    digitalWrite(13,HIGH);
  delay(100);
  digitalWrite(13,LOW);
  delay(10);
    digitalWrite(13,HIGH);
  delay(100);
  digitalWrite(13,LOW);
  delay(10);
    digitalWrite(13,HIGH);
  delay(100);
  digitalWrite(13,LOW);
  delay(10);
    digitalWrite(13,HIGH);
  delay(100);
  digitalWrite(13,LOW);
  delay(10);
    digitalWrite(13,HIGH);
  delay(100);
  digitalWrite(13,LOW);
  delay(10);
    digitalWrite(13,HIGH);
  delay(100);
  digitalWrite(13,LOW);
  delay(10);
    digitalWrite(13,HIGH);
  delay(100);
  digitalWrite(13,LOW);
  delay(10);
    digitalWrite(13,HIGH);
  delay(100);
  digitalWrite(13,LOW);
  delay(10);
    digitalWrite(13,HIGH);
  delay(100);
  digitalWrite(13,LOW);
  delay(10);
    digitalWrite(13,HIGH);
  delay(100);
  digitalWrite(13,LOW);
  delay(10);
    digitalWrite(13,HIGH);
  delay(100);
  digitalWrite(13,LOW);
  delay(10);
    digitalWrite(13,HIGH);
  delay(100);
  digitalWrite(13,LOW);
  delay(10);
    digitalWrite(13,HIGH);
  delay(100);
  digitalWrite(13,LOW);
  delay(10);
    digitalWrite(13,HIGH);
  delay(100);
  digitalWrite(13,LOW);
  delay(10);
    digitalWrite(13,HIGH);
  delay(100);
  digitalWrite(13,LOW);
  delay(10);
    digitalWrite(13,HIGH);
  delay(100);
  digitalWrite(13,LOW);
  delay(10);
    digitalWrite(13,HIGH);
  delay(100);
  digitalWrite(13,LOW);
  delay(10);
    digitalWrite(13,HIGH);
  delay(100);
  digitalWrite(13,LOW);
  delay(10);
    digitalWrite(13,HIGH);
  delay(100);
  digitalWrite(13,LOW);
  delay(10);
    digitalWrite(13,HIGH);
  delay(100);
  digitalWrite(13,LOW);
  delay(10);
    digitalWrite(13,HIGH);
  delay(100);
  digitalWrite(13,LOW);
  delay(10);
    digitalWrite(13,HIGH);
  delay(100);
  digitalWrite(13,LOW);
  delay(10);
    digitalWrite(13,HIGH);
  delay(100);
  digitalWrite(13,LOW);
  delay(10);
    digitalWrite(13,HIGH);
  delay(100);
  digitalWrite(13,LOW);
  delay(10);
    digitalWrite(13,HIGH);
  delay(100);
  digitalWrite(13,LOW);
  delay(10);
    digitalWrite(13,HIGH);
  delay(100);
  digitalWrite(13,LOW);
  delay(10);
    digitalWrite(13,HIGH);
  delay(100);
  digitalWrite(13,LOW);
  delay(10);
    digitalWrite(13,HIGH);
  delay(100);
  digitalWrite(13,LOW);
  delay(10);
    digitalWrite(13,HIGH);
  delay(100);
  digitalWrite(13,LOW);
  delay(10);
    digitalWrite(13,HIGH);
  delay(100);
  digitalWrite(13,LOW);
  delay(10);
    digitalWrite(13,HIGH);
  delay(100);
  digitalWrite(13,LOW);
  delay(10);
    digitalWrite(13,HIGH);
  delay(100);
  digitalWrite(13,LOW);
  delay(10);
    digitalWrite(13,HIGH);
  delay(100);
  digitalWrite(13,LOW);
  delay(10);
  alarmestatut=1;
  alarmeOK=1;
}

Il reste sûrement des balises de print que j’ai perdu, mais j’ai trouvé la source de mon problème sans savoir le résoudre:

le moniteur série m’affiche alarmeOK=1 dans checkpassword, à ce niveau

if(alarmeOK == 0 && alarmestatut == 0){
        alarmestatut = 1;//alarme op
        resetPassword();
        //Serial.println(arlarmeOK);
        active();

c’est donc que dans la fonction active,

if((digitalRead(1)==HIGH)){
      alarmeOK = 1;

digitalRead reçoit un signal à la borne. Cependant aucune pression n’est exercée sur le bouton. Pourquoi y aurait-il une tension aux bornes du bouton ?
J’y joins le montage.

Je vous remercie de votre lecture et de vos futures réponses !

Capture.JPG

le problème vient probablement du fait qu’il faut éviter d’utiliser les pins 0 et 1 car elles ont aussi les fonctions RX/TX utilisées par ailleurs par Serial…

Si tu utilises, par exemple, la pin 12 en lieu et place de la 1, ça devrait aller mieux.

D’autre part, pour éviter les digitalWrite en cas d’activation de l’alarme, une simple boucle fera l’affaire:

for (uint32_t i=0; i<10; i++) {
digitalWrite(LED_BUILTIN, LOW);
delay(10);
digitalWrite(LED_BUILTIN, HIGH);
delay(100);
}

Merci pour la boucle, mais la pin12 n'est apparement pas le seul soucis, le programme ne rentre pas dans cette condtition, dans la fonction active :

if((digitalRead(12)==HIGH)){
      alarmeOK = 1;
      Serial.println(alarmeOK);

Le format fritzing n'était pas compatible, j'ai donc mis une capture en pièce jointe du premier post pour le montage (le bouton est toujours connecté à la PIN 1 sur le schéma, je l'ai déplacé à la broche 12).

vous êtes sûr que les bonnes pins de votre bouton sont connectées? (suivant l'orientation du bouton) le mieux est de mettre votre bouton connectée à la pin en INPUT_PULLUP (pour le pinMode) et l'autre côté du bouton connecté à GND. pas besoin de résistance supplémentaire. dans ce cas quand le bouton est pressé le digitalRead() retourna LOW sinon il dit HIGH (à cause du pull up)

oui, c’est correct, j’ai pu trouver une solution à mon problème ; au niveau de la fonction checkPassword, qui lisait les deux boucles if à la suite, l’état de l’alarme (avec alarmeOK et alarmestatut) qui était réinitialisé. J’ai au passage rajouté un timer de 6sec avant le déclenchement de la sirène pour permettre de rentrer le code.
Il me reste quelques ajouts à faire, mais voici le code:

  #include <Keypad.h>
#include <Password.h>


int alarmeOK= 0; //0 alarme non activée, 1=alarme activée, intrus!
int alarmestatut = 0; //0=alarme étieite, 1=alarme allumée
unsigned long t_start=millis();
unsigned long t_end=0;





String newPasswordString; 
char newPassword[4]; //mot de passe avec 4 caractères
Password password = Password( "1748" );
byte maxPasswordLength = 4; 
byte currentPasswordLength = 0;

const byte ROWS = 4; //4 lignes
const byte COLS = 4; //4 colonnes
char keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
//Brancher le clavier sur 2 3 4 5 (colonnes) et 6 7 8 9 (lignes)
byte rowPins[ROWS] = {9, 8, 7, 6}; //Lignes
byte colPins[COLS] = {5, 4, 3, 2}; //Colonnes
// Connections des touches
/*
S1  contact 4 8
S2  contact 3 8
S3  contact 2 8
S4  contact 1 8
S5  contact 4 7
S6  contact 3 7
S9  contact 4 6
S10  contact 3 6
S11  contact 2 6
S12  contact 1 6
S13  contact 4 5
S14  contact 3 5
S15  contact 2 5
S16  contact  1 5
*/

// Initialiser une instance de la classe keypad
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
void setup(){
  Serial.begin(9600);   //Serial monitor
  Serial.println("Test de clavier 16 touches");

  pinMode(12,INPUT);
  pinMode(13,OUTPUT);
  // Pour activer l'état HOLD
  unsigned int time_hold = 4;
  keypad.setHoldTime(time_hold);
  
  //Anti rebond
  unsigned int time_anti_rebond = 4;  //4 ms
  keypad.setDebounceTime(time_anti_rebond);
    
}

void resetPassword() {
   password.reset(); 
   currentPasswordLength = 0; 
}

void checkPassword() { 
   if (password.evaluate()){ //si le mdp est bon,
      Serial.println(" OK.");
      if(alarmeOK == 0 && alarmestatut == 0){
        alarmestatut = 1;//alarme op
        resetPassword();
        active();
        return;       
      }
      if((alarmeOK == 0 && alarmestatut == 1)){
        resetPassword();
        desactive();
        return;
      }
      if((alarmeOK == 1 && alarmestatut == 1)){
        resetPassword();
        desactive();
        return;
      }
   }
   else {
    Serial.println(" Mauvais mot de passe !");
    resetPassword();
   }
}

void desactive(){ //tout est désactivé
  alarmestatut = 0;
  Serial.println("SYSTEME DESACTIVE");
  alarmeOK = 0;
  resetPassword();
  
}

void active(){//l'alarme est opérationelle(alarmestatut=1)
  Serial.println("SYSTEME ACTIVE");
  if (alarmestatut=1){ 
    while((digitalRead(12)==LOW)) {};
      alarmeOK = 1;
    }
  
}//fin active

void processNumberKey(char key) { //vérification du mot de passe
   Serial.println(key);
   currentPasswordLength++;
   password.append(key);
   if (currentPasswordLength == maxPasswordLength) {
      checkPassword();
   } 
}

void loop(){
  char key = keypad.getKey();

  if (key != NO_KEY){ 
      delay(60); 
      switch (key){
      case '#': checkPassword(); break;
      case '*': resetPassword(); break;
      default: processNumberKey(key);
      }
       //Affiche la touche saisie
  }
  if (alarmeOK == 1){
    t_start=millis();
    t_end = t_start+6000;
    while (t_start<t_end){
      t_start=millis();
      key=keypad.getKey();
      if (key != NO_KEY){
        switch (key){
        case '#': checkPassword(); break;
        case '*': resetPassword(); break;
        default: processNumberKey(key);
        return; 
         }
      }
    }//attente de 6sec afin de pouvoir rentrer le code
     intrus();//sinon activation de l'alarme
  }//if alarmOk
}//voidloop


void intrus(){
  Serial.println("Intrus détecté.");
  for (uint32_t i=0; i<10; i++) {
      digitalWrite(LED_BUILTIN, HIGH);
      delay(100);
      digitalWrite(LED_BUILTIN, LOW);
      delay(10);
    }
  alarmestatut=1;
  alarmeOK=0;
}