Riportare valore analogread su striscia led

Salve a tutti volevo sapere come può essere possibile riportare il valore letto su un pin analogico, quindi il valore analogico trasformato in un valore digitale, su una riga di led per esempio 8 led, che si accendano in base al valore digitale derivato dall'analogico....

Ho visto che è molto più semplice trasferire il valore analogico in un valore pwm, per esempio, ma se io volessi vedere il valore in digitale con una striscia led?

Grazie in anticipo.

Digitale significa 0 o 1, non hai molta scelta :wink:

Forse non sono stato chiaro.... lo so benissimo che il digitale ha 0 o 1 e fino a qui mi trovi daccordo....
Il pin analogico di arduino, riceve in ingresso un valore appunto analogico.
Arduino non fa altro che prendere questo valore e trasformarlo in digitale, da 0 a 1024 valori digitali, quindi devo avere 10 led in fila per leggere il numero 1024 in digitale (tutti i led accesi).
Ora come si fa con il software a riportare il valore che inserisco nel pin analogico su 10 pin digitali di arduino, collegandoci 10 led che mi fanno vedere il valore analogico in un determinato momento?

Usi due variabili e la funzione map.

Maledetto forum... mi ha sloggato dopo aver scritto la risposta... :roll_eyes:

Dunque un pin analogico restituisce un valore numerico di 10 bit. Se manipoli direttamente le porte logiche del micro, 8 pin puoi cambiarli immediatamente con una semplice operazione di assegnazione, vedi qui:
http://www.leonardomiliani.com/2013/manipoliamo-direttamente-le-porte-logiche-di-una-mcu/

Per i restanti 2 bit puoi fare una semplice operazione di AND bit per bit oppure leggere il valore di questi bit con la funzione bitRead:
http://arduino.cc/en/Reference/BitRead

Oppure aggiungi 64 e dividi per 128 e ottieni un numero da 0 a 7.
Questo numero ottenuto lo usi come indice di un array dove sono memorizzati i numeri dei Pin dove sono collegati i LED. Se vuoi accendere solo un led allora solo il led che corrisponde al numero se vuoi una barra accendi tutti quelli fino al numero.
Prima di riscrivere il valore sui led spegni tutti i led.
Ciao Uwe

Ma lui vuole 10 pin:

valfus:
devo avere 10 led in fila per leggere il numero 1024 in digitale (tutti i led accesi).

A me piaceva più la soluzione proposta da cece99 con la map.

Mi permetto di semplificarla meglio.

valoredavisualizzare = map(valoreletto, 0, 1023, 0, 7)

Questo converte valoreletto dal range [0, 1023] al range [0, 7] (nel caso in cui vuoi 8 led, se ne vuoi 10 userai il range [0, 9])

Ipotizzando poi che i piedini digitali di Arduino non ti bastino per collegare gli 8/10 led (magari perchè impiegati per altri scopi) allora potrai utilizzare un IO expander (per esempio il PCF8574) al quale passerai tramite I2C il byte corrispondente ai led che vuoi far accendere. Questo dovrebbe essere facile, ma se hai problemi chiedi pure...

Il PCF8574 ha solo 8 uscite, adatto quindi per gestire 8 led. Se ne vuoi 10 potrai usarne due oppure utilizzare due piedini di Arduino per i restanti led.

Ciao.

valfus:
Forse non sono stato chiaro.... lo so benissimo che il digitale ha 0 o 1 e fino a qui mi trovi daccordo....
Il pin analogico di arduino, riceve in ingresso un valore appunto analogico.
Arduino non fa altro che prendere questo valore e trasformarlo in digitale, da 0 a 1024 valori digitali, quindi devo avere 10 led in fila per leggere il numero 1024 in digitale (tutti i led accesi).
Ora come si fa con il software a riportare il valore che inserisco nel pin analogico su 10 pin digitali di arduino, collegandoci 10 led che mi fanno vedere il valore analogico in un determinato momento?

... mmm ... credo di aver capito che tu vuoi la rappresentazione BINARIA del valore da 0 a 1023 (... e non 1024, 1024 sono i possibili valori) sui tuoi 10 led, giusto ?

La cosa più semplice è che usi un qualche shift register esterno a cui colleghi i led ed a cui, da un pin, invii in sequenza i 10 bit. Oppure ... usi 10 pin ed a ciascuno colleghi resistenza+led e mandi a ciascuno dei 10 pin il valore 0/1 del singolo bit dei tuoi 10 :slight_smile:

Guglielmo

leo72:
Ma lui vuole 10 pin:

valfus:
devo avere 10 led in fila per leggere il numero 1024 in digitale (tutti i led accesi).

allora deve dividere per 102,4
Ciao Uwe

Quoto Guglielmo, può usare 2 shift register in cascata e spedirgli l'int letto dal pin analogico direttamente.

OK come ha detto Guglielmo è giusto vorrei riportare il valore in binario sui 10 led, ma una cosa non ho ben capito: perchè dovrei utilizzare dei shift esterni?
Ma allora arduino non riesco a sfruttarlo per darmi un banalissimo codice binario accendendo e spegnendo dei led tradotto da un valore analogico?
Scusate con i PIC che li programmo in assembler è una cosa semplicissima e qui devo usare dei registri shift esterni?

Non devi usarli per forza, te li hanno consigliati per comodità.
Useresti solo 3 pin del microcontrollore contro i 10 pin per il collegamento diretto.
Devi tenere in mente però che non puoi chiedere più di 200mA all'Atmega

C'è un tutorial con schema e codice già pronto --> http://arduino.cc/en/Tutorial/BarGraph :grin: :grin: