Go Down

Topic: Aiutatemi a capire dove sbaglio (Read 571 times) previous topic - next topic

Fabiok89

salve a tutti...vengo subito al punto sto creando un progetto con un menu dove vengono mostrate 2 modalità di gioco e in base al numero scelto parte la modalità selezionta.

Ho riscontranti 2 diversi problemi nelle 2 modalità di gioco(una con password x disattivare il conto alla rovescia e una conquista la bandiera con 2 pulsanti per la conquista)

nella prima modalità dopo che imposto la password(da 6 numeri) successivamente il tempo (H00:M00:S00)
parte il conto alla rovescia e gia posso digitare la password per fermare il gioco,

Code: [Select]
void confermapassword() {

  char key2 = keypad.getKey();
 // if (key2 == 'A') { //premi per scrivere la pass
    lcd.clear();
    lcd.home();
    lcd.setCursor(0, 2);
    lcd.print("Codice:");

    while (currentLength < 6) //aspetta la password
    {

      timer();
      char key2 = keypad.getKey();
      if (key2 == 'C') // premi x cancellare la pass
      {
        currentLength = 0;
        lcd.clear();
        lcd.setCursor(0, 2);
        lcd.print("Codice:");
      }
      else if (key2 != NO_KEY)
      {

        lcd.setCursor(currentLength + 7, 2);
        lcd.print(key2);
        entered[currentLength] = key2;
        currentLength++;
        delay(100);

        lcd.setCursor(currentLength + 6, 2);
        lcd.print("*");
        lcd.setCursor(currentLength + 7, 2);
        lcd.cursor();
      }
    }

    if (currentLength == 6)
    {
      if (entered[0] == password[0] && entered[1] == password[1] && entered[2] == password[2] && entered[3] == password[3] && entered[4] == password[4] && entered[5] == password[5])
      {
        lcd.noCursor();
        lcd.clear();
        lcd.home();
        lcd.setCursor(5, 0);
        lcd.print("Bomba");
        lcd.setCursor(2, 1);
        lcd.print("Disinnescata");
        currentLength = 0;
        delay(5000);
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("Riavvio");
        for (int i = 0; i <= 5; i++)
        {
          lcd.print(".");
          delay(1000);
        }
        // Riavvia();
      }
      else
      {
        codicesbagliato();
      }
    }
  }
}

come si vede da codice mi stampa a video la scritta codice e parte il contdown ,asp inserimento della password, e qui sorge il problema se io digito il codice prima cosa non me lo scrive nelle coordinate impostate e poi non mi fa mettere più di 4 cifre(quando il codice e di 6) se invece prima di inserire il codice premo 'C' tutto funziona correttamente, come può essere??? questo codice l ho usato su altri progetti e ho fatto copia e incolla come mai su questo mi sta dando questi problemi?

Ora passiamo alla seconda modalità di gioco che prevede la pressiamo di un pulsante e la cattura in base al tempo che imposto per la cattura di una bandiera immagginaria

Alla pressiamo del tasto deve partire una progress bar , con tempo(in Secondi)impostato da tastiera
il codice della progress bar l ho trovato su internet per LCD 16*2 , invece il mio progetto lo sto sviluppando su 20*4 quindi ha 4 quadrati in più

il mio problema e che quando premo il pulsante per catturare la zona li ultima 4 quadrati si accendono senza seguire la progress di seguito vi inserisco il codice quando la base e neutra e uno dei 2 team preme il pulsante e catturare la zona

Code: [Select]

void Barre() {
  for (int i = 0; i < 16; i++) {
    lcd.setCursor(i, 1);
    lcd.print ((char)255);
  }  //end if
}
/** nn incollo tutto il codice xkè e ripetitivo **/

if (bleu == 1) {
        Barre();
        for (int i = 15; i >= 0; i--) {
          for (int j = 5; j >= 0; j--) {
            lcd.setCursor(i, 1);
            lcd.print((uint8_t) j);
            delay (Tflag / 5);
            etat_boutonR = digitalRead(BP_PinR);
            if (etat_boutonR == LOW) {
              Barre();
              break;


mi sembra di non aver dimenticato nulla  : D

Patrick_M

#1
Jul 21, 2018, 03:39 pm Last Edit: Jul 21, 2018, 03:41 pm by Patrick_M
purtroppo mettendo solo "pezzi" di programma, è molto difficile capire cosa succede realmente.
Per la prima domanda la prima cosa che mi viene in mente è:
ma la variabile currentLength la azzeri prima di iniziare?

per la seconda domanda

se bleu = 1
fai una barra di 16 caratteri (senza attendere nessun secondo)
e subito dopo cominciando dal 15esimo all'indietro scrivi
però se etat_bouton è basso
riscrivi la barra....
di più non so

ancora una cosa perchè l'intero j per stamparlo lo passi a intero a 8 bit? da 5 a 0 sempre quello resta
per inserire (lo sketch) il programma, dall'IDE clicca modifica, clicca copia per il forum poi vieni qui e incolla nel tuo post (ctrl+v) ;)

Fabiok89

#2
Jul 21, 2018, 06:59 pm Last Edit: Jul 22, 2018, 12:16 am by Fabiok89
purtroppo mettendo solo "pezzi" di programma, è molto difficile capire cosa succede realmente.
Per la prima domanda la prima cosa che mi viene in mente è:
ma la variabile currentLength la azzeri prima di iniziare?

facciamo che per la prima domanda non ho mai chiesto aiuto ahahaha...che dimenticanza da nabbo...

si scs ho sbagliato ad inserire il codice di cattura della zona... Ecco tutto il codice

Code: [Select]
void redellacollina() {

 lcd.clear();
  lcd.setCursor(2, 0 ); lcd.print("Re della Collina");
  lcd.setCursor(0, 1); lcd.print("--------------------");
  lcd.setCursor(1, 2); lcd.print("Sel. Tempo Cattura");

  delay(1000);
 
  lcd.setCursor(0, 3); lcd.print("Tempo :"); lcd.setCursor (8, 3); lcd.print ("00 sec");
  Tflag = 0; currentLength = 0;
  while (currentLength < 2)
  {
    lcd.setCursor(currentLength + 8, 3);
    lcd.blink();
    char key = keypad.getKey();
    if (key != NO_KEY)
    {
      if ((key != '*') && (key != '#') && (key != 'A') && (key != 'B') && (key != 'C') && (key != 'D'))
      {
        lcd.print(key);
       Tflag = (10 * Tflag) + (key - '0');
        currentLength++;
        lcd.noBlink();
      }
    }
  }
  if (currentLength == 2) {
    delay(1000);
    cls();
    flag();

  }

  // End while

  cls();
  delay (1000);
  ripetere = 0;

}

void flag() {
  while (1) {

    //lecture de l'état des boutons

    etat_boutonR = digitalRead(BP_PinR);
    etat_boutonB = digitalRead(BP_PinB);

    if (etat_boutonR == HIGH ) {
      red();
    }
    if (etat_boutonB == HIGH ) {
      blue();
    }


    // Affichage de l'état de la base
    lcd.setCursor (3, 0);
    if (bleu == 0 && rouge == 0) {
      lcd.print ( "Base  Neutrale");
    }
    if (rouge == 1) {
      lcd.print ( "Base Conq Rossi");
    }
    if (bleu == 1) {
      lcd.print ( "Base Conq Blue");
    }

    if (rouge == 1) {
      compteurR = TinterR + millis() - TinitR;
    }
    if (bleu == 1) {
      compteurB = TinterB + millis() - TinitB;
    }

    printCompteurs (compteurR, compteurB);

  } // End While
} // End Void FLAG



// Fonction Calcul Compte à Rebour de la Bombe
void printCompteurs (unsigned long compteurR, unsigned long compteurB) {

  // Affichage Compteur Rouge
  timeCalc = (compteurR / 60000);
  lcd.setCursor(0, 1); lcd.print("  R ");
  // Affichage Minutes Rouge
  if ((timeCalc % 60) < 10) {
    lcd.print("0");
    lcd.print(timeCalc % 60);
  }
  else {
    lcd.print(timeCalc % 60);
  }
  lcd.print(":");
  // Affichage Secondes Rouge
  timeCalc = (compteurR / 1000);
  if ((timeCalc % 60) < 10) {
    lcd.print("0");
    lcd.print(timeCalc % 60);
  }
  else {
    lcd.print(timeCalc % 60);
  }
  lcd.print(" ");

  // Affichage Compteur Bleu
  timeCalc = (compteurB / 60000);
  lcd.write((uint8_t) 1);
  // Affichage Minutes Bleu
  if ((timeCalc % 60) < 10) {
    lcd.print("0");
    lcd.print(timeCalc % 60);
  }
  else {
    lcd.print(timeCalc % 60);
  }
  lcd.print(":");
  // Affichage Secondes Bleu
  timeCalc = (compteurB / 1000);
  if ((timeCalc % 60) < 10) {
    lcd.print("0");
    lcd.print(timeCalc % 60);
  }
  else {
    lcd.print(timeCalc % 60);
  }
  lcd.print(" B  ");

} // End Void printCompteurs



// Appui bouton ROUGE
void red() {

  if (etat_boutonR == HIGH ) {
    debut_appuiR = millis();

    while (etat_boutonR == HIGH & rouge == 0 ) {

      // Base Neutre --> Base Rouge
      if (bleu == 0) {
        lcd.setCursor(0, 1 ); lcd.print( "                    " );
        for (int i = 0; i <= 19; i++) {
          for (int j = 1; j <= 5; j++) {
            lcd.setCursor(i, 1);
            lcd.write((uint8_t) j);
            delay (Tflag / 5);
            etat_boutonR = digitalRead(BP_PinR);
            if (etat_boutonR == LOW) {
              break;
            }

            // Basculement Base Rouge
            if (i == 19 && j == 5) {
              rouge = 1;
              if (buzzer)tone (buzzer, 4000, 500);
              TinitR = millis();
              etat_ledB = LOW;
              etat_ledR = HIGH;
              digitalWrite(led_PinR, etat_ledR);
              digitalWrite(led_PinB, etat_ledB);
              lcd.setCursor(3, 0); lcd.print("Base Conq Rossi");
              lcd.setCursor(0, 0);
            } // End if

          } // End for j
          if (etat_boutonR == LOW) {
            break;
          }
        } // End for i
      }  //end if

      // Base Bleu --> Base Neutre
      if (bleu == 1) {
        Barre();
        for (int i = 19; i >= 0; i--) {
          for (int j = 5; j >= 0; j--) {
            lcd.setCursor(i, 1);
            lcd.print((uint8_t) j);
            delay (Tflag / 5);
            etat_boutonR = digitalRead(BP_PinR);
            if (etat_boutonR == LOW) {
              Barre();
              break;
            }

            // Basculement Base Neutre
            if (i == 0 && j == 0) {
              bleu = 0;
              if (buzzer)tone (buzzer, 4000, 500);
              TinterB = compteurB;
              etat_ledR = LOW;
              etat_ledB = LOW;
              digitalWrite(led_PinR, etat_ledR);
              digitalWrite(led_PinB, etat_ledB);

              lcd.setCursor(3, 0); lcd.print(" Base Neutrale ");
            } // End If

          } // End for j
          if (etat_boutonR == LOW) {
            Barre();
            break;
          }
        } // End for i
      }  //end if

      etat_boutonR = digitalRead(BP_PinR);

      delay (Tflag);

    }  //end while

  }  //end if
}  // End void rouge



// Appui bouton BLEU
void blue() {

  if (etat_boutonB == HIGH ) {
    debut_appuiB = millis();

    while (etat_boutonB == HIGH & bleu == 0 ) {

      // Base Neutre --> Base Bleue
      if (rouge == 0) {
        lcd.setCursor(0, 1); lcd.print( "                    " );
        for (int i = 0; i <= 19; i++) {
          for (int j = 1; j <= 5; j++) {
            lcd.setCursor(i, 1);
            lcd.write((uint8_t) j);
            delay (Tflag / 5);
            etat_boutonB = digitalRead(BP_PinB);
            if (etat_boutonB == LOW) {
              break;
            }

            // Basculement Base Bleue
            if (i == 19 && j == 5) {
              if (buzzer)tone (buzzer, 4000, 500);
              bleu = 1;
              TinitB = millis();
              etat_ledR = LOW;
              etat_ledB = HIGH;
              digitalWrite(led_PinR, etat_ledR);
              digitalWrite(led_PinB, etat_ledB);

              lcd.setCursor(3, 0);
              lcd.print("Base Conq Blue");
              lcd.setCursor(0, 0);
            } // End if

          } // End for j
          if (etat_boutonB == LOW) {
            break;
          }
        } // End for i
      }  //end if

      // Base Rouge --> Base Neutre
      if (rouge == 1) {
        Barre();
        for (int i = 19; i >= 0; i--) {
          for (int j = 5; j >= 0; j--) {
            lcd.setCursor(i, 1);
            lcd.write((uint8_t) j);
            delay (Tflag / 5);
            etat_boutonB = digitalRead(BP_PinB);
            if (etat_boutonB == LOW) {
              Barre();
              break;
            }

            // Basculement Base Neutre
            if (i == 0 && j == 0) {
              rouge = 0;
              if (buzzer)tone (buzzer, 4000, 500);
              TinterR = compteurR;
              etat_ledR = LOW;
              etat_ledB = LOW;
              digitalWrite(led_PinR, etat_ledR);
              digitalWrite(led_PinB, etat_ledB);

              lcd.setCursor(3, 0);
              lcd.print(" Base Neutrale ");
            } // End If

          } // End for j
          if (etat_boutonB == LOW) {
            Barre();
            break;
          }
        } // End for i
      }  //end if

      etat_boutonB = digitalRead(BP_PinB);

      delay (Tflag);

    }  //end while

  }  //end if
}  // End Void bleu

void tempopartita() {

  lcd.clear();
  lcd.setCursor(2, 0 ); lcd.print("Re della Collina");
  lcd.setCursor(0, 1); lcd.print("--------------------");
  lcd.setCursor(1, 2); lcd.print("Sel. Tempo Partita");
  lcd.setCursor(4, 3); lcd.print("00:00 HH:MM");
}


Edit:
sn riuscito a fare funzionare la progress-bar... ma avrei bisogno dell ultimo aiuto prima di chiudere il post

in origine il codice leggeva la pressione di un tasto e aggiungeva 5 sec ad ogni pressione, e questo ere il tempo che impiegava la progress-bar per completarsi...
io sto cercando di inserire il valore da tastiera, ma il tempo di completamento non mi coincide ...qualcuno ha una solozione??

Il valore che deve leggere la progress bar e Tflag nel progetto

Patrick_M

non ho capito il gioco :)

però ho notato che di solito hai messo (copiato :D )
Code: [Select]

          for (int i = 0; i <= 15; i++) {      // arriva a 15
               for (int j = 1; j <= 5; j++) {

tranne che nel bleu della funzione red (si vede che rouge non piaceva :) )
Code: [Select]

         if (bleu == 1) {
            Barre();
            for (int i = 19; i >= 0; i--) {         // parte da 19
               for (int j = 5; j >= 0; j--) {


ovviamente non ho capito se prima di ogni aggiornamento dell'lcd lo cancelli altrimenti avrai sempre quei 4 caratteri accesi se la base è passata da bleu -> neutra ...
per inserire (lo sketch) il programma, dall'IDE clicca modifica, clicca copia per il forum poi vieni qui e incolla nel tuo post (ctrl+v) ;)

Fabiok89

#4
Jul 22, 2018, 12:14 am Last Edit: Jul 22, 2018, 12:23 am by Fabiok89
non ho capito il gioco :)

però ho notato che di solito hai messo (copiato :D )
Code: [Select]

          for (int i = 0; i <= 15; i++) {      // arriva a 15
               for (int j = 1; j <= 5; j++) {

tranne che nel bleu della funzione red (si vede che rouge non piaceva :) )
Code: [Select]

         if (bleu == 1) {
            Barre();
            for (int i = 19; i >= 0; i--) {         // parte da 19
               for (int j = 5; j >= 0; j--) {


ovviamente non ho capito se prima di ogni aggiornamento dell'lcd lo cancelli altrimenti avrai sempre quei 4 caratteri accesi se la base è passata da bleu -> neutra ...

no ti spiego...quando parte la partita la base e neutrale...x esempio i blue conquistano e parte il loro tempo...quando arriva uno dei rossi preme il suo pulsante per rendere la base neutrale per poi conquistarla a sua volta...ora il mio problema e che non riesco a settare il tempo giusto (Tflag) quando lo imposto da tastiera esempio 10 sec appena invio lo skreth la cattura in 3 sec..se inv lo incremento con uno dei 2 pulsanti risulta corretto...hai qualche soluzione??

da pulsante io uso questo codice che funziona
Code: [Select]
if (digitalRead(BP_PinR) == HIGH) {TTflag = TTflag + 5; delay(300);}
            if (digitalRead(BP_PinB) == HIGH) {Tflag = TTflag *1000 /16; break;}

no riesco a convertire questa formula da inserimento pulsante a inserimento keypad 

Patrick_M

lo vedi che si continua a non capire un fischio?

da dove spunta fuori questo?
Quote
da pulsante io uso questo codice che funziona
Code: [Select]


if (digitalRead(BP_PinR) == HIGH) {TTflag = TTflag + 5; delay(300);}
            if (digitalRead(BP_PinB) == HIGH) {Tflag = TTflag *1000 /16; break;}

nel programma "completo" che avevi postato più sopra non ve n'è traccia
a parte che comunque mancavano sia la loop che setup e le definizioni varie....
per inserire (lo sketch) il programma, dall'IDE clicca modifica, clicca copia per il forum poi vieni qui e incolla nel tuo post (ctrl+v) ;)

Fabiok89

#6
Jul 22, 2018, 01:21 pm Last Edit: Jul 22, 2018, 01:24 pm by Fabiok89
lo vedi che si continua a non capire un fischio?

da dove spunta fuori questo?nel programma "completo" che avevi postato più sopra non ve n'è traccia
a parte che comunque mancavano sia la loop che setup e le definizioni varie....
Questo codice non fa parte del progetto... Lo preso da un'altro mio progetto che per aumentare i secondi usavo un pulsante... Invece in questo progetto voglio usare tastiera per settare i secondi

Tutto il progetto l ho diviso in varie tabelle e void... Incollare tutto il codice sarebbe un macello... Vediamo se stasera riesco e vi posto tutto

Silente

Altra cosa:
NON comprimere righe
Code: [Select]

if (...){...;...;...;...;}

É, in sede di compipazione IDENTIVO a
Code: [Select]

if (...)
{
  ...;
  ...;
  ...;
}

Ma il secondo é più comprensibile, anche perché con "strumenti"/" formattazione automatica" vedi meglio

krypton18

#8
Jul 22, 2018, 02:46 pm Last Edit: Jul 22, 2018, 03:02 pm by krypton18
Tutto il progetto l ho diviso in varie tabelle e void... Incollare tutto il codice sarebbe un macello... Vediamo se stasera riesco e vi posto tutto
Non c'è bisogno di postare il quote di tutto il codice, soprattutto se è lungo ed è laborioso farne il copia/incolla, carichi come allegato il file .ino del progetto e lo si può scaricare ed aprire con l'IDE.

Al punto 8 del regolamento c'è la spiegazione di come s'allega un file con le funzioni interne del forum.
Regolamento forum

Quote
no riesco a convertire questa formula da inserimento pulsante a inserimento keypad
Se per "inserimento keypad" intendi che vuoi testare se una particolare lettera/simbolo del tastierino è stata premuta e in tal caso eseguire un'azione, eccoti una possibile soluzione:
Code: [Select]

char pippo = keypad.getKey();

if (pippo == 'A') {
   TTflag = TTflag + 5;
   delay(300);
}

if (pippo == 'B') {
   Tflag = TTflag *1000 /16;
   break;
}


Le lettere e la variabile "pippo" sostituiscili a tuo piacimento.

Fabiok89

Non c'è bisogno di postare il quote di tutto il codice, soprattutto se è lungo ed è laborioso farne il copia/incolla, carichi come allegato il file .ino del progetto e lo si può scaricare ed aprire con l'IDE.

Al punto 8 del regolamento c'è la spiegazione di come s'allega un file con le funzioni interne del forum.
Regolamento forum
Se per "inserimento keypad" intendi che vuoi testare se una particolare lettera/simbolo del tastierino è stata premuta e in tal caso eseguire un'azione, eccoti una possibile soluzione:
Code: [Select]

char pippo = keypad.getKey();

if (pippo == 'A') {
   TTflag = TTflag + 5;
   delay(300);
}

if (pippo == 'B') {
   Tflag = TTflag *1000 /16;
   break;
}


Le lettere e la variabile "pippo" sostituiscili a tuo piacimento.
Si questa è una buona soluzione... Ma io volevo digitare proprio il tempo... Esempio 10 sec oppure 5...oppure 8... Sec... Male che vada se è troppo complicato uso questa soluzione

krypton18

#10
Jul 22, 2018, 03:31 pm Last Edit: Jul 22, 2018, 03:43 pm by krypton18
Si questa è una buona soluzione... Ma io volevo digitare proprio il tempo... Esempio 10 sec oppure 5...oppure 8... Sec... Male che vada se è troppo complicato uso questa soluzione
Che tipo di funzionalità vuoi ottenere? Non l'ho capito. Il tempo deve essere l'input di quale funzione, della delay() o di millis()? Mi spiego meglio: il tempo impostato deve essere un'attesa bloccante o l'esecuzione del programma deve proseguire in parallelo al tempo che scorre? Quanti secondi vuoi impostare al massimo?



krypton18

#11
Jul 22, 2018, 06:10 pm Last Edit: Jul 22, 2018, 07:40 pm by krypton18
il tempo impostato deve essere un'attesa bloccante o l'esecuzione del programma deve proseguire in parallelo al tempo che scorre? Quanti secondi vuoi impostare al massimo?
Siccome l'idea di riuscire a contare i caratteri inseriti da un tastierino mi servirà per un mio prossimo progetto, ho abbozzato un mini-programma per l'inserimento di un numero in formato char, che rappresenta i secondi, convertito successivamente in un intero lungo e usato come tempo d'attesa per un delay().  Il tutto inserito in un ciclo while, ma si può applicare anche a un ciclo for, che viene terminato se la condizione di controllo del ciclo diventa falsa OPPURE se si specifica un tempo d'attesa maggiore di zero trascorso il quale, senza che vengano eseguite altre istruzioni nel frattempo, il ciclo termina. Questo è il caso bloccante che citavo prima, se invece vuoi che durante l'attesa siano eseguite delle istruzioni si deve usare millis() e fare un po' di modifiche.


Non l'ho potuto provare, perché non ho ancora l'hardware, quindi errori logici potrebbero essercene. Si riesce a compilare, ho omesso la parte dove istanzio l'oggetto keypad. Comunque lo devi modificare per utilizzarlo nel tuo programma.

Code: [Select]

... altre tue istruzioni ...

  const int num_cifre = 3; //max numero di cifre (unità, decine, centinaia...) per memorizzare i secondi
 
  char secondi[num_cifre]; //vettore che in ogni posizione memorizza le cifre dei secondi

void setup() {

... altre tue istruzioni ...

}

void loop() {

unsigned long attesa = 0; //tempo di attesa per delay()
int  conta_cifre = 0; //contatore di cifre digitate
char cifra_prec = '\0'; //variabile che memorizza la cifra digitata precedentemente

... altre tue istruzioni ...

//si esce dal ciclo se si verifica tua_condizione OPPURE se si imposta un tempo di attesa > 0 dal tastierino
  while(tua_condizione) {
 
    char cifra = keypad.getKey(); //acquisizione cifra inserita da tastierino
   
    if(keypad.getState() == PRESSED && isDigit(cifra) && cifra != cifra_prec && conta_cifre < num_cifre) {
/*
E' stato premuto un tasto?
Il carattere acquisito è una cifra?
La cifra è diversa da quella inserita la volta prima?
Sono stati inserite meno cifre di quelle previste in num_cifre?
*/ 
      secondi[conta_cifre] = cifra; //memorizzo nella posizione conta_cifre la cifra immessa da tastierino
     
      conta_cifre++; //incremento la posizione di uno per memorizzare la cifra successiva
     
      cifra_prec = cifra;      //memorizzo la cifra inserita per confrontarla con la prossima
     
    }
    else if (conta_cifre == num_cifre && attesa == 0) { //se ho immesso tutte le cifre e l'attesa è nulla
      attesa = atol(secondi) * 1000;
//converto le cifre del tipo char, contenute nel vettore secondi, nel corrispondente numero in formato long integer
      conta_cifre = 0;
//azzero conta cifre per permettere di inserire un nuovo tempo di attesa se ne è stato scritto uno nullo (uguale a 0)
    }
    else if (attesa > 0){ //è stato inserito un tempo di attesa non-nullo?
      delay(attesa); //attensa di n secondi
      break; //uscita dal ciclo while
    }

    ... altre tue istruzioni ...

  }

  ... altre tue istruzioni ...

}

Fabiok89

#12
Jul 22, 2018, 06:46 pm Last Edit: Jul 22, 2018, 06:47 pm by Fabiok89
Che tipo di funzionalità vuoi ottenere? Non l'ho capito. Il tempo deve essere l'input di quale funzione, della delay() o di millis()? Mi spiego meglio: il tempo impostato deve essere un'attesa bloccante o l'esecuzione del programma deve proseguire in parallelo al tempo che scorre? Quanti secondi vuoi impostare al massimo?



dovrebbe essere bloccante quindi delay...xk mentre si conquista si deve bloccare il tempo della squadra che ha il controllo..
x i secondi da impostate da 0 a 59

krypton18

#13
Jul 22, 2018, 07:08 pm Last Edit: Jul 22, 2018, 07:37 pm by krypton18
Allora dovrebbe andar bene per quello che vuoi fare. Ho apportato una modifica all'abbozzo di programma. Ciò che è cambiato non era un errore logico, in compenso era uno sbaglio concettuale. Invece di verificare il fronte di salita di un tasto premuto, nel programma testavo se il carattere acquisito fosse diverso dal precedente per permetterne la memorizzazione nel vettore. Quindi se si volevano impostare 33 secondi, o 666 secondi :D,  non era possibile farlo.

Code: [Select]

... altre tue istruzioni ...

const int num_cifre = 3;    //max numero di cifre (unità, decine, centinaia...) per memorizzare i secondi
 
char secondi[num_cifre];    //vettore che in ogni posizione memorizza le cifre dei secondi


void setup() {

... altre tue istruzioni ...

}


void loop() {

unsigned long attesa = 0;   //tempo di attesa per delay()
int conta_cifre = 0;        //contatore di cifre digitate
bool buttonState = false;      //stato attuale del tasto (premuto o non premuto)
bool lastButtonState = false;  //stato precedente del tasto

  ... altre tue istruzioni ...

//si esce dal ciclo se si verifica tua_condizione OPPURE se si imposta un tempo di attesa > 0 dal tastierino
  while(tua_condizione) {
 
    char cifra = keypad.getKey(); //acquisizione cifra inserita da tastierino

    //rilevo le pressione di un tasto: se il tasto è premuto la variabile va a TRUE altrimenti se non premuto a FALSE
    (keypad.getState() == PRESSED) ? buttonState = true : buttonState = false;

    if (buttonState != lastButtonState) {   //Lo stato del tasto è variato rispetto alla volta precedente?
   
      if(buttonState && isDigit(cifra) && conta_cifre < num_cifre) {
  /*
  Si ha avuta la pressione di un tasto? (si valuta solo il fronte di salita)
  Il carattere acquisito è una cifra?
  Sono state inserite meno cifre di quelle previste in num_cifre?
  */   
        secondi[conta_cifre] = cifra;   //memorizzo nella posizione conta_cifre la cifra immessa da tastierino
       
        conta_cifre++;          //incremento la posizione di uno per memorizzare la cifra successiva
       
      }
      else if (conta_cifre == num_cifre && attesa == 0) { //se ho immesso tutte le cifre e l'attesa è nulla
        attesa = atol(secondi) * 1000;
  //converto le cifre del tipo char, contenute nel vettore secondi, nel corrispondente numero in formato long integer
        conta_cifre = 0;
  //azzero conta cifre per permettere di inserire un nuovo tempo di attesa se ne è stato scritto uno nullo (uguale a 0)
      }
      else if (attesa > 0){ //è stato inserito un tempo di attesa non-nullo?
        delay(attesa);    //attensa di n secondi
        break;        //uscita dal ciclo while
      }
     
      lastButtonState = buttonState;    //memorizzo lo stato del tasto
   
    }
      ... altre tue istruzioni ...
  }
... altre tue istruzioni ...
}

Fabiok89

#14
Jul 22, 2018, 07:42 pm Last Edit: Jul 22, 2018, 08:03 pm by Fabiok89
Allora dovrebbe andar bene per quello che vuoi fare. Ho apportato una modifica all'abbozzo di programma. Ciò che è cambiato non era un errore logico, in compenso era uno sbaglio concettuale. Invece di verificare il fronte di salita di un tasto premuto, nel programma testavo se il carattere acquisito fosse diverso dal precedente per permetterne la memorizzazione nel vettore. Quindi se si volevano impostare 33 secondi, o 666 secondi :D,  non era possibile farlo.

Code: [Select]

 ... altre tue istruzioni ...

const int num_cifre = 3;    //max numero di cifre (unità, decine, centinaia...) per memorizzare i secondi
  
char secondi[num_cifre];    //vettore che in ogni posizione memorizza le cifre dei secondi


void setup() {

 ... altre tue istruzioni ...

}

 
void loop() {

unsigned long attesa = 0;   //tempo di attesa per delay()
int conta_cifre = 0;        //contatore di cifre digitate
bool buttonState = false;      //stato attuale del tasto (premuto o non premuto)
bool lastButtonState = false;  //stato precedente del tasto

   ... altre tue istruzioni ...

//si esce dal ciclo se si verifica tua_condizione OPPURE se si imposta un tempo di attesa > 0 dal tastierino
  while(tua_condizione) {
  
    char cifra = keypad.getKey(); //acquisizione cifra inserita da tastierino

    //rilevo le pressione di un tasto: se il tasto è premuto la variabile va a TRUE altrimenti se non premuto a FALSE
    (keypad.getState() == PRESSED) ? buttonState = true : buttonState = false;

    if (buttonState != lastButtonState) {   //Lo stato del tasto è variato rispetto alla volta precedente?
    
      if(buttonState && isDigit(cifra) && conta_cifre < num_cifre) {
  /*
  Si ha avuta la pressione di un tasto? (si valuta solo il fronte di salita)
  Il carattere acquisito è una cifra?
  Sono state inserite meno cifre di quelle previste in num_cifre?
  */    
        secondi[conta_cifre] = cifra;   //memorizzo nella posizione conta_cifre la cifra immessa da tastierino
        
        conta_cifre++;          //incremento la posizione di uno per memorizzare la cifra successiva
        
      }
      else if (conta_cifre == num_cifre && attesa == 0) { //se ho immesso tutte le cifre e l'attesa è nulla
        attesa = atol(secondi) * 1000;
  //converto le cifre del tipo char, contenute nel vettore secondi, nel corrispondente numero in formato long integer
        conta_cifre = 0;
  //azzero conta cifre per permettere di inserire un nuovo tempo di attesa se ne è stato scritto uno nullo (uguale a 0)
      }
      else if (attesa > 0){ //è stato inserito un tempo di attesa non-nullo?
        delay(attesa);    //attensa di n secondi
        break;        //uscita dal ciclo while
      }
      
      lastButtonState = buttonState;    //memorizzo lo stato del tasto
    
    }
       ... altre tue istruzioni ...
  }
 ... altre tue istruzioni ...
}


vediamo se riesco ad inserirlo nel mio progetto...
da quanto ho letto più o meno e la stessa cosa che ho scritto io...solamente che nel mio caso il delay nn mi coincide la cifra dei secondi che imposto...

altra differenza che io nel void loop lo uso solo per richiamare le 2 modalità di gioco
vi posto l archivio completo cosi potete capire tutto il funzionamento meglio

Go Up