Comando while

Salve a tutti, sapreste dirmi come faccio a far ripetere all'infinito una serie di comandi dentro un if? mi spiego meglio, ho scritto questo sketch (guardate la riga in cui c'e scritto ( if ((pulsantegioco==HIGH) and (gioco==0)) ) vorrei che dopo che le lampade fanno una serie di accensioni e spegnimenti alla fine del ciclo ricominci di nuovo daccapo a rifare quel ciclo finchè non ripremo il "pulsantegioco". mi è stato detto che devo utilizzare il comando while ma anche googlando non riesco a capirlo.
qui lo sketch:

int pulsanteverde;
int pulsanterosso;
int pulsanteblu;
int verde=0;
int rosso=0;
int blu=0;

int gioco=0;
int pulsantegioco;

void setup() {
pinMode(13, OUTPUT); //verde
pinMode(12, OUTPUT); //rosso
pinMode(11, OUTPUT); //blu

pinMode(10, INPUT); // verde
pinMode(9, INPUT); // rosso
pinMode(8, INPUT); // blu
pinMode(7, INPUT); // rosso + verde=giallo
pinMode(6, INPUT); // blu + verde=azzurro
pinMode(5, INPUT); // blu + rosso=viola
pinMode(4, INPUT); // blu + rosso + verde=bianco
pinMode(3,INPUT); //gioco di luci

}

void loop() {
pulsanteverde=digitalRead(10);
pulsanterosso=digitalRead(9);
pulsanteblu=digitalRead(8);
pulsantegioco=digitalRead(3);



if ((pulsanteverde==HIGH) and (verde==0)) { 
digitalWrite(13,HIGH);
digitalWrite(12,LOW);
digitalWrite(11,LOW);
verde=1; // verde passa ad acceso
delay(300);

}
else if ((pulsanteverde==HIGH) and (verde==0))
{
digitalWrite(13,LOW);
digitalWrite(12,LOW);
digitalWrite(11,LOW);
verde=0;
delay(300);
}
else if ((pulsanteverde==HIGH) and (verde==1))
{
digitalWrite(13,LOW);
digitalWrite(12,LOW);
digitalWrite(11,LOW);
verde=0;
delay(300);
}
if ((pulsanterosso==HIGH) and (rosso==0))
{
digitalWrite(12,HIGH);
digitalWrite(11,LOW);
digitalWrite(13,LOW);
rosso=1;
delay(300); 
}
else if ((pulsanterosso==HIGH) and (rosso==1))
{
digitalWrite(12,LOW);
digitalWrite(11,LOW);
digitalWrite(13,LOW);
rosso=0;
delay(300); 
}
if ((pulsanteblu==HIGH) and (blu==0))
{
digitalWrite(11,HIGH);
digitalWrite(12,LOW);
digitalWrite(13,LOW);
blu=1;
delay(300); 
}
else if ((pulsanteblu==HIGH) and (blu==1))
{
digitalWrite(11,LOW);
digitalWrite(12,LOW);
digitalWrite(13,LOW);
blu=0;
delay(300); 
}



if ((pulsantegioco==HIGH) and (gioco==0))
{

digitalWrite(13,HIGH);
delay(200);
digitalWrite(13,LOW);
digitalWrite(12,HIGH);
delay(200);
digitalWrite(11,HIGH);
digitalWrite(12,LOW); //verde13 rosso12 blu11
delay(200);
digitalWrite(12,HIGH); //viola 12+11
delay(200);
digitalWrite(13,HIGH);
digitalWrite(11,LOW);
delay(200);
digitalWrite(12,LOW);
digitalWrite(11,HIGH);
delay(200);
digitalWrite(13,HIGH);
digitalWrite(12,HIGH);
digitalWrite(11,HIGH);
gioco=1;


}
else if ((pulsantegioco==HIGH) and (gioco==1))
{
digitalWrite(13,LOW);
digitalWrite(12,LOW);
digitalWrite(11,LOW);
gioco=0;
delay(300);
}
}

Usa la modalità Code per il codice altrimenti spuntano cose insolite come delle 8) in mezzo

(Selezioni tutto il codice e premi l'icona col papiro, quella a sinistra dell'icona a forma di fumetto)

"and" .... si scrive &&

Sistemato questo, sarà più comprensibile.

In generale, tutto quello che c'è dentro il blocco

while (condizione)
{
   istruzioni
}

viene ripetuto fin quando la condizione è vera.
Quindi se vuoi che venga ripetuto fino alla pressione del pulsante devi mettere dentro il blocco di istruzioni del while la lettura del pulsante e mettere come condizione che nessuno abbia premuto il pulsante

boolean pulsante = 0;
while (pulsante ==0)
{
 varie istruzioni
 pulsante = digitalRead(....dove hai il pulsante);
}

Attenzione che se usi troppi delay potresti perderti la pressione del pulsante o dovresti tenerlo premuto per molto, infatti durante il delay il sistema è fermo ... casomai si risolve usando millis ma questa sarà una fase successiva

Fa anche piacere cercare di aiutarti qui, facendoti domande di più info

,invitare a presentarti, e, di la non dici più nulla, poi apri questo nuovo thread e NON segui il regolamento.

Il codice devi racchiuderlo nei tag code, vedi sezione 7 del regolamento, spiega bene come fare.
Altrimenti parte del codice può essere visualizzata male o mancare perchè interpretato come attributo del testo stesso.
Non hai visto che nel codice appare una faccina ?

anzichè utilizzare while proverei con mappare la sequenza delle pressioni,
al posto di "state" va bene "gioco"

int state=0; 
int pulsantegioco;
void setup() {
 Serial.begin(9600);
 pinMode(3,INPUT); 
}
void loop() {
 pulsantegioco= digitalRead (3);
 if (pulsantegioco==HIGH && state==0)
{ 
state=1; 
}
else if ((pulsantegioco==LOW) && state==1){
state=2;
}
else if ((pulsantegioco==HIGH) && state==2){
state=3;
} 
 else if ((pulsantegioco==LOW) && state==3){
state=0;
}
 Serial.println(state);
}

se apri il monitor seriale si capisce come funziona e che non servono i delay.
quindi poi :

if (state ==2){
//digitalWrite...continuo  
}
if (state ==3){
digitalWrite....off
}

nid69ita hai perfettamente ragione, adesso mi presento, riguardo quel post ci ho lasciato mano perchè troppo complicato per me (almeno per adesso) .
Riguardo quà ho risolto, grazie mille a tutti quanti, adesso mi presento :slight_smile:

Mistik:
nid69ita hai perfettamente ragione, adesso mi presento, riguardo quel post ci ho lasciato mano perchè troppo complicato per me (almeno per adesso) .
Riguardo quà ho risolto, grazie mille a tutti quanti, adesso mi presento :slight_smile:

Se hai voglia, posta il tuo codice che funziona, potrebbe essere utile a qualcun'altro con stesso problema :slight_smile:

P.S. nell'IDE prova CTRL+T, indenta automatico, migliora la leggibilità del codice