domanda: come uscire da for e poi rientrare?

Salve a tutti, sono nuovamente alla ricerca di aiuto e consigli in quanto non so che comando utilizzare. Il mio programma sta eseguendo un ciclo for, premo un pulsante ed entra in una sequenza di if per altre "applicazioni", ora, non so come poter tornare al ciclo for ripremendo nuovamente il pulsante. grazie.

Non sono sicuro di aver capito esattamente cosa vuoi fare, ma, cosi ad occhio, potresti usare una flag e mettere il for ed il ciclo di if all’interno di un’altro if/else (o magari all’interno di due routines che richiami con un’if/else)

Ad esempio, ogni volta che premi il pulsante, cambi stato ad una flag (chiamala ad esempio “stato” … lo so, che fantasia neh ? … :P) … poi con un’if principale fai tipo if stato==0 “ciclo for” else “serie di if” … ovviamente sia in “ciclo for” che in “serie di if” dovrai leggere il pulsante per sapere se cambiare di nuovo stato alla flag …

Se passa un programmatore vero magari te lo spiega meglio, comunque …

Senza vedere il codice, e dal poco che hai detto, possiamo dire poco.

Ma dove e come controlli l'azionamento del pulsante?

Etemenanki: Non sono sicuro di aver capito esattamente cosa vuoi fare, ma, cosi ad occhio, potresti usare una flag e mettere il for ed il ciclo di if all'interno di un'altro if/else (o magari all'interno di due routines che richiami con un'if/else)

Ad esempio, ogni volta che premi il pulsante, cambi stato ad una flag (chiamala ad esempio "stato" ... lo so, che fantasia neh ? ... :P) ... poi con un'if principale fai tipo if stato==0 "ciclo for" else "serie di if" ... ovviamente sia in "ciclo for" che in "serie di if" dovrai leggere il pulsante per sapere se cambiare di nuovo stato alla flag ...

Se passa un programmatore vero magari te lo spiega meglio, comunque ...

Si diciamo che ci siamo, praticamente con un pulsante devo passare da un ciclo "automatico", dove il programma lavora autonomamente, ad ciclo "manuale", dove sono io a variare le condizioni, a breve preparo il codice, è un po lungo e volevo renderlo snello prima di caricarlo così si capisce meglio

Dipende da come vuoi rientrare nel ciclo for, ci sono due possibilità

1 - Rientri PROSEGUENDO il ciclo for, esattamente dal punto in cui lo avevi lasciato

2 - Rientri INIZIANDO NUOVAMENTE TUTTO il ciclo for

Ok dopo varie prove non sono giunto a nulla, viste le mie scarse conoscenze in materia, questi sono i due sketch (chiamarli programmi sarebbe esagerato) che ho scritto, se caricati singolarmente funzionano a dovere, ora li dovrei unire in un unico programma.
Il primo che mi fa la dissolvenza dei colori in modo automatico:

//FADE
#define b 11
#define v 10
#define r 9
#define pin_potenziometro A0
int valore_potenziometro;
int tempo;
int pulsante;

void setup()    {
                pinMode(r,OUTPUT);
                pinMode(v,OUTPUT);
                pinMode(b,OUTPUT);
                }             
void loop()
{
valore_potenziometro=analogRead(pin_potenziometro);
tempo=map(valore_potenziometro, 1,1023 ,3,100);
analogWrite(b,255);
delay(tempo);
for (int i=0; i<=255; i=i+1)  
        {
        valore_potenziometro=analogRead(pin_potenziometro);
        tempo=map(valore_potenziometro, 1,1023 ,3,100);   
        analogWrite(v,i);
        delay(tempo);
        }
valore_potenziometro=analogRead(pin_potenziometro);
tempo=map(valore_potenziometro, 1,1023 ,5,200);
for (int i=255; i>=0; i=i-1)  
        { 
        valore_potenziometro=analogRead(pin_potenziometro);
        tempo=map(valore_potenziometro, 1,1023 ,3,100);      
        analogWrite(b,i);
        delay(tempo);
        }
valore_potenziometro=analogRead(pin_potenziometro);
tempo=map(valore_potenziometro, 1,1023 ,3,100);        
for (int i=0; i<=255; i=i+1)  
        {
        valore_potenziometro=analogRead(pin_potenziometro);
        tempo=map(valore_potenziometro, 1,1023 ,3,100);
        analogWrite(r,i);
        delay(tempo);                
        }
valore_potenziometro=analogRead(pin_potenziometro);
tempo=map(valore_potenziometro, 1,1023 ,3,100);
for (int i=255; i>=0; i=i-1)  
        {
        valore_potenziometro=analogRead(pin_potenziometro);
        tempo=map(valore_potenziometro, 1,1023 ,3,100);           
        analogWrite(v,i);
        delay(tempo);
        }    
valore_potenziometro=analogRead(pin_potenziometro);
tempo=map(valore_potenziometro, 1,1023 ,3,100);
for (int i=0; i<=255; i=i+1)  
        {   
        valore_potenziometro=analogRead(pin_potenziometro);
        tempo=map(valore_potenziometro, 1,1023 ,3,100);           
        analogWrite(b,i);
        delay(tempo);
        } 
valore_potenziometro=analogRead(pin_potenziometro);
tempo=map(valore_potenziometro, 1,1023 ,3,100);
for (int i=255; i>=0; i=i-1)  
        {   
        valore_potenziometro=analogRead(pin_potenziometro);
        tempo=map(valore_potenziometro, 1,1023 ,3,100);             
        analogWrite(r,i);
        delay(tempo);
        }    
}

E il secondo che mi permette di scegliere a piacimento il colore:

//CAMBIACOLORE
#define b 11
#define v 10  
#define r 9 
#define pin_potenziometro2 A1
int potenzval;
int rosso;
int verde;
int blu;
void setup()
           {
           pinMode(r, OUTPUT);
           pinMode(v, OUTPUT);
           pinMode(b, OUTPUT);
           }
void loop()
{
potenzval=analogRead(pin_potenziometro2);
if (potenzval >=0 and potenzval <=341)
             {
             verde=map(potenzval,0,341,0,255);
             rosso=map(potenzval,0,341,255,0);
             analogWrite(v,verde);
             analogWrite(r,rosso);
             analogWrite(b,0);
             }
if (potenzval >341 and potenzval<=682)
             {
             verde=map(potenzval,341,682,255,0);
             blu=map(potenzval,341,682,0,255);
             analogWrite(v,verde);
             analogWrite(b,blu);
             analogWrite(r,0);
             }
if (potenzval >682 and potenzval<=1023)
             {
             blu=map(potenzval,682,1023,255,0);
             rosso=map(potenzval,682,1023,0,255);
             analogWrite(b,blu);
             analogWrite(r,rosso);
             analogWrite(v,0);
             }
}

Praticamente dovrei unire i due sketch, in modo che alla pressione di un pulsante si possa passare da una funzione all’altra.
Meglio di così non so come spiegarmi, confido nel vostro aiuto sennò viste le mie attuali capacità mi vedo costretto a rinunciare al lavoro.

paulus1969: Dipende da come vuoi rientrare nel ciclo for, ci sono due possibilità

1 - Rientri PROSEGUENDO il ciclo for, esattamente dal punto in cui lo avevi lasciato

2 - Rientri INIZIANDO NUOVAMENTE TUTTO il ciclo for

Preferirei rientrando proseguendo il ciclo for, esattamente dal punto in cui lo avevo lasciato

Metti il for in un while che legge lo stato del pulsante; quando premi il pulsante esce e va altrove; quando ritorna, riprende il loop e cade nuovamente nel while. Usando variabili diverse , quando torni nel while hai i valori come li avevi lasciati.

Ugualmente non funziona, entra e poi non esce più

Bene, non so come ma sono riuscito ad unire i due programmi, ora alla pressione del pulsante riesco a passare dal ciclo for che mi cambiava colore in automatico al ciclo con la selezione “manuale” del colore, solo che ho bisogno di aiuto per il comando da inserire per uscire dal ciclo while.

for (int i=0; i<=255; i=i+1)  
        {
        valore_potenziometro=analogRead(pin_potenziometro);
        tempo=map(valore_potenziometro, 1,1023 ,3,100);   
        analogWrite(v,i);
        delay(tempo);
        puls=digitalRead(pinpuls);
        while((i<=255)and(puls==HIGH))               //perchè qui 6 parentesi e nel ciclo if solo 2?
          {
          potenzval=analogRead(pin_potenziometro2);
          if (potenzval >=0 and potenzval <=341)
             {
             verde=map(potenzval,0,341,0,255);
             rosso=map(potenzval,0,341,255,0);
             analogWrite(v,verde);
             analogWrite(r,rosso);
             analogWrite(b,0);
             }
          if (potenzval >341 and potenzval<=682)
             {
             verde=map(potenzval,341,682,255,0);
             blu=map(potenzval,341,682,0,255);
             analogWrite(v,verde);
             analogWrite(b,blu);
             analogWrite(r,0);
             }
          if (potenzval >682 and potenzval<=1023)
             {
             blu=map(potenzval,682,1023,255,0);
             rosso=map(potenzval,682,1023,0,255);
             analogWrite(b,blu);
             analogWrite(r,rosso);
             analogWrite(v,0);
             }
             
             // CHE CONDIZIONE/ISTRUZIONE/COMANDO DEVO INSERIRE PER USCIRE DAL CICLO WHILE E TORNARE AL FOR?
          }
        }

and si scrive &&! :)

(vediamo se da non programmatore, anche oggi riesco a scrivere una ca...volata :P :D)

... ed usare un'interrupt ? ... si, lo so che magari e' sprecato, ma una cosa tipo cosi non potrebbe funzionare ? ... o e' proprio inguardabile del tutto ?

...
usare un pulsante sul pin 2 (interrupt 0)
collegato a massa con pullup e debounce !!
...


void setup()
{
...
attachInterrupt(0, CambiaStato, FALLING);
}

void loop()
{
   ... 
   il resto del tuo sketch
   ...

   if(stato == 0)
   {
      ...
      pezzo di sketch che fa il for
      ...
   }
   else
   {
      ...
      pezzo di sketch che fa il manuale
      ...
   }

void CambiaStato()
{
stato = !stato;
}

(prima di iniziare a lanciare molotov, aspettate che entro nel bunker :P :D)

Etemenanki: (vediamo se da non programmatore, anche oggi riesco a scrivere una ca...volata :P :D)

... ed usare un'interrupt ? ... si, lo so che magari e' sprecato, ma una cosa tipo cosi non potrebbe funzionare ? ... o e' proprio inguardabile del tutto ?

...
usare un pulsante sul pin 2 (interrupt 0)
collegato a massa con pullup e debounce !!
...

void setup() { ... attachInterrupt(0, CambiaStato, FALLING); }

void loop() {   ...   il resto del tuo sketch   ...

  if(stato == 0)   {       ...       pezzo di sketch che fa il for       ...   }   else   {       ...       pezzo di sketch che fa il manuale       ...   }

void CambiaStato() { stato = !stato; }




(prima di iniziare a lanciare molotov, aspettate che entro nel bunker :P :D)

Oddio, sembra complicatissimo, dovrei riscrivere mezzo programma e magari trovarmi di fronte a problemi ancora maggiori, apprezzo la tua idea, ma vuoi che non esista un comando o qualcosa per uscire dal while? stento a crederci che sia così semplice entrare in un ciclo e non poterne uscire o tornare indietro

fracchia: ... ma vuoi che non esista un comando o qualcosa per uscire dal while?

NON ho letto tutto il thread, quindi [u]rispondo SOLO a questa tua domanda[/u] separata da tutto il contesto ...

... certo che si può uscire, come da qualunque ciclo (do ... while, while, for) ... basta usare la "break" che fa uscire immediatamente dal ciclo in cui ci si trova.

Guglielmo

while (pulsante non premuto) {ciclo}

Quando premi il pulsante esce e salta alla funzione while (pulsante premuto); // per attendere che venga lasciato while (pulsante non premuto) {altra operazione}

Quando premi: return

Ragazzi, questo thread è pieno di cose orripilanti e consigli fuorvianti.

Il punto chiave è che non si esce e rientra da un ciclo for a piacere. Se ti trovi a dover fare una cosa del genere, a meno di non sapere esattamente quel che stai facendo, c'è probabilmente un errore concettuale. Il ciclo for tipicamente si usa quando si deve ripetere qualcosa [u]per un numero stabilito di volte[/u]. Può capitare di dover uscire prima, ma non dovrebbe essere una cosa troppo frequente.

Nel tuo caso bisogna ripensare tutto da capo, ricordando che il loop() e già un ciclo di per sé: 1. Usa un flag che indica se la modalità è automatica è manuale. 2. All'inizio del loop() leggi il pulsante, se è premuto cambia modalità. 3. A questo punto verifica se la modalità è automatica o manuale, e comportati di conseguenza. L'ideale sarebbe avere due funzioni, ma immagino sia precoce, non te ne preoccupare per ora.

Fine, senza né for né while ;).

si lo so che è pieno di cose orripilanti, ma sono agli inizi e pian piano vorrei raggiungere il mio scopo, mi vien da ridere quando scrivono che arduino è semplice da usare, magari per uno che sa già programmare…eppure non devo fare nulla di complicato

Hai detto bene, Arduino è semplice per chi ha almeno un minimo di mente già orientata alla programmazione, altrimenti bisogna imparare, e le difficoltà non mancano di certo.

Comunque prova a riscrivere da capo lo sketch come ti ho suggerito, vedrai che è molto più semplice e lineare, senza salti, ingressi/uscite da cicli, ecc.

... usare l'interrupt e' proprio cosi sbagliato ? ... se si, perche' ?