[RISOLTO] Problema con funzione

Salve a tutti,
sto riprendendo in mano Arduino Uno per un piccolo progetto/gioco e ho un problema:
dichiaro una funzione per spegnere in un sol colpo quattro LED.

void spegniLed(){
  for(i=0; i<4; i++){
     digitalWrite(i,LOW); 
  }
}

Questa funzione fa esattamente il suo dovere se richiamata in void loop() ma, nel caso la volessi inserire in un ciclo for, mi interrompe il ciclo!

void loop(){
[...omissis...]
for(i=0; i<5; i++){
  // Accendo il LED alla posizione i
  digitalWrite(i,HIGH); 
  // Attendo 4 sec
  delay(4000);
 // Lancio la funzione che mi spegne tutti i LED
 spegniLed();
}
[...omissis...]
}

In questo caso mi si accende e poi spegne solo il primo LED e ciccia.
Sappiate che il codice è stato fortemente semplificato, ho provveduto a debuggare il tutto mediante seriale e mi sono accorto di questo strano comportamento. Nella documentazione ufficiale mi pare di aver letto che alla fine dell’esecuzione della function riprende il normale flusso del programma. Boh.
Qualcuno ha qualche info a riguardo?
Ho anche provato a inserire return; nella funzione, ma nisba.
Grazie!!!

Non potendo vedere il resto... posso solo fare ipotesi. Nella funzione non dichiari la variabile i, perciò ti basi su una i dichiarata globalmente. Prova a mettere una dichiarazione int i; prima del for nella funzione.

… magari usare due variabili diverse nel ciclo di FOR aiuta … XD XD XD

Non vedo dove dichiari “i” … ritengo quindi sia dichiarata globalmente e … NON puoi non aspettarti strani comportamenti se usi la stessa variabile !!! :astonished:

Creati una variabile locale solo per la funzione spegniLed() …

void spegniLed(){
  byte j;
  for(j=0; j<4; j++){
     digitalWrite(j,LOW); 
  }
}

Guglielmo

@nid : ma io e te siamo telepatici che postiamo sempre assieme ??? XD XD XD

nid69ita:
Non potendo vedere il resto… posso solo fare ipotesi.
Nella funzione non dichiari la variabile i, perciò ti basi su una i dichiarata globalmente.
Prova a mettere una dichiarazione int i; prima del for nella funzione.

Mi hai dato una dritta niente male!
Ho risolto, e credo di aver capito cosa è successo:
nella funzione spegniLed() è presente una variabile “di comodo” i utilizzata per il ciclo for
ma anche nella ciclo dal quale stavo chiamando questa funzione è presente una variabile i
pertanto, finito il ciclo for della funzione spegniLed() la mia varibile i=4 e mi faceva uscire dal ciclo for genitore.
Mea culpa! Ho risolto inserendo un nome diverso alla variabile contatore nella funzione spegniLed(), e cioè:
int k=0;

GRAZIE!

gpb01:
… magari usare due variabili diverse nel ciclo di FOR aiuta … XD XD XD

Non vedo dove dichiari “i” … ritengo quindi sia dichiarata globalmente e … NON puoi non aspettarti strani comportamenti se usi la stessa variabile !!! :astonished:

Creati una variabile locale solo per la funzione spegniLed() …

void spegniLed(){

byte j;
 for(j=0; j<4; j++){
    digitalWrite(j,LOW);
 }
}




Guglielmo

Grande Guglielmo! Hai perfettamente ragione!
Grazie!

*@nid : ma io e te siamo telepatici che postiamo sempre assieme ??? XD XD XD*

ho provveduto a debuggare il tutto mediante seriale e mi sono accorto di questo strano comportamento.

void spegniLed(){
  byte j;
  for(j=0; j<4; j++){
     digitalWrite(j,LOW); 
  }
}

Stai usando il pin 0 e il pin 1 che sono utilizzati dalla seriale, che debug fai? il micro lo fai impazzire :smiley:

parti da 2 che è meglio pin 2-3-4-5-6

void spegniLed(){
  for(byte j=2; j<6; j++){
     digitalWrite(j,0); 
  }
}

pablos:

ho provveduto a debuggare il tutto mediante seriale e mi sono accorto di questo strano comportamento.

void spegniLed(){

byte j;
  for(j=0; j<4; j++){
     digitalWrite(j,LOW);
  }
}



Stai usando il pin 0 e il pin 1 che sono utilizzati dalla seriale, che debug fai? il micro lo fai impazzire :D

parti da 2 che è meglio pin 2-3-4-5-6


void spegniLed(){
 for(byte j=2; j<6; j++){
    digitalWrite(j,0);
 }
}

No, no… spetta…
Ho buttato giù un po’ di codice di esempio. Il programma che sto implementando utilizza altri Pin: 5,6,9,10
Per la cronaca: a scopo didattico sto ricerando il vecchio gioco Simon: quattro LED, quattro pulsanti, una sequenza casuale di illuminazioni e al giocatore il compito di replicarne la sequenza.
Sono a buon punto…
PS. Sarà assolutamente free e pubblicherò il codice sul mio sito.

Grazie ancora.

Ma avevi anche dichiarato la i come variabile globale, all'inizio del programma?

paulus1969: Ma avevi anche dichiarato la i come variabile globale, all'inizio del programma?

Già. Anche da questo avrei dovuto dedurre il comportamento. Sono proprio arrugginito! :blush: Spero che questo topic serva a qualche altro sprovveduto.

Grazie a tutti.