Go Down

Topic: Stoppare ciclo for (Read 2574 times) previous topic - next topic

daddi

Ciao a tutti vorrei capire insieme a voi come si possa stoppare o fermare un ciclo for dopo l'attivazione, quando arrivo ad una soglia da me impostata. ho tre led che devono accendersi graduatamene e una volta arrivati a 255 lui dovrebbe azzerarmi il valore e lanciarmi il break che se ho letto bene dovrebbe stoppare il ciclo for ma dopo tutte le prove non sono riuscito a farlo stoppare e azzerare la variabile. aggiungo il ciclo non è nel loop ma in un ciclo da me creato e poi richiamato dal loop,

Quote
void accensione() {
    if(prova == 0){
           for(int fadeValue = 0 ; ((fadeValue <= 255) && (prova == 0)); fadeValue +=5) {    // inizio ciclo for per attivazione colori in crescenza da rosso a blu a bianco stabile                        
   x = fadeValue;
   analogWrite(ledPinrosso, fadeValue);
    if (fadeValue > 254){      // bail out on sensor detect
      fadeValue = 0;

      break;
   }  
   delay(30);
 
 }
 if(x == 255){
 for (int valoreverde = 0 ;((valoreverde <= 255) && (prova == 0)); valoreverde +=5) {
   xx = valoreverde;
   analogWrite(ledPinverde, valoreverde);  
   if (valoreverde > 254){      // bail out on sensor detect
      valoreverde = 0;
      break;
   }  
  delay(30);
 }
 }
 if(xx == 255){
 for (int valoreblu = 0 ;((valoreblu <= 255) && (prova == 0)); valoreblu +=5) {
   xxx = valoreblu;
   analogWrite(ledPinblu, valoreblu);
    if (valoreblu > 254){      // bail out on sensor detect
      valoreblu = 0;
      break;
   }
   delay(30);
   
 }
}
}

  }

Una volta arrivati a 255 di tutti i valori poi si devono azzerare le variabili e fermare il ciclo for, invece tuttora lui esegue tutto arriva con tutti i led a 255 ma non si azzera e i led rimangono accesi .
Grazie a tutti e buona giornata  :)

leo72

Potresti spiegare brevemente cosa vuoi fare? Vedo if e for annidati, non riesco a capire cosa stai cercando di replicare.
   

uwefed

Il Tuo codice e il Tuo ragionamento hanno poco senso.
Se devi solo aumentare il PWM di 3 LED, prima il rosso, poi il verde e alla fine il blu e farlo solo se la variabile prova é zero Ti basta il seguente codice:
Code: [Select]
void accensione()
{
     if(prova == 0)
{
for(int fadeValue = 0 ; fadeValue <= 255 ; fadeValue +=5)
{                       
analogWrite(ledPinrosso, fadeValue);
delay(30); 
}
for (int valoreverde = 0 ; valoreverde <= 255; valoreverde +=5)
{
analogWrite(ledPinverde, valoreverde); 
delay(30);
}
for (int valoreblu = 0 ; valoreblu <= 255; valoreblu +=5)
{
analogWrite(ledPinblu, valoreblu);
delay(30);
}
}
}


Il for giá di suo cicla la variabile da 0 a 255. Non é necessario nessun controllo nel for se la variabie é arrivata al valore finale.

http://arduino.cc/en/Reference/For

Ciao Uwe



daddi

Ciao a tutti grazie mille per le risposte, allora riepiloghiamo:

L'abbreviazione e la semplificazione di uwefed e giustissima e cosi il ciclo funziona correttamente ma in più io vorrei che alla fine di questo ciclo di accensione i valori di questi led si dovranno azzerare e i led in conseguenza spegnere, cosa che il ciclo for non prevede perché lui a fine ciclo continua a darmi la variabile del valore a 255 per ciò vorrei utilizzare un break se ho capito bene che ad arrivo del valore 255 di ogni led mi faccia piombare la variabile a 0 e spegnermi il led,

In breve si devono accendere tutti graduatamene e al arrivo del valore 255 poi si devono resettare.

Grazie mille a tutti spero insieme di riuscire a risolvere questo problema, per ulteriori chiarimenti chiedetemi pure


tonid

Ciao,se vuoi che si accendano prima tutti per poi spegnerli tutti assieme devi fare così
Code: [Select]
void accensione()
{
     if(prova == 0)
{
for(int fadeValue = 0 ; fadeValue <= 255 ; fadeValue +=5)
{                       
analogWrite(ledPinrosso, fadeValue);
delay(30); 
}
for (int valoreverde = 0 ; valoreverde <= 255; valoreverde +=5)
{
analogWrite(ledPinverde, valoreverde); 
delay(30);
}
for (int valoreblu = 0 ; valoreblu <= 255; valoreblu +=5)
{
analogWrite(ledPinblu, valoreblu);
delay(30);
}
        fadeValue =0;
        valoreverde=0;
        valoreblu=0;
}
}

Altrimenti se vuoi spegnerli uno alla volta appena hanno finito di fare il loro rispettivo incremento devi assegnare alla variabile il valore di zero subito dopo ogni singolo ciclo for.

uwefed


In breve si devono accendere tutti graduatamene e al arrivo del valore 255 poi si devono resettare.

Il Tuo sketch non lo prevedeva. Settando la variable a 0 non significa che il correspondente LED si spenga, devi settare il PWM con quel valore.
Basta un "analogWrite(ledPinrosso, 0);" dopo i cicli for ( uno per ogni colore).

Ciao Uwe

daddi

grazie mille ancora per le risposte ma come ha detto tonid non funziona perché le variabili non possono esser resettate al esterno del ciclo for e l'Arduino mi da un errore  ( name lookup of 'fadeValue' changed for new ISO 'for' scoping ) come posso resettarle? forse con un break ma non ho mai sperimentato questa cosa e l'unica volta provata non funzionava!

tonid

Quote
grazie mille ancora per le risposte ma come ha detto tonid non funziona perché le variabili non possono esser resettate al esterno del ciclo for e l'Arduino mi da un errore  ( name lookup of 'fadeValue' changed for new ISO 'for' scoping ) come posso resettarle? forse con un break ma non ho mai sperimentato questa cosa e l'unica volta provata non funzionava!

Ti ha risposto uwe,stamattina che ho mandato il messaggio ero un po rinco.....
Quote
Basta un "analogWrite(ledPinrosso, 0);" dopo i cicli for ( uno per ogni colore).

Quindi lascia perdere ciò che ti ho suggerito stamattina,ripeto ero un po rinco, devi solo fare come dice uwe...
Ciao e scusa  8)

uwefed


grazie mille ancora per le risposte ma come ha detto tonid non funziona perché le variabili non possono esser resettate al esterno del ciclo for e l'Arduino mi da un errore  ( name lookup of 'fadeValue' changed for new ISO 'for' scoping ) come posso resettarle? forse con un break ma non ho mai sperimentato questa cosa e l'unica volta provata non funzionava!

Perche dovresti resettare le variabli. La prossima volta che chiami il for lo inizializza automatiamente.
for(int fadeValue = 0 ; fadeValue <= 255 ; fadeValue +=5)

Ciao Uwe

La funzione loop cicla all'infinito e quindi i cicli for vengono eseguiti sempre ad ogni ciclo del loop, se vuoi che le singole for da 0 a 255 vengano eseguite solo al primo ciclo di loop, rendi la variabile contatore globale, così raggiunto il valore di 255 le for non verrano più eseguite ma devi togliere l'inizializzazione dentro il for (i=0;) ma lasci il punto e virgola ;

Quando vuoi che la for venga eseguita azzeri il contatore i.

Io l'ho capita così.

Ciao.
AvrDudeQui front end per avrdude https://gitorious.org/avrdudequi/pages/Home

leo72


grazie mille ancora per le risposte ma come ha detto tonid non funziona perché le variabili non possono esser resettate al esterno del ciclo for e l'Arduino mi da un errore  ( name lookup of 'fadeValue' changed for new ISO 'for' scoping ) come posso resettarle? forse con un break ma non ho mai sperimentato questa cosa e l'unica volta provata non funzionava!

Si chiama spazio di visibilità. Una variabile esiste (viene "vista") solo all'interno del blocco di codice in cui è stata dichiarata. La variabile usata come contatore dal for esiste solo lì dentro.
Puoi però dare un valore iniziale a questo contatore. Ad esempio:
for (i=100; i<200; i++)
Qui "i" invece che partire da 0, parte da 100.

daddi

ook grazie mille a tutti ma avrei un alta domanda da farvi se volessi far girare il mio ciclo for al infinito dentro il programma nel loop e poi ad un certo punto vorrei mettere un ingresso digitale tramite interruttore che una volta che il suo stato è alto il mio ciclo for si deve stoppare al istante come si può fare? grazie mille a tutti buona domenica :-) 

Grazie, ricambio.

Il problema è che non parliamo la stessa lingua e chi deve imparare la mia sei tu.

Tutti i construtti che realizzano un ciclo (while, do while, for) permettono di specificare una condizione che se vera mette il codice in loop (ciclo) se la condizione è falsa si esce immediatamente dal ciclo e come conseguenza viene eseguita l'istruzione presente dopo il blocco che realizza il ciclo. Per uscire da qualunque ciclo esiste l'istruzione "break" che quando eseguita termina il ciclo e prosegue con la prossima istruzione. Quindi il ciclo non viene "stoppato", cioè fermato, ma semplicemente si esce dal ciclo.

Non ha senso inserire un tuo ciclo infinito all'interno della funzione loop() perchè questa deve poter operare, diversamente potresti avere comportamenti errati del tuo sketch, al momento non credo che tu abbia necessità di creare una loop interno alla funzione loop(). Comunque puoi usare un while (1) {} ciò che scrivi dentro le parentesi graffe verra eseguito in ciclo per sempre, ma la funzione loop non tornerà mai al chiamante.

All'interno di qualunque construtto per il ciclo puoi usare, if o switch per testare lo stato di un pin grazie a digitalRead e se la condizione e vera inserendo un break il ciclo verrà terminato.

Lo peseudo code:

// stampa a video o su seriale o in altro posto una sfilza interminabile di "ciao mondo", per sempre.
while (1)
{
     stampa("ciao mondo");
}

loop()
{

byte i;
while (1)
{
    stampa("ciao mondo");
    i++;
    // se "i" è maggiore di 10, cioè appena "i" diventa 11, viene eseguita la break che esce dal ciclo, ma ci rientrerà
    // subito dopo a causa della funzione loop() che una volta terminata verrà nuovamente chiamata e così via per sempre
    if (i > 10) 
        break;
}

}

Però mi sembra che gli esempi di codice presenti nell'ide tu non li abbia neanche guardati, sai sono molto utili e utile è modificarli,
pasticciarli e poi rimetterli a posto come in origine.

Ciao.

AvrDudeQui front end per avrdude https://gitorious.org/avrdudequi/pages/Home

uwefed

piú semplice é senza dover controllare una condiziona con if e fare un break

Code: [Select]
while (i<=10)
{
    stampa("ciao mondo");
    i++;
}


@daddi Ti consiglio di imparare le basi del C con qualche libro o tutorial.

Ciao Uwe

daddi

grazie mille per i consigli sono al inizio e volevo proprio iniziare sulla programmazione utilizzando arduino, perché mi sembra una valida piattaforma anche per i principianti.

comunque vorrei continuare con il cambiamento dei cicli for dal while come posso fare per far questo cambiamento sul mio programma quello che ho postato al inizio, non capisco molto bene sareste molto d'aiuto dandomi dei consigli grazie mille a tutti e buona giornata.

Go Up