freccia dinamica, come faccio a sincronizzarla senza dare errori?

buona sera ragazzi, mi chiamo Danilo ed è la prima volata che scrivo in questo forum, ho comprato da poco arduino e questo e il mio primo progetto, umi servirebbe una mano, mentre continuo a studiare il manuale (spiega molte cose, ma non si sofferma troppo sulle possibili alternative)

veniamo a noi, ho collegato ad una basetta 12 led, questi led fannounaccenzione a scorrimento cioé accendo led1, si spegne e parte led2, si spegne e parte led 3 ecc.. in sostanza creano uno scorrimento luminoso parte accendendo il digital 1 e finisce spegnendo digital 12, per poi ripartire

ecco il mio problema:

sto usando un tasto, e quando lo premo il circuito parte, e si ferma quando arriva alla fine

per collegare il sistema ad una freccia della macchina e cosa dovrei correggere sul programma?

togliero il bottone e se non ho capito male dovro usare un 7805 (pin esterni piu e meno 12v e dal centrare arrivera il 5v che vado a collegare al posto del bottone, per far sapere ad arduino quando la freccia e accesa)

quando faccio partire il programma i led partono, ma se schiacci ripetutamente, piu o meno a distanza di un secondo (come il lampeggio di una freccia) capita delle volte che il ciclo non parta, per il tasto viene premuto appena si spegne l'ultimo led, quindi becco il fine ciclo

ogni volta che la freccia si accende il ciclo deve ripartire dall'inizio, sia se ha finito il ciclo sia se non ha finito, per evitare il colpo a vuoto, cosi quando l'ultimo led si spegnerà potre ripartire xhe la freccia a detto ad arduino di essersi riaccesa, se capita che al led 11, la freccia si e gia riaccesa voglio che ricominci il ciclo e se capita che appena finisce il ciclo arriva il segnale della freccia, il colpo a vuoto non ci sara e la freccia ripatira cmq

quindi la domanda è come faccio a far ripartire il programma (loop) ogni volta che la freccia si riaccende? cosi posso evitare il colpo a vuoto

(sono un po casinista, mi scuso in anticipo se il mio discorso non è comprensibile, e spero in una risposta al piu presto, grazie ancora :D )

Dany89: (sono un po casinista, mi scuso in anticipo se il mio discorso non è comprensibile, e spero in una risposta al piu presto, grazie ancora :D )

In questo caso, la cosa migliore è spiegare (una volta) cosa voui ottenere e magari pubblicare il codice che stai usando.

anche lo schema aiuta

int tasto =0;

void setup(){ 
pinMode(1,OUTPUT); //led
pinMode(2,OUTPUT); //led
pinMode(3,OUTPUT); //led
pinMode(4,OUTPUT); //led
pinMode(5,OUTPUT); //led
pinMode(6,OUTPUT); //led
pinMode(7,OUTPUT); //led
pinMode(8,OUTPUT); //led
pinMode(9,OUTPUT); //led
pinMode(10,OUTPUT); //led
pinMode(11,OUTPUT); //led
pinMode(12,OUTPUT); //led
pinMode(13,INPUT); //tasto
}
void loop(){  
  tasto=digitalRead(13); //tasto
 if (tasto==LOW){
   digitalWrite(1,LOW);
  digitalWrite(2,LOW);
  digitalWrite(3,LOW);
  digitalWrite(4,LOW);
  digitalWrite(5,LOW);
  digitalWrite(6,LOW);
  digitalWrite(7,LOW);
  digitalWrite(8,LOW);
  digitalWrite(9,LOW);
  digitalWrite(10,LOW);
  digitalWrite(11,LOW);
  digitalWrite(12,LOW);
 }
 else{
  digitalWrite(1,HIGH);
  digitalWrite(2,LOW);
  digitalWrite(3,LOW);
  digitalWrite(4,LOW);
  digitalWrite(5,LOW);
  digitalWrite(6,LOW);
  digitalWrite(7,LOW);
  digitalWrite(8,LOW);
  digitalWrite(9,LOW);
  digitalWrite(10,LOW);
  digitalWrite(11,LOW);
  digitalWrite(12,LOW);
  delay(100);
   digitalWrite(1,LOW);
  digitalWrite(2,HIGH);
  digitalWrite(3,LOW);
  digitalWrite(4,LOW);
  digitalWrite(5,LOW);
  digitalWrite(6,LOW);
  digitalWrite(7,LOW);
  digitalWrite(8,LOW);
  digitalWrite(9,LOW);
  digitalWrite(10,LOW);
  digitalWrite(11,LOW);
  digitalWrite(12,LOW);
  delay(100);
   digitalWrite(1,LOW);
  digitalWrite(2,LOW);
  digitalWrite(3,HIGH);
  digitalWrite(4,LOW);
  digitalWrite(5,LOW);
  digitalWrite(6,LOW);
  digitalWrite(7,LOW);
  digitalWrite(8,LOW);
  digitalWrite(9,LOW);
  digitalWrite(10,LOW);
  digitalWrite(11,LOW);
  digitalWrite(12,LOW);
  delay(100);
   digitalWrite(1,LOW);
  digitalWrite(2,LOW);
  digitalWrite(3,LOW);
  digitalWrite(4,HIGH);
  digitalWrite(5,LOW);
  digitalWrite(6,LOW);
  digitalWrite(7,LOW);
  digitalWrite(8,LOW);
  digitalWrite(9,LOW);
  digitalWrite(10,LOW);
  digitalWrite(11,LOW);
  digitalWrite(12,LOW);
  delay(100);
   digitalWrite(1,LOW);
  digitalWrite(2,LOW);
  digitalWrite(3,LOW);
  digitalWrite(4,LOW);
  digitalWrite(5,HIGH);
  digitalWrite(6,LOW);
  digitalWrite(7,LOW);
  digitalWrite(8,LOW);
  digitalWrite(9,LOW);
  digitalWrite(10,LOW);
  digitalWrite(11,LOW);
  digitalWrite(12,LOW);
  delay(100);
   digitalWrite(1,LOW);
  digitalWrite(2,LOW);
  digitalWrite(3,LOW);
  digitalWrite(4,LOW);
  digitalWrite(5,LOW);
  digitalWrite(6,HIGH);
  digitalWrite(7,LOW);
  digitalWrite(8,LOW);
  digitalWrite(9,LOW);
  digitalWrite(10,LOW);
  digitalWrite(11,LOW);
  digitalWrite(12,LOW);
  delay(100);
   digitalWrite(1,LOW);
  digitalWrite(2,LOW);
  digitalWrite(3,LOW);
  digitalWrite(4,LOW);
  digitalWrite(5,LOW);
  digitalWrite(6,LOW);
  digitalWrite(7,HIGH);
  digitalWrite(8,LOW);
  digitalWrite(9,LOW);
  digitalWrite(10,LOW);
  digitalWrite(11,LOW);
  digitalWrite(12,LOW);
  delay(100);
   digitalWrite(1,LOW);
  digitalWrite(2,LOW);
  digitalWrite(3,LOW);
  digitalWrite(4,LOW);
  digitalWrite(5,LOW);
  digitalWrite(6,LOW);
  digitalWrite(7,LOW);
  digitalWrite(8,HIGH);
  digitalWrite(9,LOW);
  digitalWrite(10,LOW);
  digitalWrite(11,LOW);
  digitalWrite(12,LOW);
  delay(100);
   digitalWrite(1,LOW);
  digitalWrite(2,LOW);
  digitalWrite(3,LOW);
  digitalWrite(4,LOW);
  digitalWrite(5,LOW);
  digitalWrite(6,LOW);
  digitalWrite(7,LOW);
  digitalWrite(8,LOW);
  digitalWrite(9,HIGH);
  digitalWrite(10,LOW);
  digitalWrite(11,LOW);
  digitalWrite(12,LOW);
  delay(100);
   digitalWrite(1,LOW);
  digitalWrite(2,LOW);
  digitalWrite(3,LOW);
  digitalWrite(4,LOW);
  digitalWrite(5,LOW);
  digitalWrite(6,LOW);
  digitalWrite(7,LOW);
  digitalWrite(8,LOW);
  digitalWrite(9,LOW);
  digitalWrite(10,HIGH);
  digitalWrite(11,LOW);
  digitalWrite(12,LOW);
  delay(100);
   digitalWrite(1,LOW);
  digitalWrite(2,LOW);
  digitalWrite(3,LOW);
  digitalWrite(4,LOW);
  digitalWrite(5,LOW);
  digitalWrite(6,LOW);
  digitalWrite(7,LOW);
  digitalWrite(8,LOW);
  digitalWrite(9,LOW);
  digitalWrite(10,LOW);
  digitalWrite(11,HIGH);
  digitalWrite(12,LOW);
  delay(100);
   digitalWrite(1,LOW);
  digitalWrite(2,LOW);
  digitalWrite(3,LOW);
  digitalWrite(4,LOW);
  digitalWrite(5,LOW);
  digitalWrite(6,LOW);
  digitalWrite(7,LOW);
  digitalWrite(8,LOW);
  digitalWrite(9,LOW);
  digitalWrite(10,LOW);
  digitalWrite(11,LOW);
  digitalWrite(12,HIGH);
  delay(100);
  }  
}

Primo, come da REGOLAMENTO, punto 7, modifica il tuo post e racchiudi il codice tra i tag CODE !

Secondo ... usare dei cicli FOR per semplificare un po' il codice no ? :smiling_imp:

Guglielmo

E' uno schema molto semplice 12 led, dal pin 1 al 12, sulla masa una resistenza da 220 e sul pin 13 un tasto sempre con la resistenza giusta a massa

quello che mi interessa e far ricominciare il ciclo dal primo led ogni volta che la freccia della macchina si accende

come inquesto video, ma le frecce dovrebbero lavorare in continuo

http://tv.quattroruote.it/news/video/audi-a8-come-si-accendono-le-frecce-con-i-fari-matrix-led

ecco il mio progetto

https://www.youtube.com/watch?v=KO3CZ619ADE

(c'è voluto un po per caricarlo dal telefono :D )

come si puo vedere dal mio risultato, capita che a certi pressiono del dito la striscianon parta, io col dito cercavo di imitare il battito della freccia

ovviamnete con il delay potrei velocizzare il sistema, ma vorrei che ripartisse nel modo giusto ad ogni riaccenione della freccia dell'auto, non di andare a tentativi o di accorciare i tempi x essere sicuro che funzioni

capita che in auto si bruci una delle frecce, sullo stesso lato le 2 rimaste andranno piu velocemente x segnalare l'errore, della lampadina bruciata o che comunque non si accende, in quel caso non funzionerebbe xk il progrmma non riparte nel modo giusto, quindi deve funzionare come si deve

gpb01: Primo, come da REGOLAMENTO, punto 7, modifica il tuo post e racchiudi il codice tra i tag CODE !

Secondo ... usare dei cicli FOR per semplificare un po' il codice no ? :smiling_imp:

Guglielmo

grazie del consiglio, non ho trovato "#" ma un foglio con maggiore e minore, spero sia giusto

per la questione del FOR mi potete spiegare meglio? non essendo pratico, devo ancora studiarla questa cosa (sono ancora al punto 6 del manuale di arduino starter kit, quello con il piezo, ci sto lavorando in questo momento :) ) a me basta che funzioni, poi se e lungo non importa su arduini lo spazio c'é

non c'é modo quindi di far ripartire il ciclo quando premo il bottone nel video?

Il tuo video è privato.

Ora si vede? E un casino sistemare il video con telefono, non è la prima volta che lo metto ma c'è sempre qualcosa che non va o grande perdita di tempo, ho inserito privato e tolto il lucchetto 5 o 6 volte ma quando ripremi modifica mi indica sempre privato, e sopra c'è il video ripetuto 2 volte, lo indica come finalizzazione del video e non mi fa continuare niente

Dany89:
per la questione del FOR mi potete spiegare meglio? non essendo pratico, devo ancora studiarla questa cosa (sono ancora al punto 6 del manuale di arduino starter kit, quello con il piezo, ci sto lavorando in questo momento :slight_smile: )

Il manuale dello starter kit non lo conosco, ma ti posso dire questa regola generale, nota come regola del tre, che va bene per tutti i linguaggi di programmazione, e non solo per C/C++:

Three or more, use a for.

Cioè, se hai tre o più elementi da gestire (nel tuo caso, i pin da 1 a 12 da dichiarare come output), è meglio fare un’iterazione su tutti gli elementi (con un for, appunto) anziché scriverli a mano uno per uno. Non è che il programma funzioni meglio o peggio, e in molti casi il compilatore darà lo stesso codice macchina, ma è più comodo scrivere il codice, mantenerlo, scovare eventuali bachi, ecc.

Il tuo codice lunghissimo diventerebbe così:

for (byte i=0; i<12; i++) { pinMode (i, OUTPUT); }

Una riga al posto di 12!

Ancora meglio è creare un vettore pin[12] (o quello che ti pare) con dentro i numeri dei pin e iterare su quello. Anche il loop si può fare con un for e due o tre righe di codice, così eviti anche di immettere tutti quei valori “duri”, che non somo mai una buona idea.

Quello che impedisce la lettura del tasto (a parte i rimbalzi, ma è un altro discorso che ti si porrà dopo) è la presenza di tutti quei delay. Durante un delay il sistema rimane fermo senza fare nulla, quindi senza accorgersi del fatto che il tasto venga premuto. Guardando il codice, si trova quasi sempre in delay, quindi quasi sempre "sordo".

Soluzione: - usa millis() come nell'esempio del blink senza delay.

paulus1969: Soluzione: - usa millis() come nell'esempio del blink senza delay.

Oppure un altro modo, visto che si tratta di un programma assai semplice, è spezzattare il grosso delay in miniattese da 10 o 20 ms intercalando l'ascolto sul pulsante, così abbiamo anche l'antirimbalzo in un sol colpo.

Potrebbe essere necessario regolare il delay per rendere più veloce lo scorrimento delle luci, non so se avete notato il video fatto da me, e molto piu lento rispetto alle frecce della A8 nel sito internet, quindi il delei e necessario, arduino non può sapere quando la frecca smetterà il lampeggio, allora dovrò fare delle prove x metterlo nella condizione giusta, di conseguenza non posso farne a meno, a mio parere, voi magari avete un'alternativa?

Comunque escludendo il fatto del sistema FOR che se non cambia piu di tanto non mi interessa, come posso ovviare al problema che i led non ripartono ogni volta che premo il tasto, anche se il ciclo e già iniziato?

Devi fare come ti abbiamo detto, in più ti conviene fare un sistema a stati.

Crea una variabile stato che potrà assumere i valori da 0 a 12 con i seguenti significati stato = 0 tutti spenti stato = 1 acceso il numero 1 stato = 2 acceso il numero 2 ...... e così via ... stato = 12 acceso il numero 12

in questo modo nel loop richiami una funzione che ti accende quello che corrisponde allo stato di quel momento questa funzione la chiamiamo accendi e quindi metterai nel loop un accendi (stato); da richiamare ogni x millisecondi usando la tecnica del millis() così togli i delay.

Dany89: Comunque escludendo il fatto del sistema FOR che se non cambia più di tanto non mi interessa ...

:o :o :o

... complimenti per l'approccio ! ... dimostra quanto hai capito di "programmazione" sulle piccole MCU ! :roll_eyes:

Guglielmo

Vado un po' fuori tema, ma l'avete visto il link su Quattroruote? Tremila euro per due lucette lampeggianti? Pure "ipertecnologico" me lo chiamano.

grazie per il tentativo, ma come detto prima sono alle prime armi ancora non ho usato il sistema stato ;D ;D

vedro di leggere da qualche parte, comunque funziona questo sistema, sicuramente ce qualche pagina internet che lo spiega, e dopo faro lo stesso x il sistema millis, ho gia provato la cosa con il sistema starter kit, ma la storia del led che si accendono in seguenza senza il dealy non mi convince, anche se l regolo con il sistema milles non capisco cnque si possa far ripartire dal primo led in qualsiasi mometo, o almeno non ne avete accennato il modo, magari il sistema basterà senza aggiungere altro, co studio, provo e in caso richiedo, grazie intnto

gpb01: :o :o :o

... complimenti per l'approccio ! ... dimostra quanto hai capito di "programmazione" sulle piccole MCU ! :roll_eyes:

Guglielmo

dico cosi perche essendo alle prime armi devo andare per gradi non posso andare direttamente alle cose piu complicate che magari mi avete gia indicato voi, con il mio sistema anche se un po alla base di tutto, funziona, pensavo ci fosse un sistema x farlo partire senza in ogni istante solo indicando al programma che puo ripartire ad ogni pressione del tasto, ma dalle spiegazioni che ho visto credo non sia possibile, dovro studiare ancora un po x trovare la soluzione, piano piano lo capiro ;)