Go Down

Topic: domanda: come uscire da for e poi rientrare? (Read 2210 times) previous topic - next topic

fracchia

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.

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 ...
"Sopravvivere" e' attualmente l'unico lusso che la maggior parte dei Cittadini italiani,
sia pure a costo di enormi sacrifici, riesce ancora a permettersi.

nid69ita

Senza vedere il codice, e dal poco che hai detto, possiamo dire poco.
my name is IGOR, not AIGOR

uwefed

Ma dove e come controlli l'azionamento del pulsante?


fracchia

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

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

fracchia

#6
Mar 16, 2017, 12:28 pm Last Edit: Mar 16, 2017, 12:43 pm by fracchia
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:
Code: [Select]
//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:
Code: [Select]
//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.

fracchia

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

Datman

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.
Hi,I'm Gianluca from Roma.I play&work with electronics since I was16(1984).
After 25yrs of maintenance on cameras&video mixers,since 2013myJob is HDTVstudios design.
Since Jan2015 IPlayWith Arduino:bit.ly/2F3LPWP
Thanks 4 a Karma if U like my answer

fracchia

#9
Mar 16, 2017, 04:34 pm Last Edit: Mar 16, 2017, 04:45 pm by fracchia
Ugualmente non funziona, entra e poi non esce più

fracchia

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.
Code: [Select]

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?
          }
        }

Datman

Hi,I'm Gianluca from Roma.I play&work with electronics since I was16(1984).
After 25yrs of maintenance on cameras&video mixers,since 2013myJob is HDTVstudios design.
Since Jan2015 IPlayWith Arduino:bit.ly/2F3LPWP
Thanks 4 a Karma if U like my answer

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 ?

Code: [Select]

...
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)
"Sopravvivere" e' attualmente l'unico lusso che la maggior parte dei Cittadini italiani,
sia pure a costo di enormi sacrifici, riesce ancora a permettersi.

fracchia

(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 ?

Code: [Select]

...
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

gpb01

#14
Mar 17, 2017, 04:26 pm Last Edit: Mar 17, 2017, 04:27 pm by gpb01
... ma vuoi che non esista un comando o qualcosa per uscire dal while?
NON ho letto tutto il thread, quindi rispondo SOLO a questa tua domanda 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
Search is Your friend ... or I am Your enemy !

Go Up