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 !