Keyboard mot de passe

bonjour j'ai pour projet de faire une boite pour clef avec un lecteur CD et un keyboard 16 touche
des code pour faire cela sont sur internet mais je ne vois pas l'interet de copier un code sur internet sans se creuser la tete donc j'ai ecris mon code pour mais le probleme : il ne faut pas que si on reste appuyer sur une touche trop lomgtemps le code soit rempli par exemple de 1

pour cela j'ai pencé que si la variable qui stocke les touche est mise a 55 au debut du loop comme ça si aucune touche est appuyer a la fin la variable est egale a 55 ce qui signifi pas d'appuie et pour que le probleme ne recommence lors que le bouton n'est pas appuyer je rajoute que si la touche dernierement enregistrai est 55 alors je ne passe pas a la case suivante mais le resultat est que le code est comblé du meme chiffre
branchements

ligne_0 2
ligne_1 3
ligne_2 4
ligne_3 5

colonne_0 8
colonne_1 9
colonne_2 10
colonne_3 11

#define ligne_0 2
#define ligne_1 3
#define ligne_2 4
#define ligne_3 5

#define colonne_0 8
#define colonne_1 9
#define colonne_2 10
#define colonne_3 11

int etat_colonne_0 = 0;
int etat_colonne_1 = 0;
int etat_colonne_2 = 0;
int etat_colonne_3 = 0;

int pressb = 55;

void setup(){
  // Initialise le port série
  Serial.begin(9600);

  // On configure les lignes en sorties
  pinMode(ligne_0, OUTPUT);
  pinMode(ligne_1, OUTPUT);
  pinMode(ligne_2, OUTPUT);
  pinMode(ligne_3, OUTPUT);

  // On configure les colonnes en entrées avec pull-up
  pinMode(colonne_0, INPUT_PULLUP);
  pinMode(colonne_1, INPUT_PULLUP);
  pinMode(colonne_2, INPUT_PULLUP);
  pinMode(colonne_3, INPUT_PULLUP);

}

void loop (){
  digitalWrite(ligne_0,HIGH);
  digitalWrite(ligne_1,LOW);
  digitalWrite(ligne_2,LOW);
  digitalWrite(ligne_3,LOW);

  etat_colonne_0 = digitalRead(colonne_0);
  etat_colonne_1 = digitalRead(colonne_1);
  etat_colonne_2 = digitalRead(colonne_2);
  etat_colonne_3 = digitalRead(colonne_3);


  if (etat_colonne_0 = 0){
    pressb = 1;//1
  }
  if (etat_colonne_1 = 0){
    pressb = 2;//2
  }

  if (etat_colonne_2 = 0){
    pressb = 3;//3
  }
  if (etat_colonne_3 = 0){
    pressb = 100;//A
  }

//-----------------ligne 2-----------------\\
  digitalWrite(ligne_0,LOW);
  digitalWrite(ligne_1,HIGH);
  digitalWrite(ligne_2,LOW);
  digitalWrite(ligne_3,LOW);

  etat_colonne_0 = digitalRead(colonne_0);
  etat_colonne_1 = digitalRead(colonne_1);
  etat_colonne_2 = digitalRead(colonne_2);
  etat_colonne_3 = digitalRead(colonne_3);

  if (etat_colonne_0 = 0){
    pressb = 4;
  }
  if (etat_colonne_1 = 0){
    pressb = 5;
  }

  if (etat_colonne_2 = 0){
    pressb = 6;
  }
  if (etat_colonne_3 = 0){
    pressb = 200;//B
  }

  
//-----------------ligne 3-----------------\\
  digitalWrite(ligne_0,LOW);
  digitalWrite(ligne_1,LOW);
  digitalWrite(ligne_2,HIGH);
  digitalWrite(ligne_3,LOW);

  etat_colonne_0 = digitalRead(colonne_0);
  etat_colonne_1 = digitalRead(colonne_1);
  etat_colonne_2 = digitalRead(colonne_2);
  etat_colonne_3 = digitalRead(colonne_3);

  if (etat_colonne_0 = 0){
    pressb = 7;
  }
  if (etat_colonne_1 = 0){
    pressb = 8;
  }

  if (etat_colonne_2 = 0){
    pressb = 9;
  }
  if (etat_colonne_3 = 0){
    pressb = 300;//C
  }

//-----------------ligne 3-----------------\\
  digitalWrite(ligne_0,LOW);
  digitalWrite(ligne_1,LOW);
  digitalWrite(ligne_2,LOW);
  digitalWrite(ligne_3,HIGH);

  etat_colonne_0 = digitalRead(colonne_0);
  etat_colonne_1 = digitalRead(colonne_1);
  etat_colonne_2 = digitalRead(colonne_2);
  etat_colonne_3 = digitalRead(colonne_3);

  if (etat_colonne_0 = 0){
    pressb = 1000;
  }
  if (etat_colonne_1 = 0){
    pressb = 0;
  }

  if (etat_colonne_2 = 0){
    pressb = 2000;
  }
  if (etat_colonne_3 = 0){
    pressb = 400;//D
  }
Serial.println(pressb);




}

merci de me dire ce que je fais mal

Bonsoir

tu avais posté dans la partie exclusivement anglophone du Forum Arduino.

Je viens de déplacer le message dans la partie Francophone , dont le mode d'emploi est ici :

:warning:
Post mis dans la mauvaise section, on parle anglais dans les forums généraux. déplacé vers le forum francophone.

Merci de prendre en compte les recommandations listées dans Les bonnes pratiques du Forum Francophone

ça par exemple

Le signe = indique une affectation.
Pour faire un test d'égalité c'est le symbole == qu'il faut utiliser.


Manifestement pour balayer le clavier, tu passes une ligne après l'autre à 1

or tu testes si la colonne est à 0 pour voir si une touches est active.

Le plus simple pour faire ce genre de traitement c'est de mémoriser dans un tableau l'état du clavier à l'instant T et de regarder à l'itération suivante ce qui a changé.

  • si une touche passe de l'état repos à l'état appuyé on déclare la touche activé
  • si une touche passe de l'état appuyé à l'état repos ou si rien n'a changé pas d'action
  • puis on mémorise le nouvel état du clavier
  • et on recommence

Tu peux aussi passer par des interruptions, qui te préviendra lorsqu'une touche est appuyée.
un très bon article là dessus.

Cela évite de scruter en permanence toutes tes touches et de sauvegarder leur états.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.