Go Down

Topic: Combiner 2 programmes en 1 seul ! (Read 618 times) previous topic - next topic

tom_sns

Bonsoir,

Étant débutant sur Arduino, j'aurais aimé avoir un coup de pouce de la communauté !

J'aimerais "combiner" si c'est possible 2 programmes en 1 seul.
Si vous pouvez me répondre dans les plus brefs délais ce serai vraiment chic de votre part.

Merci par avance de votre aide

Cordialement
Code: [Select]
1er Code :
#include <Wire.h>
#include <rgb_lcd.h>
#include <SPI.h>
#include <MFRC522.h>

rgb_lcd lcd;

const int colorR = 0;
const int colorG = 150;
const int colorB = 150;

#define SS_PIN 53   
#define RST_PIN 40

byte tagok = 0;

unsigned long sernum[11] = {0, 3643072285, };

MFRC522 mfrc522(SS_PIN, RST_PIN);        // Create MFRC522 instance.
MFRC522::MIFARE_Key key;
void setup() {
  lcd.begin(16, 2);       
  lcd.setRGB(colorR, colorG, colorB);
  SPI.begin();                // Init SPI bus
  mfrc522.PCD_Init();        // Init MFRC522 card
lcd.print("Init afficheur ");
delay (2500);
lcd.clear();
lcd.print("Scan du badge ?");
lcd.setCursor(0, 2);
}

void loop() {

  // Look for new cards
  if ( ! mfrc522.PICC_IsNewCardPresent()) {
    return;
  }

  // Select one of the cards
  if ( ! mfrc522.PICC_ReadCardSerial())    return;

 
  for (byte i = 0; i < 4; i++) {

  }

  sernum[0] = *((unsigned long *)mfrc522.uid.uidByte); //recup num serie lu long unsigned

  tagok = 0;
  for  (byte i = 1; i < 10; i++) {
    if (sernum[0] == sernum[i]) tagok = 1; // carte reconnue dans la liste

  }
  if (sernum[0] == sernum[10]) tagok = 255; // carte master reconnue

  if (tagok == 0) { // faire si carte inconnue
    lcd.print("Scan du badge");
    lcd.setCursor(0, 2);
    lcd.print("Badge Invalide");
    delay(3000);
    lcd.clear();
    lcd.print("Scan du badge :");
   
  }
  if (tagok >0) //faire si carte reconnue
  {

    lcd.setCursor(0, 1);
    if (sernum[0] == sernum[1]) lcd.print("ELEVE.A " );
    delay(3000);
    lcd.clear();
    lcd.print("Validez le code");
  }

 
mfrc522.PICC_HaltA(); // Halt PICC

}


Code: [Select]
2ème code :
#include <Password.h>
#include <rgb_lcd.h>
#include <Keypad.h>
#include <Wire.h>

//-- Initialisation de la gache éléctrique
const int gache = 44 ;

//-- Réglage d'une LED
const int GreenLed = 8;

//-- Régalges de l'afficheur LED
rgb_lcd lcd;

const int colorR = 100;
const int colorG = 255;
const int colorB = 255;

//-- Réglage du code d'accès
Password password = Password("0000");                              // Définition du code à saisir

//-- Défintion du clavier
const byte ROWS = 4;                                               // Définition de 4 lignes
const byte COLS = 4;                                               // Définition de 4 colonnes

//-- Maquettage du clavier
char keys[ROWS][COLS] = {
    {'1', '2', '3', 'A',},
    {'4', '5', '6', 'B',},
    {'7', '8', '9', 'C',},
    {'*', '0', ' ', 'D',}
};
//-- Définition des pins à connecter
byte rowPins[ROWS] = {36, 34, 32, 30};                             // Connecter les pins des lignes aux ports attribués
byte colPins[COLS] ={28, 26, 24, 22};                              // Connecter les pins des colonnes aux ports attribués
 
//-- Création du clavier 
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
 
void setup() {
    pinMode(GreenLed, OUTPUT);
    lcd.begin(16, 2);                                              // Initialisation de l'afficheur LCD
    lcd.setRGB(colorR, colorG, colorB);                            // Définition du rétro-éclairage et de la couleur de l'afficheur LCD
    lcd.print("Code : ");                                          // Affiche la demande de code sur l'afficheur LCD
    keypad.addEventListener(keypadEvent);                          // Ajout d'une liste d'événements pour le clavier
    keypad.setDebounceTime(50);                                    // Défintion du temps de l'anti-rebond
    pinMode(gache, OUTPUT);                                        // Réglage de la gâche éléctrique en sortie
}
 
void loop() {
     
    digitalWrite(gache, LOW); // Etat vérouillé de la gâche
    keypad.getKey(); // Réception de l'information d'une touche si elle est appuyée
}
 
//-- Réglages de certains cas pour le clavier
void keypadEvent(KeypadEvent eKey) {
    switch (keypad.getState()) {
     case PRESSED:
    lcd.print(eKey); // Afficher la touche appuyée sur l'afficheur LCD
    switch (eKey) {
    case '*': checkPassword(); break;                              // Touche "*" pour confirmer le code entré
    case '#': password.reset(); break;                             // Touche "#" pour effacer le code si il y a erreur de saisie
    password.reset();
    lcd.print("");
    default: password.append(eKey);
        }
    }
}
//-- Cas où le code est bon
void checkPassword() {
    if (password.evaluate())                                       // Si le code entré est valide
    {
      lcd.clear();
      lcd.print("Code valide !");                                  // Afficher ce message
      password.reset();
      delay(1500);
      lcd.clear();                                                 // Efface les anciennes phrases
      lcd.print("  Bon retour !");                                 // Pour afficher ce message
      lcd.setCursor(0, 1);
      lcd.print("   Ouverture");                                   // Ainsi que celui-ci informant l'ouverture du casier
      digitalWrite(gache, HIGH);                                    // On ouvre la gache
      digitalWrite(GreenLed, HIGH);
      delay(10000);                                                 // Pendant une durée de 4 secondes
      digitalWrite(GreenLed, LOW);
      lcd.clear();                                                 // Répetion du programme d'ouverture avec le code à l'infini
      lcd.print("Code : ");
      password.evaluate();
    }     
   
//-- Cas où le code est refusé   
     else                                                          // Si le code est éronné
    {
      lcd.clear();                                                 // Eface les anciennes phrases
      lcd.print("Code Invalide !");                                // Pour afficher ce message
      digitalWrite(gache, LOW);                                   // La gâche reste fermée
      password.reset();
      delay(3000);                                                 // Attente de 3 secondes pour pouvoir re-saisir le code
      lcd.clear();                                                 // Répétition du programme d'ouverture avec la demande de code à l'infini
      lcd.print("Code : ");
      password.evaluate();
     
    }
}
//-- Fin du programme

lesept

La recette classique pour combiner deux codes en un c'est :
  • Joindre les déclaratoins (entêtes) des deux codes, en ôtant les doublons
  • Joindre les deux setup en un seul, en ôtant les doublons
  • Pour la loop, c'est plus compliqué : moi je fais deux fonctions avec le contenu de chaque loop et je crée une loop qui appelle ces fonctions selon le besoin.

C'est là que les ennuis commencent, car il faut bien savoir comment ces fonctions s'enchaînent. Mais, ça pour l'instant, toi seul le sait ! :)
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

tom_sns

lesept merci de ta réponse rapide !!!

Je programme sur arduino depuis 2 mois environ mais je ne capte pas grand chose,
J'ai déja réuissi à inclure les variables et les void setup sans doublons mais le loop me gonfle et je vais me retirer les cheveux si ça continue, si quelqu'un pourrait me faire comprendre comment tout inclure dans le loop il me retirerait une sacré épine du pied !!!

Merci encore à toi Lesept

tom_sns

concernant mon projet, je voudrais commencer par une identification RFID (vérifier si la badge scanné est valide ou pas). Si il l'est l'utilisateur doit entrer un code (valide bien évidemment) pour pouvoir ouvrir la gâche électrique.

Comme c'est un projet de fin d'année je dois mettre les bouchées doubles pour pouvoir le finaliser.


Je voulais savoir comment faire des fonctions à inclure dans la partie loop pour combiner l'ensemble (je suis vraiment débutant dans le milieu et je suis désolé de vous importuner avec mes soucis  :smiley-confuse: !!!!)

Cordialement

tom_sns

lesept

#4
May 21, 2018, 12:47 am Last Edit: May 21, 2018, 12:49 am by lesept
Une fonction est un ensemble d'instruction que tu isoles du programme principal soit pour des raisons de simplicité de lecture, soit parce qu'elles doivent être exécutées plusieurs fois. Toi, tu es dans le premier cas.

La fonction est définie par :
  • un nom
  • des variables d'entrée
  • les instructions en question
  • un résultat
Le nom, tu le choisis: par exemple lectureBadge.
Après le nom, tu indiques les variables d'entrée entre parenthèses, s'il y en a. Dans ton cas, j'ai l'impression que toutes tes variables sont globales : elles sont donc accessibles et modifiables dans toutes les parties de ton programme. Tu peux donc ne pas mettre de variables d'entrée. Ça donnera lectureBadge().
Le résultat,  c'est une variable qui contient le résultat des instructions de la fonction. Ça peut être le numéro du badge lu, ou un booléen qui dit que le lecture s'est ou non bien passée, etc. Tu déclares la  fonction comme étant du type de la variable qui contient le résultat, et void s'il n'y a aucun résultat renvoyé. Dans ton cas, comme toutes les variables sont globales, c'est pareil ; tu peux t'en passer. Ça donnera :
void lectureBadge ()

En final, ta fonction sera (c'est un exemple) :
Code: [Select]
void lectureBadge ()
{
les instructions
}


Ton premier programme lit un badge et en compare son ID à une liste. S'il n'y est pas il dit 'Badge invalide' et recommence. S'il est dans la liste, il demande d'entrer un code au clavier. C'est ce qui se passe dans ton second programme.

Le second programme lit au clavier le code qui est entré. Lorsqu'on tape sur '*', le programme vérifie le code. S'il est exact, il actionne la gache.

Tu dois avoir quelque part un fichier password.h qui contient d'autres lignes de programme et le code qui libère la gache.

J'espère que ça t'aide un peu. Ecris ton programme, compile le et reviens si tu as des problèmes...

N'oublie pas qu'un programme sur Arduino exécute la fonction setup une seule fois et ensuite exécute la fonction loop indéfiniment.
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

tom_sns

#5
May 23, 2018, 06:32 pm Last Edit: May 23, 2018, 06:34 pm by tom_sns
Re ^^

Je rencontre de nouveau des petits soucis (par mon incompétence) je l'admet ^^,

j'ai suivi ton conseil Lesept, en créant les variables comme tu me l'a conseillé mais le hic c'est que quand je vérifie le programme avant de le téléverser j'ai ce message qui s'affiche.
Code: [Select]
"a function-definition is not allowed here before '{' token"
Je voulais savoir si il fallait que je conserve le void loop quand je déclare mes variables…
Mais bon je suis le seul de mon groupe à m'investir complétement dans le projet et qui commence à m'affoler car l'exam est pour bientôt et il compte Coeff 12

En attente de vos futures réponses

Merci encore de votre aide

Cordialement

tom_sns

lesept

Poste ton code entre balises CODE, ça m'aidera...
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

tom_sns

Voici le code Lesept :
Code: [Select]

/*
 -----------------------------------------------------------------------------
 * Pin layout should be as follows:
 * Signal     Pin              Pin               Pin
 *            Arduino Uno      Arduino Mega      MFRC522 board
 * ------------------------------------------------------------
 * Reset      9                49                RST
 * SPI MISO   10               50                MISO
 * SPI MOSI   11               51                MOSI
 * SPI SCK    12               52                SCK
 * SPI SDA    13               53                SDA         
 */

#include <Wire.h>
#include <rgb_lcd.h>
#include <SPI.h>
#include <MFRC522.h>
#include <Password.h>
#include <Keypad.h>
//////////////////////
#define SS_PIN 53   
#define RST_PIN 49
//////////////////////
rgb_lcd lcd;
Password password = Password ("0000");
//////////////////////
const byte ROWS = 4;
const byte COLS = 4;
//////////////////////
const int gache = 44;
const int greenLed = 8;
//////////////////////
const int colorR = 0;
const int colorG = 150;
const int colorB = 150;
//////////////////////
char keys [ROWS] [COLS] =
  {
    {'1', '2', '3', 'A',},
    {'4', '5', '6', 'B',},
    {'7', '8', '9', 'C',},
    {'*', '0', ' ', 'D',}
  };
//////////////////////
byte rowPins [ROWS] = {36, 34, 32, 30};
byte colPins [COLS] = {28, 26, 24, 22}; 
//////////////////////
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
//////////////////////
byte tagok = 0;
//////////////////////
unsigned long sernum[2] = {0, 3643072285, };
//////////////////////
MFRC522 mfrc522(SS_PIN, RST_PIN);        // Create MFRC522 instance.
MFRC522::MIFARE_Key key;

//////////////////////SETUP//////////////////////
void setup() {
  lcd.begin(16, 2);       
  lcd.setRGB(colorR, colorG, colorB);
  SPI.begin();                // Init SPI bus
  mfrc522.PCD_Init();        // Init MFRC522 card
lcd.print("Init afficheur ");
delay (1500);
lcd.clear();
lcd.print(" Scan du badge");
lcd.setCursor(0, 2);
keypad.setDebounceTime(50);
pinMode(gache, OUTPUT);
pinMode(greenLed, OUTPUT);
}
//////////////////////LOOP////////////////////////
void loop() {

void RFID() {
  // Look for new cards
  if ( ! mfrc522.PICC_IsNewCardPresent()) {
    return;
  }

  // Select one of the cards
  if ( ! mfrc522.PICC_ReadCardSerial())    return;

 
  for (byte i = 0; i < 4; i++) {

  }

  sernum[0] = *((unsigned long *)mfrc522.uid.uidByte);
  tagok = 0;
  for  (byte i = 1; i < 10; i++) {
    if (sernum[0] == sernum[i]) tagok = 1; // carte reconnue dans la liste

  }
 if (tagok == 0) { // faire si carte inconnue
    lcd.print(" Scan du badge");
    lcd.setCursor(0, 2);
    lcd.print("Badge Inconnu !");
    delay(3000);
    lcd.clear();
    lcd.print(" Scan du badge");
   
  }
  if (tagok >0) //faire si carte reconnue
  {

    lcd.setCursor(0, 1);
    if (sernum[0] == sernum[1]) lcd.print("SENSE.T-STI2D_1 " );
    delay(3000);
    lcd.clear();
  }

 
mfrc522.PICC_HaltA(); // Halt PICC

}

void Code() {
     
    lcd.print("Code :")
    digitalWrite(gache, LOW); // Etat vérouillé de la gâche
    keypad.getKey(); // Réception de l'information d'une touche si elle est appuyée
}
 
//-- Réglages de certains cas pour le clavier
void keypadEvent(KeypadEvent eKey) {
    switch (keypad.getState()) {
     case PRESSED:
    lcd.print(eKey);
    switch (eKey) {
    case '*': checkPassword(); break;                              // Touche "*" pour confirmer le code entré
    case '#': password.reset(); break;                             // Touche "#" pour effacer le code si il y a erreur de saisie
    password.reset();
    lcd.print("");
    default: password.append(eKey);
        }
    }
}
//-- Cas où le code est bon
void checkPassword() {
    if (password.evaluate())                                       
    {
      lcd.clear();
      lcd.print("Code valide !");                                 
      password.reset();
      delay(1500);
      lcd.clear();                                                 
      lcd.print("  Bon retour !");                                 
      lcd.setCursor(0, 1);
      lcd.print("   Ouverture");                                   
      digitalWrite(gache, HIGH);                                   
      digitalWrite(GreenLed, HIGH);
      delay(10000);                                               
      digitalWrite(GreenLed, LOW);
      lcd.clear();                                                 
      lcd.print("Code : ");
      password.evaluate();
    }     
   
//-- Cas où le code est refusé   
     else                                                         
    {
      lcd.clear();                                               
      lcd.print("Code Invalide !");                               
      digitalWrite(gache, LOW);                                   
      password.reset();
      delay(3000);                                                 
      lcd.clear();                                                 
      lcd.print("Code : ");
      password.evaluate();
     
    }
}
 
}
}

En espérant qu'il n'y a pas trop de fautes dessus

Merci

tom_sns

lesept

Tu as mélangé la loop et les fonctions. Déplace les lignes :
Code: [Select]
//////////////////////LOOP////////////////////////
void loop() {

avant la dernière accolade.

Ça devrait compiler mais ça ne fera rien car ta loop est vide. Il faut la remplir ! :)

Dans l'IDE fais CTRL T, ça indentera correctement le code et ce sera plus facile pour voir les blocs entre accolades.
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

lesept

#9
May 24, 2018, 05:44 pm Last Edit: May 24, 2018, 05:44 pm by lesept
Code: [Select]

/*
  -----------------------------------------------------------------------------
   Pin layout should be as follows:
   Signal     Pin              Pin               Pin
              Arduino Uno      Arduino Mega      MFRC522 board
   ------------------------------------------------------------
   Reset      9                49                RST
   SPI MISO   10               50                MISO
   SPI MOSI   11               51                MOSI
   SPI SCK    12               52                SCK
   SPI SDA    13               53                SDA
*/

#include <Wire.h>
#include <rgb_lcd.h>
#include <SPI.h>
#include <MFRC522.h>
#include <Password.h>
#include <Keypad.h>
//////////////////////
#define SS_PIN 53
#define RST_PIN 49
//////////////////////
rgb_lcd lcd;
Password password = Password ("0000");
//////////////////////
const byte ROWS = 4;
const byte COLS = 4;
//////////////////////
const int gache = 44;
const int greenLed = 8;
//////////////////////
const int colorR = 0;
const int colorG = 150;
const int colorB = 150;
//////////////////////
char keys [ROWS] [COLS] =
{
  {'1', '2', '3', 'A',},
  {'4', '5', '6', 'B',},
  {'7', '8', '9', 'C',},
  {'*', '0', ' ', 'D',}
};
//////////////////////
byte rowPins [ROWS] = {36, 34, 32, 30};
byte colPins [COLS] = {28, 26, 24, 22};
//////////////////////
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
//////////////////////
byte tagok = 0;
//////////////////////
unsigned long sernum[2] = {0, 3643072285, };
//////////////////////
MFRC522 mfrc522(SS_PIN, RST_PIN);        // Create MFRC522 instance.
MFRC522::MIFARE_Key key;

//////////////////////SETUP//////////////////////
void setup() {
  lcd.begin(16, 2);
  lcd.setRGB(colorR, colorG, colorB);
  SPI.begin();                // Init SPI bus
  mfrc522.PCD_Init();        // Init MFRC522 card
  lcd.print("Init afficheur ");
  delay (1500);
  lcd.clear();
  lcd.print(" Scan du badge");
  lcd.setCursor(0, 2);
  keypad.setDebounceTime(50);
  pinMode(gache, OUTPUT);
  pinMode(greenLed, OUTPUT);
}

void RFID() {
  // Look for new cards
  if ( ! mfrc522.PICC_IsNewCardPresent()) {
    return;
  }

  // Select one of the cards
  if ( ! mfrc522.PICC_ReadCardSerial())    return;


  for (byte i = 0; i < 4; i++) {

  }

  sernum[0] = *((unsigned long *)mfrc522.uid.uidByte);
  tagok = 0;
  for  (byte i = 1; i < 10; i++) {
    if (sernum[0] == sernum[i]) tagok = 1; // carte reconnue dans la liste

  }
  if (tagok == 0) { // faire si carte inconnue
    lcd.print(" Scan du badge");
    lcd.setCursor(0, 2);
    lcd.print("Badge Inconnu !");
    delay(3000);
    lcd.clear();
    lcd.print(" Scan du badge");

  }
  if (tagok > 0) //faire si carte reconnue
  {

    lcd.setCursor(0, 1);
    if (sernum[0] == sernum[1]) lcd.print("SENSE.T-STI2D_1 " );
    delay(3000);
    lcd.clear();
  }


  mfrc522.PICC_HaltA(); // Halt PICC

}

void Code() {

  lcd.print("Code :")
  digitalWrite(gache, LOW); // Etat vérouillé de la gâche
  keypad.getKey(); // Réception de l'information d'une touche si elle est appuyée
}

//-- Réglages de certains cas pour le clavier
void keypadEvent(KeypadEvent eKey) {
  switch (keypad.getState()) {
    case PRESSED:
      lcd.print(eKey);
      switch (eKey) {
        case '*': checkPassword(); break;                              // Touche "*" pour confirmer le code entré
        case '#': password.reset(); break;                             // Touche "#" pour effacer le code si il y a erreur de saisie
          password.reset();
          lcd.print("");
        default: password.append(eKey);
      }
  }
}
//-- Cas où le code est bon
void checkPassword() {
  if (password.evaluate())
  {
    lcd.clear();
    lcd.print("Code valide !");
    password.reset();
    delay(1500);
    lcd.clear();
    lcd.print("  Bon retour !");
    lcd.setCursor(0, 1);
    lcd.print("   Ouverture");
    digitalWrite(gache, HIGH);
    digitalWrite(GreenLed, HIGH);
    delay(10000);
    digitalWrite(GreenLed, LOW);
    lcd.clear();
    lcd.print("Code : ");
    password.evaluate();
  }

  //-- Cas où le code est refusé
  else
  {
    lcd.clear();
    lcd.print("Code Invalide !");
    digitalWrite(gache, LOW);
    password.reset();
    delay(3000);
    lcd.clear();
    lcd.print("Code : ");
    password.evaluate();

  }
}

//////////////////////LOOP////////////////////////
void loop() {
/*
 *  La loop est vide : il faut écrire le programme qui se
 *  sert de ces fonctions
 */

 
}
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

tom_sns

Lesept,

Je te remercierais jamais assez de m'avoir sorti de (pardon de cette expression) cette MERDE NOIRE !!!!!!

Grâce à toi il ne me reste plus qu'écrire le loop, merci encore et désolé de t'avoir importuner car c'était normalement mes camarades qui devaient m'aider (enfin il y en a 1 qui m'a aidé).

J'espère sincèrement que ces efforts finiront par payer. Je vais décrocher une bonne note pour le projet qui compte Coeff 12 pour mon BAC.

Merci encore une fois Lesept de ta plus que précieuse aide.
Passe une bonne soirée.

Cordialement

tom_sns

tom_sns

#11
May 27, 2018, 02:32 pm Last Edit: May 27, 2018, 02:34 pm by tom_sns
Le retour,

Bon, le projet avance doucement mais sûrement mais j'ai un problème de programmation (ENCORE !!!)
Cette fois mon camarade m'a écrit qui est potentiellement bon (d'après ce que j'ai pu lire) mais il y a encore un hic…

Code: [Select]

#include <Wire.h>
#include <rgb_lcd.h>
#include <Password.h>
#include <SPI.h>
#include <MFRC522.h>
#include <Keypad.h>

#define SS_PIN 53
#define RST_PIN 49

unsigned long serNum[2] = {0 ,  3643072285};

MFRC522 mfrc522(SS_PIN, RST_PIN);       
MFRC522::MIFARE_Key key;

byte tagok = 0;

bool access = false;

rgb_lcd lcd;

const int colorR = 100;
const int colorG = 255;
const int colorB = 255;

Password password = Password("1234");

const byte ROWS = 4;
const byte COLS = 4;

char keys[ROWS][COLS] =
{
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};

byte rowPins[ROWS] = {22, 24, 26, 28};
byte colPins[COLS] = {30, 32, 34, 36};

const int buzzer = 7;
const int doorLock = 10 ;

int alarm = 0;
uint8_t alarmStat = 0;
uint8_t maxError = 5;

unsigned long previousMillis = 0;
const long interval = 1000; 
uint8_t pwMode=0;
uint8_t pwPos=0;

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
///////////////////////////////////////////SETUP///////////////////////////////////////////
void setup() {
    lcd.begin(16, 2);
    lcd.setRGB(colorR, colorG, colorB);
    SPI.begin();
    mfrc522.PCD_Init();
    keypad.addEventListener(keypadEvent);       //   C'EST ICI LE PROBLEME !!!!!!!!!
    keypad.setDebounceTime(50);
   
    pinMode(doorLock, OUTPUT);
    digitalWrite(doorLock, LOW);

    tone (buzzer,1200);
    lcd.setCursor (0,0);
    lcd.print(F("  RFID System   "));
    lcd.setCursor (0,1);
    lcd.print(F(" Control Access "));
    delay (2000);
    lcd.clear();
    noTone (buzzer);
}///////////////////////////////////////////LOOP///////////////////////////////////////////

void loop(){
  keypad.getKey();  //Reading Keypad
 
  if (alarm >= maxError){
    alarmStat = 1;    }
 
  if (alarmStat == 0 && pwMode == 0){
  lcd.setCursor (0,0);
  lcd.print(F(" -System Ready- "));
  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis >= interval) {
      //previousMillis = currentMillis;
  lcd.setCursor (0,1);
  lcd.print(F(" Scan Your Card "));
  }

  if (currentMillis - previousMillis >= (2*interval)) {
      previousMillis = currentMillis;
  lcd.setCursor (0,1);
  lcd.print(F(" Enter Password "));
  }
 
   if ( ! mfrc522.PICC_IsNewCardPresent()) {
    return;
  }

  // Selection d'un badge
  if ( ! mfrc522.PICC_ReadCardSerial())    return;


  for (byte i = 0; i < 4; i++) {

  }

  serNum[0] = *((unsigned long *)mfrc522.uid.uidByte);
  tagok = 0;
  for  (byte i = 1; i < 10; i++) {
    if (serNum[0] == serNum[i]) tagok = 1;

  }
  if (tagok == 0) {
    lcd.print(" Scan du badge");
    lcd.setCursor(0, 2);
    lcd.print("Badge Inconnu !");
    delay(3000);
    lcd.clear();
    lcd.print(" Scan du badge");

  }
  if (tagok > 0)
  {

    lcd.setCursor(0, 1);
    if (serNum[0] == serNum[1]) lcd.print("SENSE.T-STI2D_1 " );
    delay(3000);
    lcd.clear();
  }


  mfrc522.PICC_HaltA(); // Halt PICC
       
  if (alarmStat == 1) {
    lcd.setCursor (0,0);
    lcd.print(F("-System LOCKED- "));
    lcd.setCursor (0,1);
    lcd.print(F(" Please Wait "));

  for(int i=60; i>0; i--){
    tone (buzzer,1800);
    lcd.setCursor (13,1); lcd.print(i);
    lcd.print(F("  "));delay (1000);}
    noTone (buzzer);
    alarmStat = 0;
    alarm = 0;
  }
}
 
void keypadEvent(KeypadEvent eKey){
  switch (keypad.getState()){
  case PRESSED:
    Serial.print("Pressed: ");
    Serial.println(eKey);
 
  pwMode =1;
  pwPos=pwPos+1;
  if(pwPos==1){lcd.clear();}
  lcd.setCursor (0,0);
  lcd.print(F("Password Entered"));
  if(pwPos<5){lcd.setCursor (5+pwPos,1);
  lcd.print(F("*"));}
 
  switch (eKey){
    case '*': checkPassword(); break;
    case '#': password.reset(); break;
   
    default: password.append(eKey);
     }
  }
}

void checkPassword(){
  if (password.evaluate()){

    Serial.println("Password OK");
    lcd.setCursor (0,1);
    lcd.print(F("   -Accepted-   "));
    ACCEPT ();
    password.reset();
    pwPos=0;
    //Add code to run if it works
   
  }else{
    Serial.println("Password ?");
    lcd.setCursor (0,1);
    lcd.print(F("   -Rejected-   "));
    alarm = alarm+1;
    REJECT ();
    password.reset();
    pwPos=0;
  }
}
 
void ACCEPT () {
           digitalWrite(doorLock, HIGH);
           tone (buzzer,900);
           delay(100);
           tone (buzzer,1200);
           delay(100);
           tone (buzzer,1800);
           delay(200);
           noTone(buzzer); 
           delay(600);
           lcd.setCursor (0,0);
           lcd.setCursor (0,1);
           lcd.print(F("AutoLock after "));
           for(int i=5; i>0; i--){
            lcd.setCursor (15,1); lcd.print(i);
            delay (1000);
           }
           digitalWrite(doorLock, HIGH);
           pwMode =0;
           lcd.clear();}

void REJECT () {
           tone (buzzer,900);
           delay(200);
           noTone(buzzer);
           delay(200);
           tone (buzzer,900);
           delay(200);
           noTone (buzzer); 
           delay(500);
           pwMode =0;
           lcd.clear(); 

Lors de la compilation du programme j'ai le message "exit status 1
'keypadEvent' was not declared in this scope" qui s'affiche.
Je ne comprends pas alors que le clavier est bien déclaré…

Bref je vous solicite encore une fois pour m'aider à résoudre ce problème.
Merci d'avance

Cordialement

tom_sns

lesept

Salut
Keypadevent est le moyen de traiter l'appui sur une touche : voir la doc ici

Code: [Select]
addEventListener(keypadEvent)
Trigger an event if the keypad is used. You can load an example in the Arduino IDE.
[See File -> Examples -> Keypad -> Examples -> EventSerialKeypad] or see the KeypadEvent Example code.


On déclare ça dans le setup :
Code: [Select]
  keypad.addEventListener(keypadEvent); //add an event listener for this keypad
Ca permet d'exécuter ta fonction
Code: [Select]
void keypadEvent(KeypadEvent eKey) {
(attention tu as mis un 'e' à keypadEvent !!!)
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

tom_sns

#13
May 27, 2018, 05:00 pm Last Edit: May 27, 2018, 06:30 pm by tom_sns
Merci Lesept de ta réponse ultra rapide ^^

J'ai résolu le problème grâce à ton aide, maintenant le programme fonctionne (mais pas comme je le voulais), en effet mon camarade n'a pas compris que le programme utilise 2 sécurités qui s'enchaine (d'abord le badge RFID et après le code), lui il a écrit que soit le badge, ou soit le code ouvre la serrure.

Du coup si quelqu'un peut m'aider à corriger ce détail ce serai TOPISSIME !!!!!!!!

voici le code :
Code: [Select]

#include <Wire.h>
#include <SPI.h>
#include <rgb_lcd.h>
#include <Password.h>
#include <Keypad.h>
#include <MFRC522.h>

#define SS_PIN 53
#define RST_PIN 49

rgb_lcd lcd;

const int colorR = 0;
const int colorG = 0;
const int colorB = 0;

byte tagok = 0;
unsigned long sernum[2] = {0, 3643072285};


MFRC522 mfrc522(SS_PIN, RST_PIN);
MFRC522::MIFARE_Key key;

Password password = Password("1379");

const byte ROWS = 4;
const byte COLS = 4;

byte rowPins[ROWS] = {22, 24, 26, 28};
byte colPins[COLS] = {30, 32, 34, 36};


char keys[ROWS][COLS] = {
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'}
};
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

const int buzzer = 10;
const int doorLock = 12;
const int greenLed = 8;
const int redLed = 6;

int alarm = 0;
uint8_t alarmStat = 0;
uint8_t maxError = 3;

unsigned long previousMillis = 0;
const long interval = 5000;
uint8_t pwMode = 0;
uint8_t pwPos = 0;
////////////////////////////////////SETUP////////////////////////////////////
void setup() {
  lcd.begin(16, 2);
  lcd.setRGB(colorR, colorG, colorB);
  SPI.begin();
  mfrc522.PCD_Init();
  keypad.addEventListener(keypadEvent); //add an event listener for this keypad

  pinMode(doorLock, OUTPUT);
  pinMode(greenLed, OUTPUT);
  pinMode(redLed, OUTPUT);
  digitalWrite(doorLock, LOW);
  digitalWrite(greenLed, LOW);
  digitalWrite(redLed, LOW);

  lcd.setCursor (0, 0);
  lcd.print(F(" Initialisation "));
  lcd.setCursor(0, 1);
  lcd.print(F("    en cours  "));
  delay (5000);
  lcd.clear();
}
////////////////////////////////////LOOP////////////////////////////////////
void loop() {
  keypad.getKey();  //Reading Keypad

  if (alarm >= maxError) {
    alarmStat = 1;
  }

  if (alarmStat == 0 && pwMode == 0) {
    lcd.setCursor (0, 0);
    lcd.print(F(" -Casier Ferme- "));
    unsigned long currentMillis = millis();


    if (currentMillis - previousMillis >= interval) {
      //previousMillis = currentMillis;
      lcd.setCursor (0, 1);
      lcd.print(F("-Scan ton badge-"));
    }

    if (currentMillis - previousMillis >= (2 * interval)) {
      previousMillis = currentMillis;
      lcd.setCursor (0, 1);
      lcd.print(F("-Tape ton code- "));
    }

    if ( ! mfrc522.PICC_IsNewCardPresent()) {
      return;
    }

    // Select one of the cards
    if ( ! mfrc522.PICC_ReadCardSerial())    return;


    for (byte i = 0; i < 4; i++) {

    }

    sernum[0] = *((unsigned long *)mfrc522.uid.uidByte); //recup num serie lu long unsigned

    tagok = 0;
    for  (byte i = 1; i < 10; i++) {
      if (sernum[0] == sernum[i]) tagok = 1; // carte reconnue dans la liste
    }

    if (tagok == 0) {
      lcd.clear(),
                lcd.setCursor(0, 0);
      lcd.print(" Badge Invalide");
      REJECT();
    }

    if (tagok > 0) {
      lcd.setCursor(0, 1);
    }

    if (sernum[0] == sernum[1]) {
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("  Badge Valide" );
      ACCEPT();
    }
    mfrc522.PICC_HaltA(); // Halt PICC

  }
  if (alarmStat == 1) {
    lcd.setCursor (0, 0);
    lcd.print(F("-Systeme BLOQUE- "));
    lcd.setCursor (0, 1);
    lcd.print(F(" Patientez "));
   
  for (int i = 60; i > 0; i--) {
    tone (buzzer, 800);
    lcd.setCursor (13, 1); lcd.print(i);
    lcd.print(F("  ")); delay (1000);
}
    noTone (buzzer);
    alarmStat = 0;
    alarm = 0;
}
}

void keypadEvent(KeypadEvent eKey) {
  switch (keypad.getState()) {
    case PRESSED:

      pwMode = 1;
      pwPos = pwPos + 1;
      if (pwPos == 1) {
        lcd.clear();
      }
      lcd.setCursor (0, 0);
      lcd.print("  -Code saisi-");
      if (pwPos < 5) {
        lcd.setCursor (5 + pwPos, 1);
        lcd.print(F("*"));
      }

      switch (eKey) {
        case '*': checkPassword(); break;
        case '#': password.reset(); break;

        default: password.append(eKey);
      }
  }
}

void checkPassword() {
  if (password.evaluate()) {

    Serial.println("Password OK");
    lcd.setCursor (0, 1);
    lcd.print(F("    -Valide-   "));
    ACCEPT ();
    password.reset();
    pwPos = 0;
    //Add code to run if it works

  } else {
    lcd.setCursor (0, 1);
    lcd.print(F("    -Refuse-   "));
    alarm = alarm + 1;
    REJECT ();
    password.reset();
    pwPos = 0;
    //add code to run if it did not work
  }
}

void ACCEPT () {
  digitalWrite(doorLock, HIGH);
  digitalWrite(greenLed, HIGH);
  tone (buzzer, 900);
  delay(100);
  tone (buzzer, 1200);
  delay(100);
  tone (buzzer, 1800);
  delay(200);
  noTone(buzzer);
  delay(600);
  lcd.setCursor (0, 0);
  lcd.print(F("  "));
  lcd.setCursor (0, 1);
  lcd.print(F("Fermeture dans"));
  for (int i = 5; i > 0; i--) {
    lcd.setCursor (15, 1); lcd.print(i);
    delay (1000);
  }
  digitalWrite(doorLock, LOW);
  digitalWrite(greenLed, LOW);
  pwMode = 0;
  lcd.clear();
}

void REJECT () {
  digitalWrite(redLed, HIGH);
  tone (buzzer, 900);
  delay(200);
  noTone(buzzer);
  delay(200);
  tone (buzzer, 900);
  delay(200);
  noTone (buzzer);
  delay(500);
  digitalWrite(doorLock, LOW);
  pwMode = 0;
  lcd.clear();
}


Cordialement

tom_sns

solfra

Réfléchit un peut, tu veux avoir un code tu type:

Code: [Select]
Vérification du badge
Si c'est le bon badge alors demander le code
Sinon redemander le tag


Il suffit juste d'agencer les parties dans le bon ordre

Go Up