Pages: [1]   Go Down
Author Topic: chiarimento funzione for  (Read 838 times)
0 Members and 1 Guest are viewing this topic.
roma
Offline Offline
Newbie
*
Karma: 1
Posts: 15
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

ciao
Logged

Genova
Offline Offline
Faraday Member
**
Karma: 40
Posts: 3428
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
« Last Edit: October 08, 2012, 05:31:49 am by pablos » Logged

no comment

roma
Offline Offline
Newbie
*
Karma: 1
Posts: 15
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 333
Posts: 22938
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.

Logged


roma
Offline Offline
Newbie
*
Karma: 1
Posts: 15
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ho capito!!!

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

grz mille
Logged

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 270
Posts: 21851
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset


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
Logged

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 114
Posts: 7183
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Puoi anche fare un ciclo con decremento.
Code:
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/
Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

roma
Offline Offline
Newbie
*
Karma: 1
Posts: 15
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

ciao

edit:

sto leggendo il link di paolop e ho trovato tutto.

ciao
« Last Edit: October 08, 2012, 12:34:29 pm by bit95 » Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 333
Posts: 22938
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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:
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?  smiley-wink
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).
Logged


BZ (I)
Offline Offline
Brattain Member
*****
Karma: 270
Posts: 21851
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Pages: [1]   Go Up
Jump to: