Comandare 10 LED in sequenza ARDUINO UNO

Salve ragazzi sono nuovo di questo forum e spero di aver scelto la sezione giusta del forum per postare la mia domanda.
Io ho acquistato un Arduino Uno e dovrei accendere 10 led in sequenza e ho tre pulsanti start stop e reset come posso fare? vi ho allegato il programma che ho provato a fare ma non ci riesco spero in un vostro aiuto =( =(

Sequenza 10 LED.ino (1.74 KB)

Il codice non compila. :disappointed_relieved:

#define LED1 2                // LED collegato al pin digitale 13
#define LED2 3
#define LED3 4
#define LED4 5
#define LED5 6
#define LED6 7
#define LED7 8
#define LED8 9
#define LED9 10
#define LED10 11
#define BUTTON ST A0
#define BUTTON SP A1
#define BUTTON R  A2          // pin di input dove è collegato il pulsante  
int val = 0;                  // si userà val per conservare lo stato del pin di input  
int vecchio_val = 0;          // si userà vecchio_val per conservare lo stato del pin di input al passo precedente  
int stato = 0;                // ricorda lo stato in cui si trova il led, stato = 0 led spento, stato = 1 led acceso  
  
void setup() {  
  pinMode(LED1, OUTPUT);       // imposta il pin digitale come output  
  pinMode(LED2, OUTPUT);  
  pinMode(LED3, OUTPUT);
  pinMode(LED4; OUTPUT);  
  pinMode(LED5; OUTPUT);
  pinMode(LED6; OUTPUT);  
  pinMode(LED7; OUTPUT);
  pinMode(LED8; OUTPUT);
  pinMode(LED9; OUTPUT);
  pinMode(LED10; OUTPUT);
  pinMode(BUTTON SP, INPUT);
  pinMode(BUTTON R, INPUT);
  pinMode(BUTTON ST, INPUT);     // imposta il pin digitale come input  
}  
  
void loop() {  
  val = digitalRead(BUTTON);  // legge il valore dell'input e lo conserva  
  
  // controlla se è accaduto qualcosa  
  if ((val == HIGH) && (vecchio_val == LOW)){  
    stato = 1 - stato;  
    delay(15);                // attesa di 15 millisecondi  
  }   
  
  vecchio_val = val;          // ricordiamo il valore precedente di val  
  
    if (stato == 1) {  
    digitalWrite(LED, HIGH);  // accende il LED  
    delay(1000);              // aspetta un secondo  
    digitalWrite(LED, LOW);   // spegne il LED  
    delay(1000);              // aspetta un secondo  
  }  
  else {  
    digitalWrite(LED, LOW);    //spegne il led  
  }  
}

Nei #define non puoi mettere più di uno spazio. In quel modo definisci tre volte il testo BUTTON come ST A0 poi come SP A1 e infine come R A2.
Nei comandi pinmode hai messo ; al posto di ,
Nel digitalread BUTTON è ambiguo perchè non specifici qual'è Start, Stop o il terzo?
Per leggerli tutti e tre devi ripetere il comando 3 volte.
Dovrai avere quindi 3 variabili di lettura e 3 di stato.
Anche il comando del digiralWrite è ambiguo. Devi specificare quale led accendere.
Se li vuoi accendere tutti e 10 devi mettere dieci digitalWrite.
Più avanti potrai sostituire tutti i digitalWrite con un ciclo for e un array di stato, ma al momento scrivili tutti e 10.

Per la parte Hardware ti ricordo di mettere le resistenze in serie con i led altrimenti bruci i pin e dovrai sostituire il micro o buttare la scheda (se SMD).

Il programma è piccolo quindi puoi tranquillamente riportarlo direttamente sul forum tramite i tag CODE.
Nell'editor, sopra le faccine, premi il pulsante # per far comparire i tag in cui racchiudere il codice.

Ti invito a leggere questi due topic che chiariscono il funzionamento del forum e le norme di comportamento
--> http://arduino.cc/forum/index.php/topic,149082.0.html
--> http://arduino.cc/forum/index.php/topic,91560.0.html

Benvenuto! :grin:

p.s. non puoi mettere spazi nel nome del file. L'IDE si arrabbia. :wink:

PaoloP:
Il codice non compila. :disappointed_relieved:

#define LED1 2                // LED collegato al pin digitale 13

#define LED2 3
#define LED3 4
#define LED4 5
#define LED5 6
#define LED6 7
#define LED7 8
#define LED8 9
#define LED9 10
#define LED10 11
#define BUTTON ST A0
#define BUTTON SP A1
#define BUTTON R  A2          // pin di input dove è collegato il pulsante  
int val = 0;                  // si userà val per conservare lo stato del pin di input  
int vecchio_val = 0;          // si userà vecchio_val per conservare lo stato del pin di input al passo precedente  
int stato = 0;                // ricorda lo stato in cui si trova il led, stato = 0 led spento, stato = 1 led acceso  
 
void setup() {  
 pinMode(LED1, OUTPUT);       // imposta il pin digitale come output  
 pinMode(LED2, OUTPUT);  
 pinMode(LED3, OUTPUT);
 pinMode(LED4; OUTPUT);  
 pinMode(LED5; OUTPUT);
 pinMode(LED6; OUTPUT);  
 pinMode(LED7; OUTPUT);
 pinMode(LED8; OUTPUT);
 pinMode(LED9; OUTPUT);
 pinMode(LED10; OUTPUT);
 pinMode(BUTTON SP, INPUT);
 pinMode(BUTTON R, INPUT);
 pinMode(BUTTON ST, INPUT);     // imposta il pin digitale come input  
}  
 
void loop() {  
 val = digitalRead(BUTTON);  // legge il valore dell'input e lo conserva  
 
 // controlla se è accaduto qualcosa  
 if ((val == HIGH) && (vecchio_val == LOW)){  
   stato = 1 - stato;  
   delay(15);                // attesa di 15 millisecondi  
 }  
 
 vecchio_val = val;          // ricordiamo il valore precedente di val  
 
   if (stato == 1) {  
   digitalWrite(LED, HIGH);  // accende il LED  
   delay(1000);              // aspetta un secondo  
   digitalWrite(LED, LOW);   // spegne il LED  
   delay(1000);              // aspetta un secondo  
 }  
 else {  
   digitalWrite(LED, LOW);    //spegne il led  
 }  
}




Nei #define non puoi mettere più di uno spazio. In quel modo definisci tre volte il testo BUTTON come ST A0 poi come SP A1 e infine come R A2.
Nei comandi pinmode hai messo ; al posto di ,
Nel digitalread BUTTON è ambiguo perchè non specifici qual'è Start, Stop o il terzo?
Per leggerli tutti e tre devi ripetere il comando 3 volte.
Dovrai avere quindi 3 variabili di lettura e 3 di stato.
Anche il comando del digiralWrite è ambiguo. Devi specificare quale led accendere.
Se li vuoi accendere tutti e 10 devi mettere dieci digitalWrite.
Più avanti potrai sostituire tutti i digitalWrite con un ciclo for e un array di stato, ma al momento scrivili tutti e 10.

Per la parte Hardware ti ricordo di mettere le resistenze in serie con i led altrimenti bruci i pin e dovrai sostituire il micro o buttare la scheda (se SMD).

Il programma è piccolo quindi puoi tranquillamente riportarlo direttamente sul forum tramite i tag CODE.
Nell'editor, sopra le faccine, premi il pulsante # per far comparire i tag in cui racchiudere il codice.

Ti invito a leggere questi due topic che chiariscono il funzionamento del forum e le norme di comportamento
--> http://arduino.cc/forum/index.php/topic,149082.0.html
--> http://arduino.cc/forum/index.php/topic,91560.0.html

Benvenuto! :grin:

p.s. non puoi mettere spazi nel nome del file. L'IDE si arrabbia. ;)

Ok grazie se non ti chiedo troppo potresti farmi un po di questo programma giusto per capire come fare avendo un esempio funzionante al 100% ed quindi per le prime volte riguardarlo per capire? :slight_smile: :slight_smile:

RossiAlessio:
Ok grazie se non ti chiedo troppo potresti farmi un po di questo programma giusto per capire come fare avendo un esempio funzionante al 100% ed quindi per le prime volte riguardarlo per capire? :slight_smile: :slight_smile:

Premesso che su internet di esempi di accensioni di led ne trovi in quantità e quindi bastava un minimo di sforzo (ad esempio questo tutorial) ma non è neanche carino ai primi 2 post prendere e chiedere a qualcuno di fare le cose al posto tuo.
In questa maniera non impari.

leo72:

RossiAlessio:
Ok grazie se non ti chiedo troppo potresti farmi un po di questo programma giusto per capire come fare avendo un esempio funzionante al 100% ed quindi per le prime volte riguardarlo per capire? :slight_smile: :slight_smile:

Premesso che su internet di esempi di accensioni di led ne trovi in quantità e quindi bastava un minimo di sforzo (ad esempio questo tutorial) ma non è neanche carino ai primi 2 post prendere e chiedere a qualcuno di fare le cose al posto tuo.
In questa maniera non impari.

Sia chiaro che non ho preteso niente ho solo chiesto una cortesia dato che con i post gia fatti non riesco a capire molto ma con esempi di programmi concreti e funzionanti si e po qualcuno a preteso qualcosa da te?

RossiAlessio:
Sia chiaro che non ho preteso niente ho solo chiesto una cortesia dato che con i post gia fatti non riesco a capire molto ma con esempi di programmi concreti e funzionanti si e po qualcuno a preteso qualcosa da te?

Questo lo hai scritto te:

RossiAlessio:
se non ti chiedo troppo potresti farmi un po di questo programma

Potevi guardare il link che ti ho passato dove c'è il programma già fatto per accendere 10 led.

Questo lo hai scritto te:

RossiAlessio:
se non ti chiedo troppo potresti farmi un po di questo programma

Potevi guardare il link che ti ho passato dove c'è il programma già fatto per accendere 10 led.

[/quote]

Infatti ho scritto quello ma cita anche quello che ho scritto dopo.... comunque io 1 ho fatto una richiesta con cortesia senza pretendere niente da nessuno 2 ho provato a guardare il tuo link ma fin'ora ho capito solo che ci sono led resistenze e un potenziometro nient'altro.

RossiAlessio:
1 ho fatto una richiesta con cortesia senza pretendere niente da nessuno

Ti ho precisato che non si fanno richieste di tal genere dopo 2 post.
Il forum non è un servizio assistenza. Possiamo correggere gli sketch ma non li scriviamo su ordinazione.

2 ho provato a guardare il tuo link ma fin'ora ho capito solo che ci sono led resistenze e un potenziometro nient'altro.

Quello è un esempio di quelli che ti dicevo dovevi cercare. Ovviamente in rete ci sono tanti altri esempi.
Ad... esempio, a te serve fare delle sequenze?
Questa guida potrebbe fare al caso tuo?
http://www.sqlskills.com/blogs/paulselec/post/arduino-projects-led-10-bar-array.aspx

Ci sono 2 esempi di codice che cambiano la sequenza dei led .
Sono già delle buone basi su cui ragionare e da studiare.

RossiAlessio:
ho provato a guardare il tuo link ma fin'ora ho capito solo che ci sono led resistenze e un potenziometro nient'altro.

PS:
ho ragionato su questa tua frase. Attenzione che ogni led vuole la sua resistenza di limitazione della corrente, altrimenti bruci il led.
Altra cosa, NON accendere contemporaneamente tutti e 10 i led insieme perché rischi di danneggiare il microcontrollore dell'Arduino. Se lui vuoi accendere contemporaneamente devi ricorrere a dei driver, cioè degli integrati che pilotino i led al posto dell'Arduino, perché la corrente che richiederesti all'Atmega328 sarebbe superiore a quella che può erogare. Li puoi controllare con degli shift register.
http://arduino.cc/en/Tutorial/ShiftOut

Ho letto questa discussione e cercato in giro per internet su come usare uno ShiftOut.
Quello che però vorrei capire, è come poter controllare la luminosità di 10 LED. Con un Arduino Mega potrei usare "analogWrite" perchè avrei abbastanza uscite analogiche, giusto? Ma se usassi le uscite analogiche, andrei comunque incontro allo stesso problema di poter danneggiare il microcontrollore? E in caso fosse così, come la posso risolvere? Guardando in giro mi pare di aver capito che potrei usare un 4051:
http://playground.arduino.cc/learning/4051
Potrebbe essere la soluzione giusta per il mio problema?
Grazie!

Il TLC5940 è un chip che ha 16 uscite PWM (4096 livelli) pilotabili singolarmente con 3 soli pin via SPI. (mi sono confuso con il Max7219, un altro driver per Led: grazie Uwe per la segnalazione).

http://playground.arduino.cc/Learning/TLC5940
Credo sia quel che fa per te

Chiedo scusa se mi inserisco nella discussione poichè ho un dubbio sull'uso degli shift.... In quanto dagli schemi proposti gli stessi shift non sono alimentati diversamente ma sempre alimentati dall'arduino stesso. Non dal pin analogico ma comunque dall'arduino. Questo non danneggia arduino?
Grazie, saluti

se i leds vengono alimentati dai 5VDC , No se vengono alimentati dai 7-12VDC della presa alimentazione arduino.

xmaurox:
Ho letto questa discussione e cercato in giro per internet su come usare uno ShiftOut.
Quello che però vorrei capire, è come poter controllare la luminosità di 10 LED. Con un Arduino Mega potrei usare "analogWrite" perchè avrei abbastanza uscite analogiche, giusto? Ma se usassi le uscite analogiche, andrei comunque incontro allo stesso problema di poter danneggiare il microcontrollore? E in caso fosse così, come la posso risolvere? Guardando in giro mi pare di aver capito che potrei usare un 4051:
Arduino Playground - HomePage
Potrebbe essere la soluzione giusta per il mio problema?
Grazie!

Non funziona.

  1. un multiplexer analogco collega sempre un pin comune con uno nel caso del 4051 dei 8 "uscite" (Visto che il 4051 é bidirezionale le "uscite" possono essere usate anche come entrate se si vuole multiplexxare 8 Tensioni su un Pin)
  2. arduino non ha una DAC (Digital Analogic Converter) percui non produce una tensione regolabile ma con analogWrite manda un segnle PWM.

Devi usare smepre un integrato che pilota i LED come il TLC5940 che limita autonomamente la corrente dei LED oppure dei Shift Register tipo il 74HC595 con un triver tipo ULN2803 e delle resistenze per limitare le correni dei LED

Ciao Uwe