Go Down

Topic: chiarimento funzione for (Read 961 times) previous topic - next topic

bit95

ciao a tutti.

sono nuovo, non ho ancora avuto tempo di presentarmi, lo farò appena possibile.

sto facendo i primi esperimenti  con arduino grazie al libro"primi passi con arduino"fino ad adesso procedeva bene finchè mi sono imbattuto in un progetto:

il circuito è un semplice buzzer, al quale la frequenza del tone è regolata dal entrata analogica di una fotoresisteza,fino a qui tutto bene, poi il libro dice testuali parole"crea un "effetto spaziale" variando la singola nota in una breve scala da più note in sequenza, con la partenza che dipende dalla fotoresistenza."

tutto questo con l'aiuto del ciclo for,  di cui non capisco la funzione.

questo è il programma:

int buzzer=9;
int foto=0;
int nota;

void setup () {
pinMode(buzzer,OUTPUT);
}

void loop () {
  nota=analogRead(foto)+500;
for(int i=0 ;i<7; i++)
{
  tone(buzzer,(nota+(50*i)));
  delay(10);
}
noTone(9);
delay(50);
}

ci sarebbe qualche anima pia che mi potrebbe spiegare la funzione for, e in questo contesto cosa fa??.

spero di non aver infranto qualche regola del forum XD.

ciao

pablos

#1
Oct 08, 2012, 12:27 pm Last Edit: Oct 08, 2012, 12:31 pm by pablos Reason: 1
Partiamo dal principio che i programmi vengono letti in modo sequenziale a meno che non ci siano dei salti a funzioni varie.
Quando viene incontrato il FOR tutto quello che si trova dentro le sue graffe viene ripetuto n volte definito nella funzione.

Nel tuo caso

for(int i=0 ;i<7; i++)
{
 tone(buzzer,(nota+(50*i)));
 delay(10);
}

int i=0 parte da 0
i<7; verifica se i è minore di 7
i++  incrementa la variab i di 1 ad ogni passaggio

quando è minore di 7 cioè 6 esce dal ciclo for e prosegue con le altre istruzioni

tone(buzzer,(nota+(50*0)))
tone(buzzer,(nota+(50*1)))
tone(buzzer,(nota+(50*2)))
tone(buzzer,(nota+(50*3)))
tone(buzzer,(nota+(50*4)))
tone(buzzer,(nota+(50*5)))
tone(buzzer,(nota+(50*6)))
esco dal FOR
no comment

bit95

grazie mille della risposta, la cosa ora mi è ancora più chiara, ma non ho ancora capito.

il problema sta nel fatto che non capisco cosa rappresenta i.

è l'entrata analogica?

un valore casuale?

ciao

leo72


grazie mille della risposta, la cosa ora mi è ancora più chiara, ma non ho ancora capito.

il problema sta nel fatto che non capisco cosa rappresenta i.

è l'entrata analogica?

un valore casuale?

ciao

E' la variabile usata per contare quante volte eseguire il ciclo:
http://arduino.cc/en/Reference/For
Essa viene usata per il valore di partenza, viene modificata con l'incremento e vien usata per confrontarla col valore al quale terminare il ciclo.


bit95

ho capito!!!

ho aumentato le pause e ora si sente chiaramente dal buzzer in cosa influisce il for.

grz mille

uwefed



for(int i=0 ;i<7; i++)
{
  tone(buzzer,(nota+(50*i)));
  delay(10);
}

int i=0 parte da 0
i<7; verifica se i è minore di 7
i++  incrementa la variab i di 1 ad ogni passaggio

quando è minore di 7 cioè 6 esce dal ciclo for e prosegue con le altre istruzioni


Una precisione
giusto é:
quando non é piú minore di 7 cioè 7 esce dal ciclo for e prosegue con le altre istruzioni
Finche la condizione é vera continua a restare nel ciclo.

Si puó anche omettere parametri:

for( ; ; ) é un ciclo infinito da cui si esce solo con break()

Ciao Uwe

PaoloP

La sintassi del comando è
Code: [Select]
for( inizializzazione; condizione; incremento)
{
  // codice da ripetere
}


Puoi anche fare un ciclo con decremento.
Code: [Select]
for( int indice=10; indice>1; indice--)
{
  // codice da ripetere
}

il nome dell'indice è arbitrario. ricorda però di non utilizzare nomi di variabili già presenti nel resto del codice per non creare incomprensioni in chi legge il codice.
Sappi, inoltre, che la variabile rimane all'interno del ciclo.

Esistono anche altri tipi di ciclo nel C, come il while e il do while.
Per approfondire ti invito a leggere qui --> http://www.html.it/pag/15405/controlli-iterativi-while-for-break/

bit95

#7
Oct 08, 2012, 07:31 pm Last Edit: Oct 08, 2012, 07:34 pm by bit95 Reason: 1
grazie delle risposte.

ho fatto altri esperimenti con il for, per esempio ho aumentato gradualmente l'intensità di un led con il pwm e il ciclo for.

però sinceramente a che serve il for??.

io l'accensione graduale di un led lo posso fare anche in altri modi, ovviamente ci vuole un sacco di tempo, però si può fare.

quindi il for  serve per velocizzare la programmazione??

oppure per far occupare meno memoria??



abbiate pietà ho iniziato da 2 giorni a programmare XD.

ciao

edit:

sto leggendo il link di paolop e ho trovato tutto.

ciao

leo72


grazie delle risposte.

ho fatto altri esperimenti con il for, per esempio ho aumentato gradualmente l'intensità di un led con il pwm e il ciclo for.

però sinceramente a che serve il for??.

io l'accensione graduale di un led lo posso fare anche in altri modi, ovviamente ci vuole un sacco di tempo, però si può fare.

quindi il for  serve per velocizzare la programmazione??

oppure per far occupare meno memoria??



abbiate pietà ho iniziato da 2 giorni a programmare XD.

ciao

edit:

sto leggendo il link di paolop e ho trovato tutto.

ciao

Facciamo così. Crea un array di 500 byte e poi riempili tutti a mano con il valore 0.

Code: [Select]
byte mioArray[500];
void setup() {
mioArray[0]=0;
mioArray[1]=0;
mioArray[2]=0;
mioArray[3]=0;
mioArray[4]=0;
mioArray[5]=0;
mioArray[6]=0;
mioArray[7]=0;
mioArray[8]=0;
mioArray[9]=0;
mioArray[10]=0;
mioArray[11]=0;
mioArray[12]=0;
mioArray[13]=0;
mioArray[14]=0;
mioArray[15]=0;
.......
mioArray[499]=0;
}

Hai capito, ora?  ;)
Serve ad eseguire delle operazioni ricorsive su elementi indirizzabili, oppure per eseguire tante volte una data istruzione, oppure per tante altre dove il suo non uso comporterebbe la scrittura di un sacco di righe di codice in più (con relativa occupazione di memoria).

uwefed

Il for serve a ripetere del codice piú volte.
Cosa fa il codice dipende poi da te.
Ciao Uwe

Go Up