Bonjour/bonsoir à toutes et à tous,
au titre, vous auriez deviné que je m'essaye à monter une alarme grâce à Arduino. J'ai déjà un modèle fonctionnel avec un keypad (sur lequel j'avais fait un topic d'aide), et j'aimerais maintenant l'étendre à l'utilisation avec une télécommande. Voilà où je rencontre donc mon problème :
le code entré par la télécommande n'est pas reconnu valable par le programme, je pense que cela est dû à une histoire de paramètre dans la fonction ProcessNumberKey qui vérifie permet de lancer ou non le check du mot de passe par la fonction checkpassword. Voici donc la fonction ProcessNumberKey:
void processNumberKey(char key) { //vérification du mot de passe
Serial.println(key);
currentPasswordLength++;
password.append(key);
if (currentPasswordLength == maxPasswordLength) {
checkPassword();
}
}
Etant donné qu'elle est ma seule fonction qui utilise un paramètre "key", je suppose que là est mon problème, et je n'ai pas su comprendre quel était le paramètre à rentrer pour que la télécommande soit "vérifiée".
En cas où le problème serait tout autre, je met mon programme entier ci-dessous:
#include <Keypad.h>
#include <Password.h>
#include <IRremote.h>
//les pin 2 à 9 sont prises par le keypad, 12et 13 pour le circuit d'alarme, la 10 pour l'IF
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;
const char DIN_RECEPTEUR_INFRAROUGE = 10;
IRrecv recepteur(DIN_RECEPTEUR_INFRAROUGE);
decode_results results;
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);
recepteur.enableIRIn();
recepteur.blink13(true);
}
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();
//Affiche la touche saisie
if (recepteur.decode(&results))//pour la télécommande
{
if(results.value==0xFFA25D){ //ON/OFF
Serial.println("ON/OFF");}
if(results.value==0xFF906F){ //-
Serial.println("+/reset");
resetPassword();
}
if(results.value==0xFFA857){ //+
Serial.println("-/check");
checkPassword();
}
if(results.value==0xFF6897){ //0
Serial.println("0");
currentPasswordLength++;
password.append(key);
if (currentPasswordLength == maxPasswordLength) {
checkPassword();
} ;
}
if(results.value==0xFF30CF){ //1
Serial.println("1");
currentPasswordLength++;
password.append(key);
if (currentPasswordLength == maxPasswordLength) {
checkPassword();
} ;
}
if(results.value==0xFF18E7){ //2
Serial.println("2");
currentPasswordLength++;
password.append(key);
if (currentPasswordLength == maxPasswordLength) {
checkPassword();
} ;
}
if(results.value==0xFF7A85){ //3
Serial.println("3");
currentPasswordLength++;
password.append(key);
if (currentPasswordLength == maxPasswordLength) {
checkPassword();
} ;
}
if(results.value==0xFF10EF){ //4
Serial.println("4");
currentPasswordLength++;
password.append(key);
if (currentPasswordLength == maxPasswordLength) {
checkPassword();
} ;
}
if(results.value==0xFF38C7){ //5
Serial.println("5");
currentPasswordLength++;
password.append(key);
if (currentPasswordLength == maxPasswordLength) {
checkPassword();
} ;
}
if(results.value==0xFF5AA5){ //6
Serial.println("6");
currentPasswordLength++;
password.append(key);
if (currentPasswordLength == maxPasswordLength) {
checkPassword();
} ;
}
if(results.value==0xFF42BD){ //7
Serial.println("7");
currentPasswordLength++;
password.append(key);
if (currentPasswordLength == maxPasswordLength) {
checkPassword();
} ;
}
if(results.value==0xFF4AB5){ //8
Serial.println("8");
currentPasswordLength++;
password.append(key);
if (currentPasswordLength == maxPasswordLength) {
checkPassword();
} ;
}
if(results.value==0xFF52AD){ //9
Serial.println("9");
currentPasswordLength++;
password.append(key);
if (currentPasswordLength == maxPasswordLength) {
checkPassword();
} ;
}
delay(500);
recepteur.resume();
}
if (key != NO_KEY){
delay(60);
switch (key){
case '#': checkPassword(); break;
case '*': resetPassword(); break;
default: processNumberKey(key);
}
}
if (alarmeOK == 1){
Serial.println("Veuillez entrer le mot de passe.");
t_start=millis();
t_end = t_start+6000;
while (t_start<t_end){
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;
}
Je vous remercie de votre réponse,