salve a tutti
Vorrei usare la funzione "map" ma che mi restituisce i decimali è possibile?
Grazie
Mi sono spiegato?
Se leggi il reference, trovi:
The map() function uses integer math so will not generate fractions
fai la map e poi dividi per 10 o per 100, casomai.
in che senso?
esempio
a = map (b, 0, 1025 , 0 , 100);
potrei fare:
a = (b / 1025) * 100;
che fa piu o meno la stessa cosa e mi restituisce i decimali
ma se :
a = map (b, 1025, 0, 0 , 100);
oppure
a = map(b, variabile1, variabile2 , 0, 1025);
come faccio?......
Oppure ti copi la map (la trovi nel codice di Arduino) e ti fai una versione con i float.
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;
}
Non riesco a capire la mappa lunga, cosa è x molto in_min out_max???? per cortesia è possibile avere un esempio pratico.
Grazie.
Credo che per ottenere la funzione, basta cambiare il tipo di ritorno, e il tipo di parametro con "float".
Quindi la funzione che vorresti sarebbe.
float map(float x, float in_min, float in_max, float out_min, float out_max)
{
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}
per usarla, devi copiarla e incollarla nello sketch, si usa come la "tradizionale" map(). solo che invii come parametro numeri decimali.
esempio:
float x=1000
float risultato= map(x,0,1024,100,200);
MA COME LA USI??? la lettura di un pin analogico ti da sempre un intero da 0 a 1023, e la scrittura con analogWrite() è sempre 0 -255 !!!!
Come ti ha mostrato @torn24.
Però io gli darei un nome diverso, esempio fmap() invece di map()
nid69ita:
Però io gli darei un nome diverso, esempio fmap() invece di map()
Sicuramente, per evitare conflitti
...
float fMap(float x, float in_min, float in_max, float out_min, float out_max)
{
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}
... ricordando sempre la scarsa precisione dei float (32 bit) e gli arrotondamenti.
Guglielmo
scusatemi ma continuo a non capire...
facciamo un esempio
a = map (b, c, d, e, f);
cosa devo scrivere al posto di questa riga?
@danyevo: Emmm ... però qui siamo proprio alle basi ...
... che ne dici, prima di proseguire, magari di dedicare un po' di tempo per studiarti un po' meglio la programmazione di Arduino? ... perché poi ti riavvicinerai, sicuramente più produttivo, al tuo programma ![]()
Magari puoi cominciare con QUESTO e puoi scaricarti QUESTO libro (... tranquillo, è un sito legale, purché per esclusivo uso PERSONALE).
Guglielmo
Diciamo che conosco più o meno tutto ma preferisco studiare il linguaggio man mano che mi serve almeno mi rimane più in mente..
Ora non riesco a capire questa cosa e mi serviva aiuto..
float x=1000
float risultato= map(x,0,1024,100,200);
in questo caso il primo valore X, è il valore che passi alla funzione, magari letto da un pin analogico.
i primi due argomenti, zero 0 e 1024, sono la "scala" dei valori di ingresso, ossia il valore X può assumere
un valore compreso tra zero 0 e 1024.
i secondi due argomenti, 100 e 200, sono la "scala" dei valori di uscita.
In parole, invio un valore X compreso tra zero e 1024, mi restituisce un valore in uscita compreso,
tra 100 e 200, proporzionale alle due scale.
Meglio di cosi non so spiegarlo ![]()
danyevo:
scusatemi ma continuo a non capire...
facciamo un esempioa = map (b, c, d, e, f);
cosa devo scrivere al posto di questa riga?
Se abbiamo creato una nuova funzione che si chiama fMap() al posto di map() come devi cambiare quella riga secondo te ? E' un problema di logica qui, mica di programmazione !!
Sei partito con l'esempio:
long a = map (b, 0, 1025 , 0 , 100);
continuiamo con quello:
float a = fMap (b, 0, 1025 , 0 , 100);
Overloading questo sconosciuto.
Puoi avere più funzioni con lo stesso nome, il compilatore sceglie in base al tipo e al numero degli argomenti passati.
Questo naturalmente perché il compilatore per Arduino è avr-gcc quindi C++. In C non c'è l'overloading delle funzioni.
Vero @PaoloP, ma non aggiungiamo troppa carne sul fuoco. ![]()
PaoloP:
Overloading questo sconosciuto.
A chi ? ![]()
Guglielmo
P.S. ... è non t'azzardare a consigliare l'overloading ad un principiante ... che poi non capisce più nulla !
![]()