Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème entée matrice 4*4 et affichage LCD 16*2

Stock et test entrée avec clavier matice 4*4

Sujet résolu
    30 novembre 2018 à 17:24:51

    Bonjour à toutes et à tous,

    J'ai un souci avec des entrée clavier depuis une matrice de boutons 4*4 vers un affichage LCD 16*2, j'utilise un arduino UNO.

    L'idée c'est de demandé à un joueur de choisir un code secret. une fois e code saisie on le stock dans une variable, un deuxième joueur doit essayé de trouvé le code dans un temps impartie. 

    Mon problème se trouve dans la partie "taper le code". Si je tape le code avec un bouton ca ne fonctionne pas, une fois passé le menu E_MenuCode, ma valeur de key reste à '0' et on entre directement dans la boucle IF du coup je stock la valeur '0' à chaque fois... et je ne peux pas la changé...

    Voici le code : 

    #include <Keypad.h>
    #include <Wire.h> 
    #include <LiquidCrystal_I2C.h>
    #include <Password.h>
    
    //i2c pins
    LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
    const byte ROWS = 4; // Four rows
    const byte COLS = 4; // Three columns
    // Define the Keymap
    char keys[ROWS][COLS] = {
      {'A','3','2','1'},
      {'B','6','5','4'},
      {'C','9','8','7'},
      {'D','#','0','*'}
    };
    
    // Connect keypad ROW0, ROW1, ROW2 and ROW3 to these Arduino pins.
    byte rowPins[ROWS] = { 9,8,7,6 };
    // Connect keypad COL0, COL1 and COL2 to these Arduino pins.
    byte colPins[COLS] = { 13,12,11,10 }; 
    
    // Create the Keypad
    Keypad kpd = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
    char Tab[8];
    int i=0;
    int Minute = 0;
    int Seconde = 0; 
    int choix = 0;
    int TempsSec = 0;
    int TempsMin = 0;
    int Code [3];
    int CodeSecret [3];
    int CodeTrouver[3];
    int CodeBase[3];
    int colonne = 7;
    int j=0;
    
    
    enum Etat {
      E_Initial,
      E_MenuPrincipal,
      E_MenuTemps,
      E_MenuCode,
      E_Depart,
      E_ChoixCode
    } etat_actuel, etat_precedent, etat_suivant;
     
    void setup()
    {
     
      Serial.begin(9600);
      lcd.begin(16,2);
      lcd.backlight();
    
      CodeBase[0]=0;
      CodeBase[1]=0;
      CodeBase[2]=0;
      CodeBase[3]=0;
    
      etat_actuel = etat_suivant = etat_precedent = E_Initial;
    }
     
    void loop()
    {
    	char key = kpd.getKey();
    
    	switch(etat_actuel)
    	{
    		case E_Initial:
    			etat_suivant = E_MenuPrincipal;
    		break;
    		case E_MenuPrincipal:
    			if(etat_actuel != etat_precedent)
    			{
    				// on vient d'entrer dans l'etat, donc on affiche le menu
    				//afficherMenuPrincipal();
    				lcd.clear();
    				lcd.setCursor(0,0);
    				lcd.print("1/ Temps 2/ Code");
    				lcd.setCursor(0,1);
    				lcd.print("3/ DEPART");
    			}
    			switch(key)
        		{
        			case '1':
        				etat_suivant = E_MenuTemps;
        			break;
        			case '2':
        				etat_suivant = E_MenuCode;
          			break;
          			case '3':
          				etat_suivant = E_Depart;
          			break;
        		}
         	break;
         	case E_MenuTemps:
         		// Entree dans le menu Temps
        		if(etat_actuel == E_MenuTemps)
        		{
          			// Affiche le menu temps 
          			lcd.clear();
          			lcd.setCursor(0,0);
    			lcd.print("1/ 20 m 2/ 30 m");
                            lcd.setCursor(0,1);
                            lcd.print("3/ 40 m 4/ 60 m");
                            delay(100);
        		}
        		switch(key)
        		{
        			// Selection du temps par les touches et on affiche la valeur
        			case '1':
          			TempsSec = 1200;
                            TempsMin = TempsSec/60;
          			lcd.clear();
          			lcd.setCursor(0,0);
          			lcd.print("Duree ");
    			lcd.print(TempsMin);
                            lcd.print(" minutes");
    			delay(2000);
    			etat_suivant = E_MenuPrincipal;
          			break;
           			case '2':
          			TempsSec = 1800;
                            TempsMin = TempsSec/60;
          			lcd.clear();
          			lcd.setCursor(0,0);
          			lcd.print("Duree ");
    			lcd.print(TempsMin);
                            lcd.print(" minutes");
    			delay(2000);
    			etat_suivant = E_MenuPrincipal;
          			break;
                    case '3':
          			TempsSec = 2400;
                            TempsMin = TempsSec/60;
          			lcd.clear();
          			lcd.setCursor(0,0);
          			lcd.print("Duree ");
    			lcd.print(TempsMin);
                            lcd.print(" minutes");
    			delay(2000);
    			etat_suivant = E_MenuPrincipal;
          			break;
                    case '4':
          			TempsSec = 3600;
                            TempsMin = TempsSec/60;
          			lcd.clear();
          			lcd.setCursor(0,0);
          			lcd.print("Duree ");
    		        lcd.print(TempsMin);
                            lcd.print(" minutes");
    			delay(2000);
    			etat_suivant = E_MenuPrincipal;
          			break;
          			default:
          			etat_suivant = E_MenuTemps;
          			break;
        		}
         	break;
    
         	case E_MenuCode:
         		// Entree dans le menu Code
         		if(etat_actuel != etat_precedent)
         		{
         			lcd.clear();
         			lcd.setCursor(0,0);
         			lcd.print("1/ Taper le code");
         			lcd.setCursor(0,1);
         			lcd.print("2/ Retour");
         		}
         		switch(key)
         		{
         			// Selection entre taper le code et retour
         			case '1':
         				etat_suivant = E_ChoixCode;
         			break;
         			
         			case '2':
         				etat_suivant = E_MenuPrincipal;
         			break;
         		}
         	break;
    
         	case E_ChoixCode:
         	// On demande à taper le code
         		DemandeCodeSecret();
         	break;
    
         	case E_Depart:
         		// Entree dans le depart de la partie
         		if (etat_actuel != etat_precedent)
         		{
         			if (TempsSec!=0)
         			{
         				while(TempsSec>0)
         				{
      				        Minute = (TempsSec/60);
        					Seconde = (TempsSec%60);
        					lcd.clear();
        					lcd.setCursor(1,0);
        					lcd.print("Temps restant");
        					lcd.setCursor(5,1);
        					lcd.print(Minute);
        					lcd.print("m");
        					lcd.print(Seconde);
        					lcd.print("s");
        					delay(1000);
        					TempsSec=TempsSec-1;
        					lcd.noDisplay();
        					delay(500);
        					lcd.display();
        					lcd.setCursor(0,0);
        					lcd.print("1/ Entrer code");
        				}						
      				lcd.clear();
      				lcd.setCursor(2,0);
      				lcd.print("****BOUM****");
     				delay(100000);
     				}
     			}
     			etat_suivant = E_MenuPrincipal;
         	}
       
      etat_precedent = etat_actuel;
      etat_actuel = etat_suivant;
    }
    
    
    void DemandeCodeSecret()
    {
    	// On attends qu'un touche soit appuyé
    	// Si une touche est appuyé on l'inscrit dans le tableau
    	char key = kpd.getKey();
        lcd.clear();
        lcd.setCursor(0,0);
        lcd.print("Code : ");
        key=key+'0';
        lcd.print(key);
        if ((key == '0') || (key == '1') || (key == '2')|| (key == '3')|| (key == '4')|| (key == '5')|| (key == '6')|| (key == '7')|| (key == '8')|| (key == '9')|| (key == 'A')|| (key == 'B')|| (key == 'C')|| (key == 'D')|| (key == '*')|| (key == '#'))
    	{ // alors on a tapé un chiffre
    		if(i<4)
    		{
    			lcd.setCursor(colonne, 0);
    			lcd.print(key);
    			colonne=colonne+1;
    			if(i==0)
    			{
    				CodeSecret[0]=key-'0';
    			}
    			if(i==1)
    			{
    				CodeSecret[1]=key-'0';
    			}
    			if(i==2)
    			{
    				CodeSecret[2]=key-'0';
    			}
    			if(i==3)
    			{
    				CodeSecret[3]=key-'0';
    			}
    			i++;
    		}
    		// On affiche le code pour vérifié
    	lcd.setCursor(0,1);
        lcd.print("CodeSec ");
        lcd.print(CodeSecret[0]);
        lcd.print(CodeSecret[1]);
        lcd.print(CodeSecret[2]);
        lcd.print(CodeSecret[3]);
        delay(3000);
        etat_suivant = E_MenuPrincipal;
        }
    }

    Quand je fais "un tour" voici le résultat :

    Code : 0
    Code Sec 0000

    Un deuxième tour :

    Code : 00
    Code Sec : 0000

    Un troisème :

    Code : 0 0
    Code Sec : 0000


    Je sais pas si je suis très clair o_O


     Si quelqu'un à un éclair de génie je suis preneur :p 

    Merci d'avance 

    • Partager sur Facebook
    • Partager sur Twitter
      4 décembre 2018 à 11:32:35

      Bonjour,

      Problème résolu, j'ai ajouté un switch case pour faire des choix et en fonction du choix je la mets dans un tableau c'est trivial mais ca fonctionne :lol:

      case E_ChoixCode:
           	// On demande à taper le code
           	if (etat_actuel != etat_precedent)
           	{
           		lcd.clear();
           		lcd.setCursor(0,0);
           		lcd.print("Code : ");
           	}
           	switch(key)
           	{
           		case '1':
           			if(i<4)
           			{
           				CodeSecret[i]=key-'0';
           				lcd.print(CodeSecret[i]);
           				i++;
           				etat_suivant = E_ChoixCode;
           			}
           			else
           				etat_suivant = E_MenuPrincipal;
           		break;
      

      du coup à répéter X fois pour avoir toute les possibilités que vous voulez.

      A bientôt :-°

      • Partager sur Facebook
      • Partager sur Twitter

      Problème entée matrice 4*4 et affichage LCD 16*2

      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
      • Editeur
      • Markdown