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 =( =(
#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.
#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 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?
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?
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.
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?
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.
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.
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).
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
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.
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)
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