Système de coffre fort

Bonjour

J’ouvre ce nouveau topic pour demander de l’aide sur l’un de mes nouveaux projets. C’est un système de coffre fort (Clavier matriciel 4*4(keypad), écran lcd, buzzer, et servo-moteur).

Voici le code :

#include <LiquidCrystal.h> //inclure les bibliothèques
#include <Keypad.h>
#include <Servo.h>

LiquidCrystal lcd (2, 3, 4, 5, 11, 12); //pin écran lcd


char* password = "8467";  //définir code
int position = 0;  //sert à stocker le nombre de chiffre a appuyé
const byte ROWS = 4; //4lignes
const byte COLS = 4; //4 colonnes
char keys[ROWS][COLS] ={  //tableau contenant les touches
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'},
};

char DIO_BUZZER = 10;  //pin buzze ==10
Servo monServo;   //nom de mon servo

byte rowPins[ROWS] = {17,16,15,14};   //définition des sorties pour lignes
byte colPins[COLS] = {21,20,19,18};  //définition des sorties pour les colonnes
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
int GreenpinUnlock = 8;       //définir broche pour led
int RedpinLock = 6;

void setup() {
  
  lcd.begin (16, 2);  //définissions de l'écran lcd
  lcd.setCursor (0, 0);  //mettre curseur à 0,0
  lcd.print ("Coffre fermé");  //écrire "..."
  delay(2000);  //attendre deux secondes
  pinMode(GreenpinUnlock, OUTPUT);  //pin led en sortie
  pinMode(RedpinLock, OUTPUT);
  digitalWrite(GreenpinUnlock, LOW);  //led éteinte
  digitalWrite(RedpinLock, LOW);
  monServo.attach(9);  //pin servo == 9
  void invalidCode();  //effectuer fonction invalidCode
}

void loop() {

  char key = keypad.getKey(); //key == touche appuyé  //key prend la valuer de touche appuyé
  lcd.setCursor(0, 0);  //Mettre curseur de l'écran lcd à 0,0
  lcd.print("Code : ");  //écrire "..."

  if(int(key) =0){  //si touche appuyé est 0
    digitalWrite(GreenpinUnlock, HIGH);  //alors led verte allumée
    delay(1000);  //attendre 1 s.
    digitalWrite(GreenpinUnlock, LOW);  //éteindre led

    }
  if(key == password[position])  //si touche appuyé est égal au mot de passe
  {
   ++position;  //position + 1
   if(position == 4)  //si position est égale à 4
   lcd.setCursor (7, 0);
   lcd.print ("*");
   {
    unlockDoor();  //Faire fonction unlockDoor
     position = 0;   //position est égale à 0
   } 
         
  }
  }
  else {  //sinon
    invalidCode();  //faire fonction invalidCode
    position = 0;  //position est égale à 0
  }
 }

 void invalidCode()  //fonction invalidCode
 {
  digitalWrite(RedpinLock, HIGH);  //led rouge allumée
  tone(DIO_BUZZER, 2000, 50);  //buzzer bip
  delay(300);  //attendre 0.3 sec.
  tone(DIO_BUZZER, 2000, 100);  //buzzer bip
  delay(5000);  //attendre 5 sec;
  digitalWrite(RedpinLock, LOW);  //led rouge éteinte
  lcd.print("Code inccorect");  //écrire "..."
  monServo.write(10);  //servo, position 10
 }

void unlockDoor()  //Fonction unlockDoor
{
  digitalWrite(GreenpinUnlock, HIGH);  //led verte allumée
  delay(5000);  //attendre 5 sec.
  digitalWrite(GreenpinUnlock, LOW);  //les verte éteinte
  monServo.write(100);  //servo position 100
}

Le but de ce code est d’avoir au départ le coffre verouillé, puis quand on tapes le bon code, ça le déverouille et la led verte s’allume, mais quand c’est le mauvais code, avoir deux bip une fois que la personne à tapé quatre chiffre (et pas à chaque fois qu’elle appuie sur une touche) et la led rouge s’allume.

Problème :

Quand je met en route les système il passe directe au code faut et allume la led rouge et fait deux bip, car ils considèrent que comme je n’appuis sur aucun bouton, c’est faux. Et même quand j’essai de faire le code, rien ne se passe.

Pouvez-vous m’aider

Merci d’avance

SonKa7D5

bonjour,
tu n'aurais pas oublié un bout de code?

  if (key != NO_KEY){

http://playground.arduino.cc/Code/Keypad

NO_KEY c'est égale à aucune touche appuyé ? Si oui, oui j'ai oublié ça et je m'en vais le mettre :slight_smile:

Merci

Salut j’ai fait ce que tu m’a dit mais le problème est toujours la.

Nouveau Code :

#include <LiquidCrystal.h> //inclure les bibliothèques
#include <Keypad.h>
#include <Servo.h>

LiquidCrystal lcd (2, 3, 4, 5, 11, 12); //pin écran lcd


char* password = "8467";  //définir code
int position = 0;  //sert à stocker le nombre de chiffre a appuyé
const byte ROWS = 4; //4lignes
const byte COLS = 4; //4 colonnes
char keys[ROWS][COLS] ={  //tableau contenant les touches
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'},
};

char DIO_BUZZER = 10;  //pin buzze ==10
Servo monServo;   //nom de mon servo

byte rowPins[ROWS] = {17,16,15,14};   //définition des sorties pour lignes
byte colPins[COLS] = {21,20,19,18};  //définition des sorties pour les colonnes
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
int GreenpinUnlock = 8;       //définir broche pour led
int RedpinLock = 6;

void setup() {
  
  lcd.begin (16, 2);  //définissions de l'écran lcd
  lcd.setCursor (0, 0);  //mettre curseur à 0,0
  lcd.print ("Coffre fermé");  //écrire "..."
  delay(2000);  //attendre deux secondes
  pinMode(GreenpinUnlock, OUTPUT);  //pin led en sortie
  pinMode(RedpinLock, OUTPUT);
  digitalWrite(GreenpinUnlock, LOW);  //led éteinte
  digitalWrite(RedpinLock, LOW);
  monServo.attach(9);  //pin servo == 9
  void invalidCode();  //effectuer fonction invalidCode
}

void loop() {

  char key = keypad.getKey(); //key == touche appuyé  //key prend la valuer de touche appuyé
  lcd.clear();
  lcd.setCursor(0, 0);  //Mettre curseur de l'écran lcd à 0,0
  lcd.print("Code : ");  //écrire "..."

  if(int(key) =0){  //si touche appuyé est 0
    digitalWrite(GreenpinUnlock, HIGH);  //alors led verte allumée
    delay(1000);  //attendre 1 s.
    digitalWrite(GreenpinUnlock, LOW);  //éteindre led

    }
  if(key == password[position])  //si touche appuyé est égal au mot de passe
  {
   ++position;  //position + 1
   lcd.print ("*");
   if(position == 4)  //si position est égale à 4
   {
    unlockDoor();  //Faire fonction unlockDoor
    position = 0;   //position est égale à 0
    
   } 
         
  }
  if (key != NO_KEY){
    
  }
  else {  //sinon
    invalidCode();  //faire fonction invalidCode
    position = 0;  //position est égale à 0
  }
 }

 void invalidCode()  //fonction invalidCode
 {
  digitalWrite(RedpinLock, HIGH);  //led rouge allumée
  tone(DIO_BUZZER, 2000, 50);  //buzzer bip
  delay(300);  //attendre 0.3 sec.
  tone(DIO_BUZZER, 2000, 100);  //buzzer bip
  delay(5000);  //attendre 5 sec;
  digitalWrite(RedpinLock, LOW);  //led rouge éteinte
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Code inccorect");  //écrire "..."
  monServo.write(10);  //servo, position 10
 }

void unlockDoor()  //Fonction unlockDoor
{
  monServo.write(100);  //servo position 100
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Coffre ouvert");
  digitalWrite(GreenpinUnlock, HIGH);  //led verte allumée
  delay(5000);  //attendre 5 sec.
  digitalWrite(GreenpinUnlock, LOW);  //les verte éteinte
  
}

Voila.

Merci d’avance

Des petites choses pour commencer:

Il est normal que ton coffre se mette en erreur des le début, tu appelles la fonction invalidCode() dans le setup, c'est pas nécessaire.

Tu as pas besoin de faire des setCursor() a tout bout de champ, ni des Clear(). Le fait de faire un Clear() remets deja le curseur a 0;0. Et pareil, le Clear juste après le begin n'est pas non plus nécessaire.

Et pour finir
if (key != NO_KEY)
place le au début

Ok merci je vais faire pas mal de modification

Re salut

Bon j’ai fait quelques modifications mais le problème est resté. J’ai déplacé la ligne de code au début de la boucle loop, rien n’a changé.

Code :

#include <LiquidCrystal.h> //inclure les bibliothèques
#include <Keypad.h>
#include <Servo.h>

LiquidCrystal lcd (2, 3, 4, 5, 11, 12); //pin écran lcd


char* password = "8467";  //définir code
int position = 0;  //sert à stocker le nombre de chiffre a appuyé
const byte ROWS = 4; //4lignes
const byte COLS = 4; //4 colonnes
char keys[ROWS][COLS] ={  //tableau contenant les touches
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'},
};

char DIO_BUZZER = 10;  //pin buzze ==10
Servo monServo;   //nom de mon servo

byte rowPins[ROWS] = {17,16,15,14};   //définition des sorties pour lignes
byte colPins[COLS] = {21,20,19,18};  //définition des sorties pour les colonnes
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
int GreenpinUnlock = 8;       //définir broche pour led
int RedpinLock = 6;

void setup() {
  
  lcd.begin (16, 2);  //définissions de l'écran lcd
  lcd.print ("Coffre fermé");  //écrire "..."
  delay(2000);  //attendre deux secondes
  pinMode(GreenpinUnlock, OUTPUT);  //pin led en sortie
  pinMode(RedpinLock, OUTPUT);
  digitalWrite(GreenpinUnlock, LOW);  //led éteinte
  digitalWrite(RedpinLock, LOW);
  monServo.attach(9);  //pin servo == 9
  void invalidCode();  //effectuer fonction invalidCode
}

void loop() {

  char key = keypad.getKey(); //key == touche appuyé  //key prend la valuer de touche appuyé
  if (key != NO_KEY)
  
  lcd.clear();
  lcd.print("Code : ");  //écrire "..."

  if(int(key) =0){  //si touche appuyé est 0
    digitalWrite(GreenpinUnlock, HIGH);  //alors led verte allumée
    delay(1000);  //attendre 1 s.
    digitalWrite(GreenpinUnlock, LOW);  //éteindre led

    }
  if(key == password[position])  //si touche appuyé est égal au mot de passe
  {
   ++position;  //position + 1
   lcd.print ("*");
   if(position == 4)  //si position est égale à 4
   {
    unlockDoor();  //Faire fonction unlockDoor
    position = 0;   //position est égale à 0
    
   } 
         
  }
  
  else {  //sinon
    invalidCode();  //faire fonction invalidCode
    position = 0;  //position est égale à 0
  }
 }

 void invalidCode()  //fonction invalidCode
 {
  digitalWrite(RedpinLock, HIGH);  //led rouge allumée
  tone(DIO_BUZZER, 2000, 50);  //buzzer bip
  delay(300);  //attendre 0.3 sec.
  tone(DIO_BUZZER, 2000, 100);  //buzzer bip
  delay(5000);  //attendre 5 sec;
  digitalWrite(RedpinLock, LOW);  //led rouge éteinte
  lcd.clear();
  lcd.print("Code inccorect");  //écrire "..."
  monServo.write(10);  //servo, position 10
 }

void unlockDoor()  //Fonction unlockDoor
{
  monServo.write(100);  //servo position 100
  lcd.clear();
  lcd.print("Coffre ouvert");
  digitalWrite(GreenpinUnlock, HIGH);  //led verte allumée
  delay(5000);  //attendre 5 sec.
  digitalWrite(GreenpinUnlock, LOW);  //les verte éteinte
  
}

le if s'arrête à la 1ere ligne après, donc normal

 if (key != NO_KEY)
 
  lcd.clear();

il manque tes { }

Merci, je m’en suis aperçu et j’ai fais les modifications mais rien ne change, il s’engage directement dans la fonction UnlockDoor.

Code :

#include <LiquidCrystal.h> //inclure les bibliothèques
#include <Keypad.h>
#include <Servo.h>

LiquidCrystal lcd (2, 3, 4, 5, 11, 12); //pin écran lcd


char* password = "8467";  //définir code
int position = 0;  //sert à stocker le nombre de chiffre a appuyé
const byte ROWS = 4; //4lignes
const byte COLS = 4; //4 colonnes
char keys[ROWS][COLS] ={  //tableau contenant les touches
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'},
};

char DIO_BUZZER = 10;  //pin buzze ==10
Servo monServo;   //nom de mon servo

byte rowPins[ROWS] = {17,16,15,14};   //définition des sorties pour lignes
byte colPins[COLS] = {21,20,19,18};  //définition des sorties pour les colonnes
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
int GreenpinUnlock = 8;       //définir broche pour led
int RedpinLock = 6;

void setup() {
  
  lcd.begin (16, 2);  //définissions de l'écran lcd
  lcd.print ("Coffre fermé");  //écrire "..."
  delay(2000);  //attendre deux secondes
  pinMode(GreenpinUnlock, OUTPUT);  //pin led en sortie
  pinMode(RedpinLock, OUTPUT);
  digitalWrite(GreenpinUnlock, LOW);  //led éteinte
  digitalWrite(RedpinLock, LOW);
  monServo.attach(9);  //pin servo == 9
}

void loop() {

  char key = keypad.getKey(); //key == touche appuyé  //key prend la valuer de touche appuyé
  if (key == NO_KEY){
    digitalWrite(RedpinLock, LOW);
    digitalWrite(GreenpinUnlock, LOW);
  }
  
  lcd.clear();
  lcd.print("Code : ");  //écrire "..."

  if(int(key) =0){  //si touche appuyé est 0
    digitalWrite(GreenpinUnlock, HIGH);  //alors led verte allumée
    delay(1000);  //attendre 1 s.
    digitalWrite(GreenpinUnlock, LOW);  //éteindre led

    }
  if(key == password[position])  //si touche appuyé est égal au mot de passe
  {
   ++position;  //position + 1
   lcd.print ("*");
   if(position == 4)  //si position est égale à 4
   {
    unlockDoor();  //Faire fonction unlockDoor
    position = 0;   //position est égale à 0
    
   } 
         
  }
  
  else {  //sinon
    invalidCode();  //faire fonction invalidCode
    position = 0;  //position est égale à 0
  }
 }

 void invalidCode()  //fonction invalidCode
 {
  digitalWrite(RedpinLock, HIGH);  //led rouge allumée
  tone(DIO_BUZZER, 2000, 50);  //buzzer bip
  delay(300);  //attendre 0.3 sec.
  tone(DIO_BUZZER, 2000, 100);  //buzzer bip
  delay(5000);  //attendre 5 sec;
  digitalWrite(RedpinLock, LOW);  //led rouge éteinte
  lcd.clear();
  lcd.print("Code inccorect");  //écrire "..."
  monServo.write(10);  //servo, position 10
 }

void unlockDoor()  //Fonction unlockDoor
{
  monServo.write(100);  //servo position 100
  lcd.clear();
  lcd.print("Coffre ouvert");
  digitalWrite(GreenpinUnlock, HIGH);  //led verte allumée
  delay(5000);  //attendre 5 sec.
  digitalWrite(GreenpinUnlock, LOW);  //les verte éteinte
  
}

jète un oeil dans ce zip
tu comprendras que c'est beaucoup plus simple que ca :wink:
http://arduino.cc/playground/uploads/Code/Password.zip

Je n'ai pas regardé le code précisément, mais cette ligne me paraît de toutes façons fausse :

if(int(key) =0){  //si touche appuyé est 0

Elle devrait être :

if(int(key) ==0){  //si touche appuyé est 0

Slt et merci pour les réponses, j'ai télécharger le dossier zip mais je ne peux pas l'ouvrir, c'est un fichier PDE, je me demande quel logiciel il faut pour ouvrir les fichiers. Et sinon j'ai modifié la ligne de code et j'ai observé que avant d'allumer la led rouge, la led verte s'allumaient 1 secondeet s'éteignait en laissant place à la rouge. J'ai encore plus de mal à comprendre :slight_smile:

le pde est l'ancinne version des fichiers ino de l'ide;
tu peut l'ouvrir sans pb avec l'ide, sinon tu ouvre avec le bloc note, copie colle dans l'ide

Merci beaucoup, j'ai apportée les modifications pour les led et le buzzer et c'est niquel

si résolu, modifie ton premier post et marque résolu dans le titre.
content d'avoir été utile

1 Like