Cicolo FOR per digitalWrite

Salve Ragazzi,

Ho un problemino, vorrei snellire il mio codice inserendo un ciclo for, ma ho provato varie sintassi senza riuscire a trovare quella corretta. Vorrei sapere quale fosse il modo corretto per inserire il ciclo in questo codice.

Questo codice serve per verificare il corretto funzionamento dei led che compongono una scala di misurazione, la verifica avviene appena si accende Arduino (START=0).

// Codice che controlla il funzionamento dei LED

const unsigned int LED_PIN2 = 2; const unsigned int LED_PIN3 = 3; const unsigned int LED_PIN4 = 4; const unsigned int LED_PIN5 = 5; const unsigned int LED_PIN6 = 6; const unsigned int LED_PIN7 = 7; const unsigned int LED_PIN8 = 8; const unsigned int LED_PIN9 = 9; const unsigned int LED_PIN10 = 10; int START=1;

void setup() { pinMode(LED_PIN2, OUTPUT); pinMode(LED_PIN3, OUTPUT); pinMode(LED_PIN4, OUTPUT); pinMode(LED_PIN5, OUTPUT); pinMode(LED_PIN6, OUTPUT); pinMode(LED_PIN7, OUTPUT); pinMode(LED_PIN8, OUTPUT); pinMode(LED_PIN9, OUTPUT); pinMode(LED_PIN10, OUTPUT);

} void loop(){

while(START==1){ digitalWrite(LED_PIN2, HIGH); delay(50); digitalWrite(LED_PIN3, HIGH); delay(50); digitalWrite(LED_PIN4, HIGH); delay(50); digitalWrite(LED_PIN5, HIGH); delay(50); digitalWrite(LED_PIN6, HIGH); delay(50); digitalWrite(LED_PIN7, HIGH); delay(50); digitalWrite(LED_PIN8, HIGH); delay(50); digitalWrite(LED_PIN9, HIGH); delay(50); digitalWrite(LED_PIN10, HIGH); delay(50); digitalWrite(LED_PIN2,LOW); delay(50); digitalWrite(LED_PIN3,LOW); delay(50); digitalWrite(LED_PIN4,LOW); delay(50); digitalWrite(LED_PIN5,LOW); delay(50); digitalWrite(LED_PIN6,LOW); delay(50); digitalWrite(LED_PIN7,LOW); delay(50); digitalWrite(LED_PIN8,LOW); delay(50); digitalWrite(LED_PIN9,LOW); delay(50); digitalWrite(LED_PIN10,LOW); delay(50); START=0; }

}

usa un array.

Ciao Uwe

Oppure, visto che i pin sono tutti in fila, usa un ciclo for da 2 a 10.

Però chiariscimi 2 cose: 1) perché dichiari i pin di tipo "int", occupando quindi 2 byte di memoria, quando il loro valore può essere contenuto all'interno di una variabile di tipo "byte", che occupa 1 solo byte? 2) che senso ha "while (START==1) e poi START=0 prima di uscire dal while? Vuoi far ripetere quel ciclo solo una volta? Allora mettilo nel setup().

Puoi fare cosi…semplice semplice

void test() {
  for (byte t=1; t>=0; t--) { 
    for (byte i=2; i<=10; i++) {
      digitalWrite(i, t);
      delay(50);
    }
  }
}

E la funzione test() la chiami nel setup()

@dalubar:
però così gliel’hai scritto tu, il for :wink:

Ops...non dovevo? :blush:

leo72: Oppure, visto che i pin sono tutti in fila, usa un ciclo for da 2 a 10.

Però chiariscimi 2 cose: 1) perché dichiari i pin di tipo "int", occupando quindi 2 byte di memoria, quando il loro valore può essere contenuto all'interno di una variabile di tipo "byte", che occupa 1 solo byte? 2) che senso ha "while (START==1) e poi START=0 prima di uscire dal while? Vuoi far ripetere quel ciclo solo una volta? Allora mettilo nel setup().

Ciao, Grazie della risposta.

Allora, i pin li dichiaro di tipo INT perchè nel libro che sto legendo:" Il manuale di Arduino" fanno così, quindi credevo andasse bene.

Utilizzo While perchè volevo fosse un controllo sui led che Arduino esegue ogni volta che viene avviato, giusto per verificare che le misure non vengano lette male per colpa di un led malfunzionante. Proverò a metterlo nel Setup.

dalubar: Ops...non dovevo? :blush:

Beh, almeno imparava XD

Dany_XIII: Allora, i pin li dichiaro di tipo INT perchè nel libro che sto legendo:" Il manuale di Arduino" fanno così, quindi credevo andasse bene.

Sì ma così sprechi risorse. Dichiarare 9 variabili di tipo unsigned int vuol dire consumare 18 byte di Ram, con 9 variabili di tipo byte ne consumi la metà.

Utilizzo While perchè volevo fosse un controllo sui led che Arduino esegue ogni volta che viene avviato, giusto per verificare che le misure non vengano lette male per colpa di un led malfunzionante.

Nel setup() si infila tutto quello che deve essere eseguito solo 1 volta dopo l'accensione di Arduino. Tutto quello che deve essere invece ripetuto all'infinito va nel loop().

Hai il codice di Dalubar, semplifica il tuo e postalo qui poi vediamo se c'è ancora da correggere/migliorare.

Ok, perfetto.

Allora ora cambio le variabili da INT a BYTE, provo a scrivere il FOR e butto tutto dentro al SETUP, speriamo bene :slight_smile:

dalubar:
Puoi fare cosi…semplice semplice

void test() {

for (byte t=1; t>=0; t–) {
    for (byte i=2; i<=10; i++) {
      digitalWrite(i, t);
      delay(50);
    }
  }
}




E la funzione test() la chiami nel setup()

GRAZIE A TUTTI :smiley:

Beh, almeno imparava

E' vero, comunque a volte anche un buon "esempio" può essere didattico...almeno per me è stato sempre così. :stuck_out_tongue_closed_eyes:

Ho provato a buttar giù qualcosa ma ho dei problemi.

Per dichiarare una variabile BYTE devo togliere unsiged, giusto?
I led dopo aver eseguito la sequenza rimangono accesi… ma l’ ultimo valore impostato non dovrebbe essere V=0, quindi LOW?

EDIT Praticamente si accendono in seuqenza, si spengono in sequenza ma poi si riaccendono, mentre vorrei che rimanessero spenti. EDIT

poi un altra cosa, con il comando

digitalWrite(i,v);

Come fa arduino a capire che stiamo parlando della variabile LED_PIN?
e perchè va messo BYTE nel ciclo?

Ecco il codice:

const byte LED_PIN2 = 2;
const byte LED_PIN3 = 3;
const byte LED_PIN4 = 4;
const byte LED_PIN5 = 5;
const byte LED_PIN6 = 6;
const byte LED_PIN7 = 7;
const byte LED_PIN8 = 8;
const byte LED_PIN9 = 9;
const byte LED_PIN10 = 10;

void setup() {
pinMode(LED_PIN2, OUTPUT);
pinMode(LED_PIN3, OUTPUT);
pinMode(LED_PIN4, OUTPUT);
pinMode(LED_PIN5, OUTPUT);
pinMode(LED_PIN6, OUTPUT);
pinMode(LED_PIN7, OUTPUT);
pinMode(LED_PIN8, OUTPUT);
pinMode(LED_PIN9, OUTPUT);
pinMode(LED_PIN10, OUTPUT);

for (byte v=1; v>=0; v–){
for (byte i=2; i<=10; i++) {
digitalWrite(i,v);
delay(50);
}
}
}
void loop(){
}

Grazie a tutti e scusate la NIUBBAGINE :stuck_out_tongue:

Ehm… sto notando ora che tipo ogni minuto i led si spengono e si riaccendono in sequenza…

Ehm... sto notando ora che tipo ogni minuto i led si spengono e si riaccendono in sequenza.....

Secondo quel codice non lo dovrebbe fare. L' unica causa che succede questo é che l' arduino si resetta. Hai messo le resistenze sui LED?

digitalWrite(i,v);

Come fa arduino a capire che stiamo parlando della variabile LED_PIN? e perchè va messo BYTE nel ciclo?

Non lo capisce; noi col FOR generiamo una sequenza di numeri da 2 a 10 e usiamo quelli per il digitalWrite().

Ciao Uwe

Ogni LED ha una resistenza da 570ohms.

Mi sembra che il ciclo FOR faccia un giro di troppo, spostando i LED su on, su off e di nuovo su on.

Non mi è molto chiaro…

In più ogni tot secondi si spengono tutti e si riaccendono in sequenza ma solo una volta :fearful:

EDIT:

Ho provato ad inserire un operazione di controllo all’ interno del FOR, in particolare ho scritto di far accendere il led 13 ogni volta che entra nel primo FOR.
Avevo calcolato che si sarebbe acceso 2/3 volte… e invece anche dopo aver finito i due cicli continua a lampeggiare :fearful:

void setup() {
pinMode(LED_PIN2, OUTPUT);
pinMode(LED_PIN3, OUTPUT);
pinMode(LED_PIN4, OUTPUT);
pinMode(LED_PIN5, OUTPUT);
pinMode(LED_PIN6, OUTPUT);
pinMode(LED_PIN7, OUTPUT);
pinMode(LED_PIN8, OUTPUT);
pinMode(LED_PIN9, OUTPUT);
pinMode(LED_PIN10, OUTPUT);
pinMode(LED_PIN13, OUTPUT);

for (byte v=1; v>=0; v–){

digitalWrite(LED_PIN13, HIGH);
delay(100);
digitalWrite(LED_PIN13, LOW);

for (byte i=2; i<=10; i++) {
digitalWrite(i,v);
delay(50);

}

}
}

Mi sa che sto sbagliando qualcosa, spero possiate aiutarmi.

Grazie.

EDIT: Ho provato a mettere un istruzione nel void loop ma sembra che Arduino non esca mai dal void setup.

Quel codice essendo nel setup() viene eseguito una sola volta. Deve esserci un altra causa percui viene eseguito piú volte di seguito. Una causa potrebbe essere un reset.

Domanda: il led PWR resta sempre acceso o lampeggia pure lui? Ciao Uwe

Allora…so cosa sta succendendo.
Rimedio: devi solo sostituire, nel codice che ti ho dato, il tipo della variabile t che deve essere necessariamente int e NON byte, cioè:

void test() {
  for (int t=1; t>=0; t--) { 
    for (byte i=2; i<=10; i++) {
      digitalWrite(i, t);
      delay(50);
    }
  }
}

(ovviamente nel tuo codice è la variabile v)

Causa: quando una variabile tipicamente unsigned come lo è “Byte” viene decrementata oltre lo zero va in overflow e genera comportamenti proprio come quelli che hai descritto.

Cosa succede: in pratica NON si esce mai dal for, perchè la condizione t>=0 è sempre verificata, in quanto non capiterà MAI che t<0, ma torna a 255. Questo fa si che ciclicamente i led si accendano e spengano dopo un certo tempo, ovvero il tempo che da 255 ritorna al valore 1.

Purtroppo è facile incorrere in questo tipo di errori quando si tende sempre a “risparmiare” i byte…e non sono di facile individuazione.

Perfetto, funziona !

Ora che so la soluzione, capisco che se avessi prestato un pò più d' attenzione a quello che stavo legendo in rete avrei trovato la soluzione..... Infatti mi è capitato di leggere una tabella dei vari tipi di dato dove era appunto specificato che Byte va da 0 a +255.

Grazie ancora per le celeri risposte.

Un ultima cosa, ho visto che il cilo for non passa il nome della variabile ma soltanto il numero del pin seguito dal valore, quindi:

digitalWrite(numeroPIN, Valore)

Per chiarirmi le idee ho provato a mandare un comando così nel void loop e come mi aspettavo funziona, ma quindi cosa cambia tra quello scritto sopra e quello che ho sempre utilizzato:

digitalWrite(NomeVariabile, Valore)

Sono equivalenti?

P.S.

Lo sketch è passato da 1436 bytes a 1114 bytes, non è poco !

Grazie a tutti XD

Assegnare una variabile lo si fa anche per motivi di chiarezza dello sketch o per semplificare successive modifiche. Nel tuo sketch originale era facilissimo e chiarissimo modificare ad esempio il ledpin 3 con 17. dipende quindi dai casi scegliere cosa preferisci fare.

@Dany: non te ne offendere, ma ti mancano le conoscenze di base del linguaggio di Arduino. Domandare perché LED_PIN è "capito" da digitalWrite mentre "i" no, mi fa pensare che tu abbia approcciato l'Arduino nel modo sbagliato, ossia passando [u]prima[/u] dall'IDE piuttosto che dal Reference.

Ti consiglio quindi di andare qui: http://arduino.cc/en/Reference/HomePage e rileggerti TUTTO per benino. Capirai anche perché con byte non c'è bisogno di unsigned davanti ed altre cose ;)

Ciao, Io ho iniziato ad approcciare Arduino partendo dal libro di testo sopra citato, mi sto pero' accorgendo di come il libro non parli in maniera specifica del linguaggio utilizzato. Nella prefazione del libro era anticipato che si sarebbe trattato maggiormente il lato pratico di Arduino senza perdere tempo in lunghe spiegazioni sulla teoria, ma credevo che almeno le basi ci fossero....

Forse ho sbagliato libro? Voi lo conoscete?

Comunque ho già imparato parecchie cose nuove da questo topic, e vi ringrazio anche per la vostra sempre cortese attenzione.

Leggero' sicuramente il link da te citato, grazie.

Secondo me dovresti comprare un libro sulla programmazione c++ (o guardare guide su internet ad esempio ce ne sono sul sito html.it come in mille altri siti) perchè mi sembra che tu non abbia le basi generali piú che le basi di arduino (senza offesa)

Per il tuo sketch pensavo anche un altra cosa...potresti fare un for anche per i pinmode così da snellire ancora di più il codice...e a questo punto puoi eliminare anche tutte le variabili dei pin in quanto nn ti servirebbero più