Ciclo appropriato in Setup per attesa comando

Buongiorno a tutti
Vorrei in fase di setup creare un'attesa di comando per poi procedere con altri comandi per via via passare al Loop.Nello specifico in fase di setup il programma chiede all'utente mediante lcd se vuole eseguire una intro e l'utente mediante una tastiera a matrice 4x4,premendo C dice no,mentre premendo D dice si. Ho pensato di inserire un ciclo while seguito da switch ma gli errori più comuni(cambiando istruzioni) sono stati: 1 funziona solo il comando D, 2 non funziona nessuno dei due, C funziona solo dopo aver premuto D.
Non sono una cima e oltre a una soluzione mi farebbe piacere anche una spiegazione per capire meglio come agire in futuro..grazie a tutti! Metto un piccolo pezzo di codice escludendo librerie e quant'altro poichè sto andando a memoria e non ho lo sketch qui al lavoro.

byte procedoM = 0;
byte introS = 0;
byte introN = 0;
*/ ho impostato la tastiera mediante la libreria keypad*/
void setup() {

*/chiede al programma via lcd se vuole eseguire la intro*/

while(procedoM == 0) {
char key = keypad.getKey();

switch(key) {

case 'D':
introS = 1;
procedoM = 1;
break;
case 'C':
introN = 1;
procedoM = 1;
break;
}
}
if (introS == 1) {
stampo via lcd "eseguo intro"
}
if (introN == 1) {
stampo via lcd "ok"
}
}

scusate in anticipo e spero di esser stato comprensibile.

Ciao

Non so come funziona la libreria, ma devi mettere un
while(nessun tasto premuto) {controlla la pressione dei tasti}

Quando viene premuto un tasto, salta alla funzione e poi ritorna.

Grazie per la risposta! :slight_smile:

La libreria è la keypad di arduino Arduino Playground - Keypad Library avevo anche visto che c'è la funzione "waitForKey()" che sostanzialmente da quello che avevo capito fà le stesse funzioni del while..ma si sblocca alla pressione di qualsiasi tasto o sbaglio? eventualmente come posso vincolarlo a sbloccarsi solo alla pressione di C o D?

Per come hai strutturato il codice dovrebbe funzionare, la logica è corretta. Se non funziona perchè dici che il tasto C funziona solo dopo aver premuto il tasto D allora i casi sono due, il tasto C non è gestito direttamente dalla libreria ma dalla tastiera (Es. cancella quando premuto in precedenza) ma questa mi sebra l’ipotesi meno probabile, la libreria gestisce il tasto C in modo differente rispetto agli altri.
A questo punto serve che indichi la librerie che stai usando, se possibile il link alla tastiera che stai usando (meno importante perché non credo dipenda dall’hardware), e il top sarebbe avere anche il tuo programma in modo da scongiurare eventuali errori in eso (magari anche banali tipo un = al posto di un == ad esmepio che potrebebro sfuggirti).
Io fossi in te prima di mandare tutto qui farei una prova banalissima, ovvero al posto di C e D prova ad usare 1 e 2 e vedi se a quel punto il tuo programma funziona come dovrebbe, se si allora ci si può focalizzare su come la libreria tratta il tasto C, se anche con 1 e 2 non funziona correttamente allora indagheremo il programma e la libreria
[Edit]
La libreria l’hai già indicata mentre stavo scrivendo :slight_smile:
[/Edit]

frami92:
avevo anche visto che c'è la funzione "waitForKey()" che sostanzialmente da quello che avevo capito fà le stesse funzioni del while..ma si sblocca alla pressione di qualsiasi tasto o sbaglio? eventualmente come posso vincolarlo a sbloccarsi solo alla pressione di C o D?

Quello che hai messo nel tuo "pseudo" programma di fatto fa già quel che chiedi, attende in un while infinito finché la tua variabile procedoM non viene settata a 1 e questo lo fai solo nei casi C e D gestiti.
Il metodo waitForKey non fa altro che fare questo:

char Keypad::waitForKey() {
	char waitKey = NO_KEY;
	while( (waitKey = getKey()) == NO_KEY );	// Block everything while waiting for a keypress.
	return waitKey;
}

ovvero attende in quel while ficnhè non hai premuto, dpodiché resituisce il tasto premuto.
Per come hai strutturato il programma non cambia granché tra la getKey e la waitForKey

fabpolli:
Per come hai strutturato il codice dovrebbe funzionare ...

In effetti mi spiace e mi sento anche un pò stupido postarvi a memoria il codice senza mettere tutto lo sketch ma ieri ho fatto tante di quelle prove che è da stamani che ci penso..sicuramente appena arrivo a casa metterò il codice completo..per il momento posso dirti che ieri ho provato anche a inserire If invece di switch e dopo l'assegnazione della variabile ho messo il break ma mi dava il problema di prendere solo 'D'.Per quanto riguarda la tastiera ho prima caricato (come faccio sempre) uno sketch di prova per la tastiera dove ad ogni pressione mi stampava sul serial monitor il tasto corrispondente e funzionano tutti.Siccome questo sarà uno di altri while presenti nel setup mi interessava capire come mai nel momento in cui nello switch/case modifico il valore della variabile il ciclo while non si sblocca e il setup non và avanti controllando le condizioni della parte If successiva.Se ti starai chiedendo come mai devo eseguire questa operazione nel setup è perchè più avanti l'utente dovrà poter impostare un tempo e una password e il calcolo del timer a ritroso lo farà nel ciclo loop. Grazie per la risposta e non appena riesco metto lo sketch completo(fino a dove sono arrivato) :slight_smile:

frami92:
In effetti mi spiace e mi sento anche un pò stupido postarvi a memoria il codice senza mettere tutto lo sketch

:smiley: per essere scritto a memoria è fatto pure troppo bene. Ti capisco quando una cosa non mi funziona ma "dovrebbe" funzionare non riesco neanch'io a togliermela dalla testa e non poter provare l'idea che mi è appena venuta è una tortura :slight_smile:

frami92:
Per quanto riguarda la tastiera ho prima caricato (come faccio sempre) uno sketch di prova per la tastiera ...

Quello ti fa solo che onore, sembra banale ma verificare che non sia un problema libreria/HW con un programma che non fa nulla se non stamparti i tasti è la cosa che si dovrebbe sempre fare in caso di problemi.
Io eviterei if break e quantaltro e mi atterrei alla versione che hai scritto a memoria che sembra logicamente perfetta.
Farlo nel setup o nel loop non cambia poi molto, io per mia deformazione nel setup faccio solo i settaggi :slight_smile: e tutto il resto lo gestisco con macchine a stati nel loop ma in questo caso non serve complicarsi la vita e nel setup va benissimo, poi quando avrai risolto e tutto funzionerà chissà che non ti verrà voglia di spostarlo nel loop.
Sembra banale ma una spiegazione del motivo che io preferisco fare tutto nel loop e limitarmi ai settaggi HW/SW nel setup è che, in questo modo, posso sempre rieseguire tutti gli stati.
Ad esempio alla fine del countdown potrei mostrare nuovamente il menù per vedere la demo oppure andare a settare un nuovo tempo per la "bomba da softair" ho azzeccato l'uso? :slight_smile:

fabpolli:
:smiley: per essere scritto a memoria è fatto pure troppo bene. Ti capisco quando una cosa non mi funziona ma "dovrebbe" funzionare non riesco neanch'io ....

....ci hai azzeccato in pieno sull'uso :smiley: :smiley: ;D. Purtroppo ho delle buone idee ma faccio fatica a metterle in atto e il tempo che posso dedicare a questo è veramente poco..ho preso un sacco di libri su arduino li ho letti e studiati ma mi piacerebbe avere delle solide base di wiring..fortunatamente con gli errori mi ricordo bene come fare..ci vuole molta pazienza e analizzare bene andando a esclusione.Questo progetto ci tengo molto portarlo a termine perchè ne vale davvero la pena ed è una novità nel settore.. grazie mille per i preziosi consigli :slight_smile:

Ricordo a tutti che quando si quota un post, NON è necessario riportarlo (inutilmente) tutto; bastano poche righe per far capire di cosa si parla ed a cosa ci si riferisce. Gli utenti da device "mobile" ringrazieranno per la cortesia :wink:

Inoltre, quando si risponde al post soprastante ... il "quote" è veramente superfluo ...

Guglielmo

P.S.: Ho troncato io i vostri lunghissimi "quote" qui sopra :wink:

In effetti hai ragione Guglielmo..chiedo scusa e lo terrò a mente per la prossima volta.devo ancora prendere dimestichezza con il forum :smiley:

Posto il codice completo…in questo caso non funziona nessun comando. :confused:

#include <VirtualWire.h>
#include <Keypad.h>
#include <U8g2lib.h>

U8G2_ST7920_128X64_F_SW_SPI u8g2(U8G2_R0, /* clock=*/ 52, /* data=*/ 51, /* CS=*/ 53);

int Scount = 00;
int Mcount = 00;
int Hcount = 00;

long secMillis = 0;
long interval = 1000;

int currentLenght = 0;

const byte ROWS = 4;
const byte COLS = 4;

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

byte rowPins[ROWS] = {28, 26, 24, 22};
byte colPins[COLS] = {36, 34, 32, 30};
byte introS = 0;
byte introN = 0;
byte procediM = 0;
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);


void setup() {
  u8g2.begin();
  u8g2.clearBuffer();
  u8g2.setFont(u8g2_font_crox2cb_tf);
  u8g2.drawStr(15, 15, "BENVENUTO");
  u8g2.drawStr(0, 30, "ESEGUO INTRO?");
  u8g2.drawStr(0, 55, "D=SI");
  u8g2.drawStr(70, 55, "C=NO");
  u8g2.sendBuffer();
  while (procediM == 0)
  {
    char key = keypad.getKey();
    switch (key)
    {
      case 'D':
        introS = 1;
        procediM = 1;
      case 'C':
        introN = 1;
        procediM = 1;
        
    }
  }
  if (introS == 1) {
    u8g2.clearBuffer();
    u8g2.setFont(u8g2_font_smart_patrol_nbp_tf );
    u8g2.drawStr(15, 15, "INIZIAMO");
    u8g2.drawStr(0, 30, "ACCENDERE LE RADIO");
    u8g2.drawStr(0, 55, "SUL CANALE P8");
    //u8g2.drawStr(70,55,"C=NO");
    u8g2.sendBuffer();
    if (introN == 1) {
      u8g2.clearBuffer();
      u8g2.setFont(u8g2_font_smart_patrol_nbp_tf );
      u8g2.drawStr(15, 15, "OK");
      //u8g2.drawStr(0,30,"ACCENDERE LE RADIO");
      //u8g2.drawStr(0,55,"SUL CANALE P8");
      //u8g2.drawStr(70,55,"C=NO");
      u8g2.sendBuffer();
    }
  }

}

Ho trovato l'errore... >:( non ci avevo fatto caso..comunque mi ha fatto piacere confrontarmi con voi e appreso di aver correttamente utilizzato il ciclo while :smiley:

l'errore è che mancava la { di chiusura nel primo If di verifica condizione rispetto allo sketch caricato..quindi la seconda condizione si verificava solo dopo la prima.

risolto

Te ne saresti accorto facilmente se avessi indentato correttamente il codice. :slight_smile: