Aiuto digitazione tastiera

Buongiorno a tutti…ho un problema con il mio codice:

char tastobattuto;       // variabile di memorizzazione del carattere battuto
const byte righe = 5;    // numero di righe della tastiera (cinque)
const byte colonne = 4;  // numero di colonne della tastiera (quattro)
char chiave[righe][colonne] =
{ 
  {'A', 'B', '#', '*'},

  {'1', '2', '3', 'U'},

  {'4', '5', '6', 'D'},

  {'7', '8', '9', 'C'},

  {'L', '0', 'R', 'E'}
};

Keypad keypad = Keypad( makeKeymap(chiave), pinrighe, pincolonne, righe, colonne );

byte pinrighe[righe]     = {49, 47, 45, 43, 41}; //porte cui devono essere connessi i pin delle righe                                        
                                         
byte pincolonne[colonne] = {33, 35, 37, 39}; //porte cui devono essere connessi i pin delle colonne 


void ricevivalore (void)
{
  valore = 0;
  semaforo = 0;
  for (indtab = 0; indtab <= 6; indtab++)
    tabnum[indtab] = 0;
  indtab = 0;
while (semaforo == 0)             // loop di ricezione valori
  {
    tastobattuto = keypad.getKey(); // acquisisce il valore del tasto battuto 

    if (tastobattuto)               // se  e' stato battuto un tasto
    {
      lcd.print (tastobattuto);     // visualizza il tasto battuto sul display lcd
    }
    if (tastobattuto == 'C')
    {
      // annulla();
      lcd.clear();
      Riavvia();

      digitalWrite(17 , LOW);
    }

    if ((tastobattuto >= '0') && (tastobattuto <= '9'))
    {
      tabnum [indtab] = tastobattuto - 48; // memorizza il valore battuto, trasformato in
      //                                     un numero da 0 a 9
      indtab++;
    }

void loop()
{

}

nel loop ho il mio codice sottoforma di pagine menù e sottomenù .A me servirebbe che in alcune pagine di sottomenù alcuni tasti vengano disabilitati .Per esempio:
nel sottomenu 3 il tasto 1 del tastierino(keypad) anche se premuto non funzioni e quindi sia disabilitato.
oppure sia disabilitato tutta la prima riga o prima colonna per esempio.
Mi potete dare una mano per favore???

Metti degli if:

if(disabilitazione)
  {
  if(tastobattuto=='A' || tastobattuto=='B' || ...) tastobattuto==''
  }

Scusami potresti essere più preciso
Disabilitazione la devo dichiarare ???

Quando dei tasti devono non funzionare, un if li identifica e li annulla.

Perdonami Datman ma non capisco....ho provato ma non riesco a farlo funzioanre....
disabilitazione a cosa corrisponde???la devo dichairare????

disabilitazione sarebbe una (o più) variabile booleana, dichiarata in testa, che metti a vero quando sei in determinate pagine e metti a falso quando non sei in quelle pagine.
se la variabile è vera con un if non fai "funzionare" quei tasti

louis83:
nel sottomenu 3 il tasto 1 del tastierino(keypad) anche se premuto non funzioni e quindi sia disabilitato.
oppure sia disabilitato tutta la prima riga o prima colonna per esempio.

Beh intanto, come in precedenza, se non posti tutto il codice ma solo un pezzetto (quantomeno tutta la “ricevivalore” ed il setup) non è facile aiutarti. Che tu ci abbia dato le dichiarazioni di alcune variabili e costanti globali può andare bene, ma in questo caso in particolare non ci serve granché, poi dentro alla “ricevivalore” c’è un loop che non sappiamo come prosegua e/o come finisca, non sappiamo cosa fanno “semaforo”, “valore”, “tabnum”…

Restando in generale, per “disabilitare” si intende di solito “se anche lo premi non succede niente” quindi semplicemente è il tuo codice che deve ignorare certi tasti, ma per dirti come e dove serve, ripeto, almeno gran parte del codice reale. Se tu hai delle variabili che indicano in quale menu ti trovi, dovresti eventualmente usare quelle e dentro a “ricevivalore” annullare la lettura.

Immaginando ad esempio di avere una variabile “menu” con il numero del menu (0=principale, 1=sottomenu 1, 2= sottomenu 2 eccetera) potresti fare una cosa del genere:

...
  while (semaforo == 0)             // loop di ricezione valori
  {
    tastobattuto = keypad.getKey(); // acquisisce il valore del tasto battuto

    if (tastobattuto)               // se  e' stato battuto un tasto
      lcd.print (tastobattuto);     // visualizza il tasto battuto sul display lcd

    if (tastobattuto == 'C')
    {
      // annulla();
      lcd.clear();
      Riavvia();
      digitalWrite(17 , LOW);
    }

    // Tasti disabilitati nei singoli sottomenu
    if ( menu == 3 && tastobattuto == '1' )
      tastobattuto = 0; // Annullo l'input

    if ((tastobattuto >= '0') && (tastobattuto <= '9'))
    {
      tabnum [indtab] = tastobattuto - 48; // memorizza il valore battuto, trasformato in
...

Niente da fare purtroppo…
ho provato in questo modo pure:

int registra = 0;

registra = 0 //impostato nelle pagine menu che mi interessano 

char tastobattuto;       // variabile di memorizzazione del carattere battuto
const byte righe = 5;    // numero di righe della tastiera (cinque)
const byte colonne = 4;  // numero di colonne della tastiera (quattro)
char chiave[righe][colonne] =
{ 
  {'A', 'B', '#', '*'},

  {'1', '2', '3', 'U'},

  {'4', '5', '6', 'D'},

  {'7', '8', '9', 'C'},

  {'L', '0', 'R', 'E'}
};

byte pinrighe[righe]     = {49, 47, 45, 43, 41}; //porte cui devono essere connessi i pin delle righe

byte pincolonne[colonne] = {33, 35, 37, 39}; //porte cui devono essere connessi i pin delle colonne

Keypad keypad = Keypad( makeKeymap(chiave), pinrighe, pincolonne, righe, colonne );


while (semaforo == 0)             // loop di ricezione valori
 {
   tastobattuto = keypad.getKey(); // acquisisce il valore del tasto battuto

   if (tastobattuto)               // se  e' stato battuto un tasto
     lcd.print (tastobattuto);     // visualizza il tasto battuto sul display lcd

   if (tastobattuto == 'C')
   {
    
     lcd.clear();
     Riavvia();
     digitalWrite(17 , LOW);
   }

   // Tasti disabilitati nei singoli sottomenu
   if ( registra == 1 && tastobattuto == '1' )
     tastobattuto = 0; // Annullo l'input

   if ((tastobattuto >= '0') && (tastobattuto <= '9'))
   {
     tabnum [indtab] = tastobattuto - 48; // memorizza il valore battuto, trasformato in

I tasti nelle varie pagine continuano a funzionare sempre…

Come dice docdoc, vedendo solo quel pezzetto non si capisce nulla… :frowning:

Si ma vedi, ti abbiamo già dato molte indicazioni, ma se non posti tutto il codice non possiamo sicuramente aiutarti.

Per di più il regolamento del forum dice che non possiamo programmare noi per tuo conto, ed il che significa che più di quello che ti abbiamo detto è difficile che tu possa ottenerlo (tanto più senza poter vedere tutto il codice): devi scrivere tu il codice e poi possiamo eventualmente dirti dove sbagli (cosa che, in parte, abbiamo già fatto anche più volte, nei limiti delle poche righe di istruzioni che hai postato), postando il programma utilizzato e descrivendo quindi più precisamente possibile cosa fa (o non fa).

Niente da fare purtroppo…
ho provato in questo modo pure:

int registra = 0;

registra = 0  //impostato nelle pagine menu che mi interessano 

String codiceAutorizzato = "6921745477C";

String codiceLetto = "";

char tastobattuto;       // variabile di memorizzazione del carattere battuto
const byte righe = 5;    // numero di righe della tastiera (cinque)
const byte colonne = 4;  // numero di colonne della tastiera (quattro)
char chiave[righe][colonne] =
{ 
  {'A', 'B', '#', '*'},

  {'1', '2', '3', 'U'},

  {'4', '5', '6', 'D'},

  {'7', '8', '9', 'C'},

  {'L', '0', 'R', 'E'}
};

byte pinrighe[righe]     = {49, 47, 45, 43, 41}; //porte cui devono essere connessi i pin delle righe

byte pincolonne[colonne] = {33, 35, 37, 39}; //porte cui devono essere connessi i pin delle colonne

Keypad keypad = Keypad( makeKeymap(chiave), pinrighe, pincolonne, righe, colonne );


while (semaforo == 0)             // loop di ricezione valori
 {
   tastobattuto = keypad.getKey(); // acquisisce il valore del tasto battuto

   if (tastobattuto)               // se  e' stato battuto un tasto
     lcd.print (tastobattuto);     // visualizza il tasto battuto sul display lcd

   if (tastobattuto == 'C')
   {
    
     lcd.clear();
     Riavvia();
     digitalWrite(17 , LOW);
   }

   // Tasti disabilitati nei singoli sottomenu
   if ( registra == 1 && tastobattuto == '1' )
     tastobattuto = 0; // Annullo l'input

   if ((tastobattuto >= '0') && (tastobattuto <= '9'))
   {
     tabnum [indtab] = tastobattuto - 48; 

void setup()
{
  digitalWrite(17 , LOW);
  pinMode (17, OUTPUT);   
  pinMode (16, OUTPUT);     
  pinMode (15, OUTPUT);       
  pinMode (14, OUTPUT); 
      
  pinMode(buzzerPin, OUTPUT);

  pinMode(P_led, OUTPUT);
  pinMode(P_relay, OUTPUT);
  pinMode(P_button, INPUT);


  mySerial.begin(19200);  // Initialize SoftwareSerial

  printer.begin();       // Inizializza la stampante (stesso baudrate della trasmissione seriale)

  delay (2000);

  setSyncProvider(RTC.get);

  lcd.begin(20, 4);    // inizializza il display (20 caratteri per 4 righe)

  Wire.begin();
 
  Serial.begin(9600);

  RTC.begin();
  
  SPI.begin();  /* Abilita SPI*/

  RC522.init();    /* Viene inizilizzato RFID reader */

  pinMode (ledverde, OUTPUT);

  pinMode (ledrosso, OUTPUT);


void loop()
{

  if (RC522.isCard())    // Se viene letta una tessera
  {
    
    RC522.readCardSerial(); // Viene letto il suo codice

    String codiceLetto = "";


    for (i = 0; i <= 4; i++)
    {
      codiceLetto += String (RC522.serNum[i], HEX);
      codiceLetto.toUpperCase();
    }

  
    if (verificaCodice(codiceLetto, codiceAutorizzato))
    { 
registra=1;

da verifice codice letto-codiceAutorizzato inizia una pagina dove inserire dei valore numerici…e qui voglio che per errore non si digiti la lettera A o B del keypad ma solo i tasti numerici…Tutto qui il problema…Voglio disabilitare quei due tasti dal keypad.

Ahhh è possibile disabilitare un intera riga o colonna???

Continui a postare solo spezzoni di codice (ad esempio, ti pare che quello che hai postato sia compilabile?) e sembri non aver capito quale codice ti abbia io inserito come "if", inoltre adesso dici una cosa diversa da quella che dicevi prima (prima dicevi di non volere il tasto '1' nel submenu 3, adesso che non vuoi i tasti 'A' e 'B'), per cui mi spiace, ma ora rinuncio e passo la parola ad altri.

louis83:
… e qui voglio che per errore non si digiti la lettera A o B del keypad ma solo i tasti numerici…

… cosa che, da che mondo è mondo, NON si fa disabilitando tasti sulla tastiera, ma ignorando quelli che non fanno parte del set di caratteri di interesse!

Se a me interessano solo i valori numerici, per ogni pressione, verificherò che il tasto premuto sia tra 0 e 9 e scarterò qualsiasi altra cosa semplicemente ignorandola come se non fosse mai stata premuta.

Guglielmo

Scusami docdoc ma nel codice-soluzione che tu hai pubblicato nei post precedenti sia che metto ‘1’ o ‘2’ o ‘A’ o ‘B?’ non funziona…quindi

Guglielmo perdonami a me non interessano solo i valori numerici.
A volte mi servono dal keypad solo le lettere, a volte solo i numeri, a volte entrambi .

Ma avendo le elttere del keypad su una stessa riga…si potrebbe disabilitare tutta la riga???

louis83:
Guglielmo perdonami a me non interessano solo i valori numerici.
A volte mi servono dal keypad solo le lettere, a volte solo i numeri, a volte entrambi .

E quindi ? ? ? :o :o :o

A volte scari gli uni, a volte scarti gli altri e a volte non scarti nulla ... a livello di logica di codice NON cambia una virgola.

Guglielmo

Scusami Guglielmo ma ho provato diverse combinazioni .....ma le lettere A B C D # * non riesco a disabilitarle con il mio codice.

Infatti NON devi "disabilitare" nulla, devi "scartare" ... tu leggi un tasto, se è tra quelli accettabili lo consideri, altrimenti fai finta che nulla sia stato premuto.

Guglielmo

Niente da fare non funziona…ma scusate non è che il problema è la tastiera 5x4 …e quindi occore una libreria particolare.
I numeri riesco a gestirli mentre lettere e simboli non ne vogliono sapere…se pigiati vengono scritti sul display.

char tastobattuto;       // variabile di memorizzazione del carattere battuto
const byte righe = 5;    // numero di righe della tastiera (cinque)
const byte colonne = 4;  // numero di colonne della tastiera (quattro)
char chiave[righe][colonne] =
{
 {'A', 'B', '#', '*'},

 {'1', '2', '3', 'U'},

 {'4', '5', '6', 'D'},

 {'7', '8', '9', 'C'},

 {'L', '0', 'R', 'E'}
};

byte pinrighe[righe]     = {49, 47, 45, 43, 41}; //porte cui devono essere connessi i pin delle righe
byte pincolonne[colonne] = {33, 35, 37, 39}; //porte cui devono essere connessi i pin delle colonne

Keypad keypad = Keypad( makeKeymap(chiave), pinrighe, pincolonne, righe, colonne );

louis83:
Niente da fare non funziona.....ma scusate non è che il problema è la tastiera 5x4 .....e quindi occore una libreria particolare.

Ti stanno dicendo in mille mila modi che è un problema di logica del tuo programma, di postarlo per intero per aiutarti meglio, ecc. e tu persisti nel teorizzare problemi di libreria, di tastiera fisica, di ognigraziadiddio invece di dar retta a chi ti sta cercando di aiutare e che, senza ombra di dubbio, sa di cosa sta parlando.

Non può funzionare con un while in mezzo alla dichiarazione delle variabili, fuori dal loop...