Error con la Función map();

Buenas tardes a todos, es comento un raro problema que ando teniendo con mi proyecto. Estoy tratando de hacer una interpolación entre dos array para interpretar los datos de un sensor, en este caso un NTC de 10K, interpolando el valor un array que contiene los valores del ADC con otro que contiene valores de temperatura, el problema es que tengo una especie de bug en la función map(); y no entiendo el porque, les dejo el código con el error

Código:
#define centesima 100
#define TAMANIO 41

unsigned int ADC_VALOR[TAMANIO] =  //Array de lecturas del ADC
{765, 760, 718, 713, 668, 663, 617, 611, 564, 559, 512, 507, 461, 456, 413, 408, 367, 363, 325, 321, 287, 283, 252, 249, 221, 218, 194, 191, 170, 168, 149, 147, 130, 128, 114, 1012, 100, 99, 88, 87, 77};
//  0,  0.5  5,   5.5,  10  10.5  15  15.5  20  20.5  25  25.5 30  30.5   35  35.5  40  40.5  45  45.5  50  50.5  55  55.5  60  60.5  65  65.5  70  70.5  75  75.5  80  80.5  85  85.5  90  90.5 95 95.5 100

unsigned int Temperatura[TAMANIO] = //Array de temperaturas en centecimas
{0, 50, 500, 550, 1000, 1050, 1500, 1550, 2000, 2050,  2500, 2550, 3000, 3050, 3500, 3550, 4000, 4050, 4500, 4550, 5000, 5050, 5500, 5550, 6000, 6050, 6500, 6550, 7000, 7050, 7500, 7550, 8000, 8050, 8500, 8550, 9000, 9050, 9500, 9550, 10000};
//0,  0.5  5, 5.5,  10   10.5   15    15.5  20   20.5    25   25.5    30   30.5  35   35.5   40   40.5   45   45.5   50   50.5   55   55.5   60   60.5  65    65.5   70   70.5   75   75.5   80   80.5   85   85.5   90   90.5   95   95.5   100

const int NTC_pin = 0; //Sensor NTC en la entrada A0

void setup(){
    Serial.begin (9600); //Seteamos la frecuencia de comunicacion
         pinMode(NTC_pin, INPUT); //pin A0 como entrada Analoga
}

void loop(){

    int Temp;
    int Lectura_NTC =0;
    int i=0;
    Lectura_NTC = analogRead (NTC_pin); //Leo el puerto A0
    
      Serial.print("Valor ADC: ");
      Serial.print(Lectura_NTC);
      Serial.print("\t\t\t ");

  for (i = (TAMANIO - 1); ADC_VALOR[i] < Lectura_NTC; i --){   //Realizo una busqueda del valor lelido en mi A0 con los valores de mi Array
//buscando el valor que tengo en la entrada o el mas proximo

        if (i==0){                                                   

            goto fin_del_bucle;
            //si no encuentra el valor de ADC que busca entonces sale del bucle para no
            //quedar atrapado de forma infinita.
        }
    }
    
   fin_del_bucle:

  Temp = map(Lectura_NTC, ADC_VALOR[i], ADC_VALOR[i+1], Temperatura[i], Temperatura[i+1]); //mapeo entre los dos array y almaceno en temp


  Serial.print("Temperatura: ");
  Serial.print((float)Temp/centesima); 
//divido por 100 e imprimo en pantalla, de esta manera evito usar float en los Array
  Serial.println("\t\t\t ");
  delay(250); 
}
//fin del programa

Primera mente cargue 21 valores y obtenía una apreciación de 1 grado y me funciono, les dejo el primero que escribí (este funciona muy bien)

Código:
#define TAMANIO 21

unsigned int Temperatura[TAMANIO] =
{0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100}; //Array de temperatura

unsigned int ADC_VALOR[TAMANIO] =
{765, 718, 668, 618, 564, 512, 461, 413, 367, 325, 287, 252, 221, 194, 170, 149, 130, 114, 100, 88, 77}; //Array para los valores de ADC

const int NTC_pin = 0; //Sensor NTC en la entrada A0

void setup()
{
    Serial.begin (9600); //Seteamos la frecuencia de comunicacion
    pinMode(NTC_pin, INPUT);
}

void loop()
{
    int Temp;
    int Lectura_NTC =0;
    int i=0;
    Lectura_NTC = analogRead (NTC_pin); //Leemos el puerto A0
    
    
    Serial.print("Valor ADC: ");
  Serial.print(Lectura_NTC);
    Serial.print("\t\t\t ");
    for (i = (TAMANIO - 1); ADC_VALOR[i] < Lectura_NTC; i --) //Busco el valor de mi entrada A0 o el mas proximo
    {   
        if (i==0)
        {
            goto fin_del_bucle;
            //si no encuentra el valor de ADC que busca entonces sale del bucle para no
            //quedar atrapado de forma infinita.
        }
    }
    
    fin_del_bucle:
    
    Temp = map(Lectura_NTC, ADC_VALOR[i], ADC_VALOR[i+1], Temperatura[i], Temperatura[i+1]); //mapeo entre los dos Array (Interpolacion)
    Serial.print("Temperatura: ");
    Serial.print(Temp);  //Imprimo la Temperatuera (apresiacion de a 1 Grado )
    Serial.println("\t\t\t ");
      delay(250);
} //fin


agradecería que me ayudaran a encontrar mi error en el primer código que coloque se que es en el map(); pero no logro verlo, desde ya gracias
 
Se llama "Error de tipeo"

unsigned int ADC_VALOR[TAMANIO] = //Array de lecturas del ADC
{765, 760, .........., 130, 128, 114, 1012, 100, 99, 88, 87, 77};

1012 WTF! ---->> debe ser 112

No entiendo por qué los incrementos en temperatura son 50 , 450 , 50 , 450,...
Tiene sentido saltos chicos donde la función se aleja de una recta y saltos grandes cuando se acerca, pero salto chico-salto grande-chico-salto grande-.... es absurdo.
 
Última edición:
Se llama "Error de tipeo"

unsigned int ADC_VALOR[TAMANIO] = //Array de lecturas del ADC
{765, 760, .........., 130, 128, 114, 1012, 100, 99, 88, 87, 77};

1012 WTF! ---->> debe ser 112

No entiendo por qué los incrementos en temperatura son 50 , 450 , 50 , 450,...
Tiene sentido saltos chicos donde la función se aleja de una recta y saltos grandes cuando se acerca, pero salto chico-salto grande-chico-salto grande-.... es absurdo.

Ah qué "despistado" por no decir otra cosa jaja, muchas gracias, el sueño no me dejaba ver bien el error, muchas gracias,
En cuanto a la temperatura yo primero tomaba de a 5 grados y ahora para poder tener una aproximación bastante buena tomo de a 0, 0.5, 5, 5.5 °C y eso me da una aproximación de 0.1°C bastante aceptable, aparte ahorro un poco de memoria, aún así el bootloader del Arduino Nano q uso me ocupa 5Kb!!.
Bueno dejo el código corregido, es adaptable para pic también, solo hay q copiar y pegar la función Map de Arduino q está en su página, para quien quiera jugar un poco con esto

Código:
#define centesima 100
#define TAMANIO 41

unsigned int ADC_VALOR[TAMANIO] =  //Array de lecturas del ADC
{765, 760, 718, 713, 668, 663, 617, 611, 564, 559, 512, 507, 461, 456, 413, 408, 367, 363, 325, 321, 287, 283, 252, 249, 221, 218, 194, 191, 170, 168, 149, 147, 130, 128, 114, 112, 100, 99, 88, 87, 77};
//  0,  0.5  5,   5.5,  10  10.5  15  15.5  20  20.5  25  25.5 30  30.5   35  35.5  40  40.5  45  45.5  50  50.5  55  55.5  60  60.5  65  65.5  70  70.5  75  75.5  80  80.5  85  85.5  90  90.5 95 95.5 100

unsigned int Temperatura[TAMANIO] = //Array de temperaturas en centecimas
{0, 50, 500, 550, 1000, 1050, 1500, 1550, 2000, 2050,  2500, 2550, 3000, 3050, 3500, 3550, 4000, 4050, 4500, 4550, 5000, 5050, 5500, 5550, 6000, 6050, 6500, 6550, 7000, 7050, 7500, 7550, 8000, 8050, 8500, 8550, 9000, 9050, 9500, 9550, 10000};
//0,  0.5  5, 5.5,  10   10.5   15    15.5  20   20.5    25   25.5    30   30.5  35   35.5   40   40.5   45   45.5   50   50.5   55   55.5   60   60.5  65    65.5   70   70.5   75   75.5   80   80.5   85   85.5   90   90.5   95   95.5   100

const int NTC_pin = 0; //Sensor NTC en la entrada A0

void setup(){
    Serial.begin (9600); //Seteamos la frecuencia de comunicacion
         pinMode(NTC_pin, INPUT); //pin A0 como entrada Analoga
}

void loop(){

    int Temp;
    int Lectura_NTC =0;
    int i=0;
    Lectura_NTC = analogRead (NTC_pin); //Leo el puerto A0
    
      Serial.print("Valor ADC: ");
      Serial.print(Lectura_NTC);
      Serial.print("\t\t\t ");

  for (i = (TAMANIO - 1); ADC_VALOR[i] < Lectura_NTC; i --){   //Realizo una busqueda del valor lelido en mi A0 con los valores de mi Array
//buscando el valor que tengo en la entrada o el mas proximo

        if (i==0){                                                   

            goto fin_del_bucle;
            //si no encuentra el valor de ADC que busca entonces sale del bucle para no
            //quedar atrapado de forma infinita.
        }
    }
    
   fin_del_bucle:

  Temp = map(Lectura_NTC, ADC_VALOR[i], ADC_VALOR[i+1], Temperatura[i], Temperatura[i+1]); //mapeo entre los dos array y almaceno en temp

  Serial.print("Temperatura: ");
  Serial.print((float)Temp/centesima); 
//divido por 100 e imprimo en pantalla, de esta manera evito usar float en los Array
  Serial.println("\t\t\t ");
  delay(250); 
}
//fin del programa
 
En cuanto a la temperatura yo primero tomaba de a 5 grados y ahora para poder tener una aproximación bastante buena tomo de a 0, 0.5, 5, 5.5 °C y eso me da una aproximación de 0.1°C bastante aceptable

Si querés mejorarlo tenés que tomar de a 2.5° (0,2.5,5,7.5,10,....) porque de esa forma mejorás solamente el intervalo entre T y T+0.5 , el intervalo entre T+0.5 y T+5 queda prácticamente con el mismo error de antes.
 
Atrás
Arriba