Map()

Ciao
come da titolo vorrei delle informazioni sulla funzione Map().
Nonostante i vari post non riesco ad afferrarne il concetto.
Se volete potete aiutarmi in pratica: Ho un potenziometro connesso alla Analog, di cui ho già calcolato il partitore per avere i 5V.
Adesso vorrei (se non è una cosa troppo "sottile") che ogni 0.5V presenti sul pin Analog si accendesse un Led.
Questa è una porzione di codice dove c'è la funzione Map()

valpot=map(valpot,0,1023,0,???);
Serial.println(valpot);

Cosa devo scrivere al posto di quei punti interrogativi per ottenere il mio intento ?
Quel Serial.print l'ho inserito per vedere i valori su terminale mentre giravo il potenziometro, solo che mi visualizza valori assurdi tipo 850000 quando il potenziometro è al massimo della sua corsa anche se cambio il valore di quei punti di domanda con ad esempio 255, o 5 (pensavo ai volt). Quindi credo di non aver capito come lavora la Map()
Grazie

Naturalmente AUGURI DI BUON NATALE a TUTTI :slight_smile:
Paolo

da come hai spiegato non ho capito bene, però se vuoi che a passi di 0.5V la variabile valpot si incrementi di 1 usando map() dovresti fare:

valpot = map(analogRead(pin), 0, 1023, 0, 10);

dove 0 e 1023 rappresenta il valore da 0 a 5V espresso in count dell' ADC mentre quel 10 che è il risultato di 5V / 0.5V

EDIT:
corretto

me lo sono dimenticato! :blush: Grazie per la correzione, magari è colpa degli sbagliati dell'aperitivo natalzio, forse andavano corretti anche quelli :smiley: Buon Natale!

Buon Natale anche a te! XD

attenzione che i valori saranno molto imprecisi, poichè la val fa operazioni tra interi (senza virgola), e secondo me per valori così piccoli ci sarà un sacco di errore

Grazie Federico
lo prendo per buono anche se non ho capito molto. Smaltisco i pasti natalizi e poi faccio delle prove :slight_smile:
Ma sta funzione Map() come si usa? Se in futuro devo riusarla come faccio il ragionamento per settare i numeri da scrivere nella parentesi?
Comunque ogni 0.5V devo accendere un led, quindi Lesto credo che non mi serva proprio una grande precisione, in ogni caso come faccio ad ottenerne una maggiore?
Dichiaro le variabile Float ?
Vabbeh vi rinnovo gli auguri e dopo questa breve pausa ritorno con le gambe sotto il tavolo :slight_smile:
Bye
Paolo

La funzione è spiegata qui:
http://arduino.cc/en/Reference/Map

converte un numero da un intervallo ad un altro.
E' una semplice proporzione.

direi che la parte importante è quetsa:

long map(long x, long in_min, long in_max, long out_min, long out_max)
{
  return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}

questa è l'operazione matematica che fa la map.

Ragazzi non vogliatemene,
sarà forse che il sangue in questi giorni non affluisce nel cervello, ma allo stomaco :slight_smile: ma proprio non ci arrivo.
Si Leo avevo già letto il tuo link e anche altri, ma quello che ne ho dedotto (correggimi), che i primi due valori
(FromLow e FromHigh) sono quelli relativi alla risoluzione della porta analogica (0 ,1023).
Gli altri due valori, che cambiano da progetto a progetto non riesco a interpretarli.
Un esempio da un sito dice:

val=map(analogRead(0),0,1023,100,200); // associa il valore analogico 0 ad un valore tra 100 e 200

Quindi nel mio caso gli ultimi due valori devono essere 0, 0.5 ????

  1. non puoi usare numeri con la virgola: come vedi, la funzione map restituisce un intero di tipo lungo (long map() ecc...).

  2. la sintassi è:
    risultato=map(valore, minimoValore, massimoValore, minimoRisultato, massimoRisultato)

Quindi, passi il valore da esaminare, poi dai gli estremi entro cui "valore" può spaziare, poi dai gli esteremi entro cui "risultato" può spaziare.
Non fermarti ad esaminare il caso di una conversione di un valore letto da un pin analogico, la map serve un po' per tutto. Quindi se hai un numero che spazia tra 100 e 200, es. 174, e vuoi convertirlo in un numero tra 0 e 5 farai:
risultato=map(185, 100, 200, 0, 5)
per ottenere risultato=4

Leo,
Però nel mio caso io devo stare dentro un valore che è 0.5.
Praticamente ho 10 led, ogni led deve accendersi a 0.5V per un totale di 5V per tutti i led accesi.
E qui mi manca il ragionamento logico per arrivare a settare i valori che mi servono.

A questo punto mi è servito il suggerimento di Federico

dove 0 e 1023 rappresenta il valore da 0 a 5V espresso in count dell' ADC mentre quel 10 che è il risultato di 5V / 0.5V

e funziona bene.
Grazie Federico

Vediamo se riesci a fare 1+1 da solo :wink:

Tu hai una funzione che ti restituisce un INTERO, non può gestire numeri in virgola mobile (0.5, 1.5 ecc..).
Se alla funzione map chiedi un'uscita da 0 a 10 e poi dopo dividi per 2, che cosa ottieni? :wink:

Se guardo le stampe sul serial monitor leggo col potenziometro tutto aperto il valore 8 ma a questo punto credo che dovrei leggere 10

Il partitore è calcolato per non dare un valore in ingresso pari a 5V al massimo della tensione letta. Rivedi le R del partitore: che valori hanno? Che tensione devi leggere?

No no Leo, lascia perdere :slight_smile: :slight_smile:
Avevo editato il post (come potrai ben notare) probabilmente mentre lo leggevi, perchè l'errore nel leggere 8 invece che 10 è stata colpa mia.
Avevo regolato male o forse spostato la manopolina dell'alimentatore. Me ne sono reso conto un secondo dopo aver inviato il post, per cui ho fatto la correzione e ringraziato Federico.
Tutto a posto, partitore ok, funzionamento ok, tutto risolto :slight_smile: Grazie Leo :slight_smile: Anche per l'aiuto nel ragionamento :slight_smile: