action par rapport a un code clavier

Parlez nous de vos projets et de vos idées, imaginez des applications

action par rapport a un code clavier

Message non lude yanick » Dim 13 Juil 2014 20:26

bonjour,

je souhaiterais déclencher des actions en fonction d'un code tape sur un clavier matriciel:

par exemple je tape 12 et un fois que j'active un bouton je déclenche l'action passe la pin 10 de mon arduino a l'état haut etc
bien sure je vais rajouter un ecran lcd pour visualiser la frappe .

j'ai commence a bricoler un truc avec la fonction if mais je me perd vite de plus tant que c'est les unité sa vas mais je sais pas stocker la valeur lorsque il s'agit d'un nombre a deux chiffres.

inutile d vous préciser que je débute.

merci
yanick
 
Messages: 43
Inscription: Mer 30 Mai 2012 00:39

Re: action par rapport a un code clavier

Message non lude EricDuino » Lun 14 Juil 2014 09:28

Coucou Yanick et bien venu dans le Monde de l'Arduino,

Je pense que les débutants doivent passer par l'étude des exemples officiels et de la référence du langage (mais en Anglais) mais surtout des tutos de "Laetitia" en Français :!:

J'espère que celui-ci saura t'aider [TUTORIEL] Matrix Keypad
:ugeek:
Avatar de l’utilisateur
EricDuino
 
Messages: 226
Inscription: Sam 5 Mai 2012 10:10
Localisation: Toulouse

Re: action par rapport a un code clavier

Message non lude yanick » Mar 15 Juil 2014 20:26

Bonjour,

Merci Éric pour ce tuto en fouinant un peu j'en avais trouve un similaire je pense que la fonction switch c'est ce que je vais utiliser mais la ou je coince c'est pour faire un switch sur un nombre a deux chiffre je regarde pour stocker dans un tableau mais je trouve pas

Case(12)
Attente d une entrée
Action
Breack

Case(13)
.
.
.

Mais si je tape 1 je passe direct case (1)
Mais je devrais pouvoir avancer avec ce tuto
yanick
 
Messages: 43
Inscription: Mer 30 Mai 2012 00:39

Re: action par rapport a un code clavier

Message non lude yanick » Mar 15 Juil 2014 21:10

je viens de tester le probleme de cet exemple c'est qu il travail avec la librairie password (qui devrait mes servir pour veroiller mon appli)
je me heurte toujours a la facon de stocker en nombre a deux chiffres.
yanick
 
Messages: 43
Inscription: Mer 30 Mai 2012 00:39

Re: action par rapport a un code clavier

Message non lude EricDuino » Mer 16 Juil 2014 07:30

stocker un nombre à 2 chiffres ?

>>

int val = 12 ; // un "int" peut stocker une valeur entre -32768 et 32767


un if et else ?

>>

if (val = 12)
{
digitalWrite(LEDpin1, HIGH); // action A
}
else
{
digitalWrite(LEDpin1, LOW); // action B
}

>> je réponds à la question, mais je ne suis pas certain qu'elle représente exactement ton besoin ?
Avatar de l’utilisateur
EricDuino
 
Messages: 226
Inscription: Sam 5 Mai 2012 10:10
Localisation: Toulouse

Re: action par rapport a un code clavier

Message non lude yanick » Mer 16 Juil 2014 18:41

ercic

oui je comprends bien ce que tu m'explique mais ce que je veux faire c'est:

je tape le chiffre 1 sur le clavier
je tape le chiffre 2
je valide ma saisi par # par exemple

et je recupere la valeur 12 pour m'en servir dans un switch
et je confirme l'action en appuyant sur un bouton

mais je n'arive pas a recuperer la valeure douze si j utilise seulement les unitées c'est bon mais pas quand j'ai un nombre compose de deux chiffres.

j'espere que je suis assez clair pas evident a expliquer.

merci
yanick
 
Messages: 43
Inscription: Mer 30 Mai 2012 00:39

Re: action par rapport a un code clavier

Message non lude Laetitia » Ven 18 Juil 2014 10:55

Bonjour,

yanick a écrit:oui je comprends bien ce que tu m'explique mais ce que je veux faire c'est:

je tape le chiffre 1 sur le clavier
je tape le chiffre 2
je valide ma saisi par # par exemple

et je recupere la valeur 12 pour m'en servir dans un switch
et je confirme l'action en appuyant sur un bouton

Le code d'exemple du tutoriel cité plus haut exploite un mot de passe à 4 chiffres. Il suffit de le reprendre avec des codes à deux chiffres, par exemple avant le setup remplacer

Code: Tout sélectionner
Password pwd = Password("1234");   // définition du mot de passe

par

Code: Tout sélectionner
Password pwd1 = Password("12");
Password pwd2 = Password("13");

...la fonction kpdEvent est à conserver (sauf si vous voulez modifier les touches de validation ou d'annulation de saisie), il faudra mettre à jour la fonction checkPassword pour faire ce que vous souhaitez, par exemple :

Code: Tout sélectionner
void checkPassword(void)
{
  // si le premier mot de passe est juste...
  if (pwd1.evaluate())
  {
    doSomething();
  }
  // sinon on vérifie le suivant
  else if (pwd2.evaluate())
  {
    doSomethingElse();
  }
  // si aucun n'est bon
  else
  {
    defaultAction();
  }
  // on remet à zéro systématiquement après avoir vérifié pour ne pas avoir d'erreur
  pwd.reset();
}

Attention, dans cette implémentation le mot de passe tapé est stocké dans un objet "Password" et pas sous forme de variable utilisable telle quelle.
"If it's itchy, scratch it !" - "DIY or die"

RTFM (À lire avant de poster) - ANDb (Arduino Noob Database)
Avatar de l’utilisateur
Laetitia
 
Messages: 296
Inscription: Mar 7 Aoû 2012 15:07
Localisation: Toulouse

Re: action par rapport a un code clavier

Message non lude yanick » Ven 18 Juil 2014 17:27

bonjour,

merci je vais essayer comme ca il faut que je gere une 60 aine de conditions clavier je verrais si ca passe.
yanick
 
Messages: 43
Inscription: Mer 30 Mai 2012 00:39

Re: action par rapport a un code clavier

Message non lude yanick » Sam 19 Juil 2014 15:38

bonjour,

voila je viens de tester mon code avec les infos que vous m'avez fait passer.
le voici.

Code: Tout sélectionner
/*
  Mini système d'alarme - Matrix Keypad + LEDs
  Arduino IDE 1.0.1
*/

#include <Password.h> // http://www.arduino.cc/playground/uploads/Code/Password.zip
#include <Keypad.h>   // http://www.arduino.cc/playground/uploads/Code/keypad.zip

#define green 13                   // LED rouge attachée à pin 13 de l'Arduino
#define red 12   // LED rouge attachée à pin 12 de l'Arduino
#define bleu 11       // LED bleu attachée à pin 11 de l'Arduino

Password pwd1 = Password("1");   // définition du mot de passe
Password pwd2 = Password("2");
Password pwd13 = Password("13");
Password pwd4 = Password("4");








int ligne;
int alarm = 0;             // variable stockant l'état de l'alarme
                                   // false = alarme OFF | true = alarme ON
boolean intruder = false;          // variable stockant l'état de l'intrusion
                                   // false = pas d'intrus détecté | true = intrus détecté
                                 
unsigned long previousMillis = 0;  // dernière fois que la LED rouge a clignoté
int interval = 250;                // intervalle auquel faire clignoter la LED

#define ROWS 4                                                       //
#define COLS 3                                                       //
char keys[ROWS][COLS] =                                              //
{                                                                    //
  {'#','0','*'},
  {'9','8','7'},
  {'6','5','4'},
  {'3','2','1'}                                                      //
};                                                                   //
byte rowPins[ROWS] = {5, 4, 3, 2};                                   //
byte colPins[COLS] = {8, 7, 6};                                      //
                                                                     //
Keypad kpd = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS); //

void setup()
{
  Serial.begin(9600);
  pinMode(red, OUTPUT);
  pinMode(green, OUTPUT);
  pinMode(bleu, OUTPUT);
 
  kpd.addEventListener(kpdEvent);
}

void loop()
{
  char KEY = kpd.getKey();
  if (KEY) {
    Serial.println(KEY);
  }
  // en cas d'intrus détecté :
  if(intruder == true && alarm == true)
  {
    unsigned long currentMillis = millis();
    // ... on regarde s'il est temps de faire clignoter la LED, c'est-à-dire
    // s'il s'est passé suffisamment de temps depuis la dernière fois qu'on a vérifié
    if(currentMillis - previousMillis > interval)
    {
      previousMillis = currentMillis;
      digitalWrite(red, !digitalRead(red));
    }
  }
  else
  {
    digitalWrite(red, LOW);
  }
}

void kpdEvent (KeypadEvent Key)
{
  switch (kpd.getState())
  {
    case PRESSED :
      switch (Key)
      {
        // appui sur '*' -> vérification de la saisie en cours
        case '*' : checkPassword(); break;
        // appui sur '#' -> réinitialisation de la saisie en cours
        case '#' : pwd1.reset(); break;
        // sinon on ajoute le chiffre à la combinaison
        default  : pwd1.append(Key); break;
      }
    default : break;
  }
}

void checkPassword(void)
{
 
  // si le mot de passe est juste...
  if (pwd1.evaluate())
  {
    digitalWrite(bleu, HIGH);
        delay(2000);
    digitalWrite(bleu, LOW);
    pwd1.reset();  // on remet à zéro la saisie
  }
   else if  (pwd13.evaluate())
    {
      digitalWrite(green, HIGH);
        delay(200);
        digitalWrite(green, LOW);
        delay(200);
        digitalWrite(green, HIGH);
        delay(200);
        digitalWrite(green, LOW);
       
        pwd13.reset();  // on remet à zéro la saisie
       
    }
   
    // si aucun code n'est bon
    else
    {
      digitalWrite(red, HIGH);
        delay(500);
                digitalWrite(red, LOW);
                delay(1000);
     digitalWrite(red, HIGH);
        delay(200);
                digitalWrite(red, LOW);
                delay(1000);
                digitalWrite(red, HIGH);
        delay(500);
                digitalWrite(red, LOW);
               
       
    }
   
 
 
 // on remet à zéro systématiquement après avoir vérifié pour ne pas avoir d'erreur
 pwd1.reset();
 pwd13.reset();
}


le probleme c'est que seul le pwd1 est gere,quand je tape 1* j' alume bien les led voulu mais lorsque je tape 13* je passe dans la condition aucun code n'est bon au lieu de passer dans la boucle pwd13.evaluate() est ce une erreur dans mes boucle ou la gestion pwd ?

merci
yanick
 
Messages: 43
Inscription: Mer 30 Mai 2012 00:39

Re: action par rapport a un code clavier

Message non lude Laetitia » Lun 21 Juil 2014 11:32

Bonjour,

Le problème vient de la fonction kpdEvent.

Lorsque vous définissez un mot de passe avec la librairie Password, vous indiquez une cible, à laquelle sera comparée la saisie en cours. Dans votre switch(kpd.getState()), vous n'ajoutez les caractères qu'au premier mot de passe, il sera donc le seul à être comparé dans votre fonction checkPassword(). Si vous voulez comparer la saisie en cours avec plusieurs mots de passe, il faut modifier le switch comme suit :

Code: Tout sélectionner
switch (Key)
{
  // appui sur '*' -> vérification de la saisie en cours
  case '*' : checkPassword(); break;
  // appui sur '#' -> réinitialisation de la saisie en cours (tous mots de passe)
  case '#' : pwd1.reset(); pwd2.reset(), pwd13.reset(); pwd4.reset(); break;
  // sinon on ajoute le chiffre aux combinaisons
  default  : pwd1.append(Key); pwd2.append(Key), pwd13.append(Key); pwd4.append(Key); break;
}
"If it's itchy, scratch it !" - "DIY or die"

RTFM (À lire avant de poster) - ANDb (Arduino Noob Database)
Avatar de l’utilisateur
Laetitia
 
Messages: 296
Inscription: Mar 7 Aoû 2012 15:07
Localisation: Toulouse

Re: action par rapport a un code clavier

Message non lude yanick » Lun 21 Juil 2014 17:59

bonjour,

merci tout ceci semble marcher a la perfection reste a mettre le lcd,le xbee.....

merci encore
yanick
 
Messages: 43
Inscription: Mer 30 Mai 2012 00:39


Retourner vers Vos projets, vos idées

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité

cron