Gran sorpresa!!!
Prueba funcion map ESP8266
i = 1023: 101
i = 1022: 108
i = 1021: 115
i = 1020: 122
long map2(long x, long in_min, long in_max, long out_min, long out_max) {
const long dividend = out_max - out_min;
const long divisor = in_max - in_min;
const long delta = x - in_min;
return (delta * dividend + (divisor / 2)) / divisor + out_min;
}
void setup() {
Serial.begin(115200);
Serial.println("Prueba funcion map ESP8266");
delay(1000);
for (long i=1023; i>1010; i--) {
long tmp = map2(i, 0, 1023, 7200, 100);
Serial.printf("i = %4ld: %ld\n", i, tmp);
}
}
void loop() {
}
NOTA: @anon90500195, esta todo bien.
Edito 2: Yo sigo investigando, miren esto, apareció el responsable
Tal como dije antes, el cociente tenía que dar -7099 para que sumado a 7200 diera x resultado 101 y asi es.
Corrido en un ESP8266
long map2(long x, long in_min, long in_max, long out_min, long out_max) {
const long dividend = out_max - out_min;
const long divisor = in_max - in_min;
const long delta = x - in_min;
Serial.printf("divided : %ld\n", dividend);
Serial.printf("divisor : %ld\n", divisor);
Serial.printf("delta : %ld\n", delta);
Serial.printf("Suma 1 : %ld\n", delta * dividend + (divisor / 2));
Serial.printf("Cociente: %ld\n", (delta * dividend + (divisor / 2)) / divisor);
return (delta * dividend + (divisor / 2)) / divisor + out_min;
}
void setup() {
Serial.begin(115200);
Serial.println("Prueba funcion map ESP8266");
delay(1000);
long i = 1023;
long tmp = map2(1023, 0, 1023, 7200, 100);
Serial.printf("i = %4ld: %ld\n", i, tmp);
}
void loop() {
}
La respuesta del Serial Monitor
Prueba funcion map ESP8266
divided : -7100
divisor : 1023
delta : 1023
Suma 1 : -7262789
Cociente: -7099 <== CULPABLE
i = 1023: 101
De manera que esta operación en lugar de dar -7100 responde con un -7099
(delta * dividend + (divisor / 2)) / divisor
EDITO 3: Probé en un nano y la función map original contra la que traje del ESP que es idéntica pero luego de editar este post lo comprobaré de nuevo
#include <LibPrintf.h> // <== Esta librería es una maravilla!!!!
long map2(long x, long in_min, long in_max, long out_min, long out_max) {
const long dividend = out_max - out_min;
const long divisor = in_max - in_min;
const long delta = x - in_min;
printf("divided : %ld\n", dividend);
printf("divisor : %ld\n", divisor);
printf("delta : %ld\n", delta);
printf("Suma 1 : %ld\n", delta * dividend + (divisor / 2));
printf("Cociente: %ld\n", (delta * dividend + (divisor / 2)) / divisor);
return (delta * dividend + (divisor / 2)) / divisor + out_min;
}
void setup() {
Serial.begin(115200);
Serial.println("Prueba funcion map en NANO");
delay(1000);
long i = 1023;
long tmp = map(1023, 0, 1023, 7200, 100);
printf("i = %4ld: %ld\n", i, tmp);
tmp = map2(1023, 0, 1023, 7200, 100);
printf("i = %4ld: %ld\n", i, tmp);
}
void loop() {
}
Resultados
i = 1023: 100 <===== esta es con la función map original para AVR
divided : -7100
divisor : 1023
delta : 1023
Suma 1 : -7262789
Cociente: -7099
i = 1023: 101 <===== esta es con la función map supuestamente del core para ESP