Problema programmazione Keypad

Salve a tutti volevo presentarmi a questo forum di arduino per riuscire a trovare una soluzione ad un problema software.

Sono un neofita che ha appena iniziato la programmazione su questa piattaforma e ho riscontrato un problema con la programmazione di una scheda Arduino uno ed una tastiera a membrana keypad 4x4.

Il codice che quoterò qui sotto in pratica doveva far sì che quando il numero confermato sulla keypad premendo il tasto # risultasse inferiore a 4000 o superiore a 20 andava ad incrementare una variabile che avevo realizzato (Variabile int KeyFlag) quando tale variabile era uguale a 1 il codice doveva disabilitare la lettura da tastiera ed andare ad eseguire dei comandi assegnati nel ciclo if KeyFlag==1 (e fin qua ci siamo) ma una volta entrato nella sezione if KeyFlag==1 non sono stato più in grado di resettare la variabile KeyFlag a 0 per tornare a leggere i valori dalla Keypad quando volevo.

In questo esempio se sulla keypad viene scritto 55 e poi viene confermato con cancelletto # la variabile KeyFlag viene effettivamente portata a valore 1 in quanto il numero 55 è compreso fra 20 e 4000 come stabilito e il progrmma entra nello stato if KeyFlag==1 qui ho inserito l’accesione del led della schedina come debug per fare eseguire un comando ad arduino.
Il led si accende il problema è che rimarrà accesso per sempre in quanto non importa cosa faccio o cosa metto nel codice perché il programma si ferma lì e non ne vuole sapere di uscire dal if KeyFlag==1. Quello che chiedevo era se fosse possibile andare avanti indietro nella programmazione arduino per attivare “a chiamata” dei programmi che potevo attivare tramite variabili e resettarli a mio piacimento oppure è una cosa non fattibile? rimango in attesa di una vostra gentile risposta.

#include <Keypad.h>
const int ROW_NUM = 4; //four rows
const int COLUMN_NUM = 4; //four columns

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

byte pin_rows[ROW_NUM] = {9, 8, 7, 6}; //connect to the row pinouts of the keypad
byte pin_column[COLUMN_NUM] = {5, 4, 3, 2}; //connect to the column pinouts of the keypad

Keypad keypad = Keypad( makeKeymap(keys), pin_rows, pin_column, ROW_NUM, COLUMN_NUM );

String inputString;
long inputInt;
int Value;
int KeyFlag = 0;



void setup() {
  Serial.begin(9600);
  pinMode(13, OUTPUT);
  digitalWrite(13, LOW);
  inputString.reserve(10); // maximum number of digit for a number is 10, change if needed
}

void loop() {

  Serial.println(KeyFlag);

  if (inputInt > 4000 || inputInt < 20)
  {
    inputInt = 0;
    KeyFlag = 0;
  }
  else
  {
    KeyFlag = 1;
  }
  if (KeyFlag == 0) {
    char key = keypad.getKey();
    if (key)
    {
      Serial.println(key);
      if (key >= '0' && key <= '9')
      { // only act on numeric keys
        inputString += key;               // append new character to input string
      }
      else if (key == '#')
      {
        if (inputString.length() > 0)
        {
          inputInt = inputString.toInt(); // YOU GOT AN INTEGER NUMBER
          inputString = "";               // clear input
        }
      }
      else if (key == '*')
      {
        inputString = "";                 // clear input
      }
    }
  }

  if (KeyFlag == 1)
  {
    digitalWrite(13, HIGH);
    KeyFlag = 0;
  }
}

Buonasera e benvenuto :slight_smile: ,

essendo il tuo primo post nella sezione Italiana del forum, nel rispetto del regolamento di detta sezione (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione … possibilmente evitando di scrivere solo una riga di saluto) e di leggere con molta attenzione tutto il su citato REGOLAMENTO

… poi, in conformità al suddetto regolamento, punto 7, devi editare il tuo post qui sopra (quindi NON scrivendo un nuovo post, ma utilizzando il bottone a forma di piccola matita che si trova in basso del tuo post) e racchiudere il codice all’interno dei tag CODE.

In pratica, devi selezionare il tuo codice e poi usare il bottone </> per metterlo nell’apposita area dedicata al codice.

Ah, prima però DEVI formattarlo decentemente … lo prendi nell’IDE, premi CTRL T (formattazione automatica), lo reincolli nel post che editi e lo racchiudi nei tag code. Grazie. :slight_smile:

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposito thread e sistemato il codice come da regolamento, nessuno ti potrà rispondere, quindi ti consiglio di fare il tutto al più presto. :wink:

Salve Gugliemo, mi sono presentato e ho formattato il codice come lei ha gentilmente indicato. Purtroppo non mi sono apparse finestre di regolamento e/o indicazioni la prima volta che ho creato il mio account quindi non sapevo della presentazione/regolamento e nemmeno di come formattare il codice, mi scuso per l’inconveniente.

Oltre a KeyFlag devi azzerare anche inputInt.

Poi considera che quello che vuoi fare puoi farlo anche senza l’uso di String.

… assolutamnete nessun problema :slight_smile:

Le indicazioni sono nella pagina principale della sezione Italiana, ma …
… difficilmente qualcuno le legge :grinning_face_with_smiling_eyes: :grinning_face_with_smiling_eyes: :grinning_face_with_smiling_eyes:

Guglielmo

P.S.: Ripeto però … se riprendi il tuo codice nell’IDE e fai come ti ho detto, con il CTRL T … lo rendi estremamente più leggibile e la gente sarà più ben intenzionata ad aiutarti :wink:

non va bene come l’ho formattato? purtroppo io non sto usando l’ ide di arduino ma la versione online (arduino create)

Te l’ho formattato io usando l’IDE e ho sostituito il codice … guarda come DEVE essere un codice ben formattato ! :slight_smile:

Guglielmo

Oh, Grazie!!

Salve, scusa ma non ho avuto tempo questi giorni.

Riesci a spiegarmi perchè devo azzerare InputInt? non capisco come azzerarlo oppure no blocchi il programma nel rimanere nell’IF

Grazie.

Aspetta, in effetti il led rimane acceso anche perché non lo spegni mai…
Non c’è nessun digitalWrite con LOW.

Si è vero ma il problema e che una volta che keyflag mi diventa 1 non riesco più a farlo tornare a 0 per entrare di nuovo ad imettere numeri nella keypad. in teoria con questo programma una volta che ho digitato un numero tra 4000 e 20 keyflag deve andare a 1 e infatti ci và! ma però ci rimane per sempre a 1 e non capisco perchè... se entra nel ciclo If keyflag == 1 perchè non mi mette keyflag a 0 quando ho scritto che non appena keyflag è 1 mi deve tornare a 0 ?

if (KeyFlag == 1)
{
digitalWrite(13, HIGH);
KeyFlag = 0;
}

Il Keyflag si blocca a 1 e non mi lascia mettere numeri e non torna più a 0 una volta che entra quà ed è strano perchè appena entra in questo ciclo come è scritto keyflag dovrebbe azzerarsi

Grazie

Hai provato a mattere a zero anche inputInt?

Edit: quando ricominci il loop() la prima cosa che fai è verificare il valore di inputInt, che per forza di cose sarà uguale a prima e quindi rimetti keyflag a 1