Problemas con sensado de temperatura y termistor 100k

Buenas gente que tal, tal cual anuncia el titulo, tengo problemas a la hora de sensar temperatura con un termistor 100k, estoy intentando controlar con arduino la temperatura en un hotend. He visto ciento de videos y conexiones distintas y no logro hacer que funcione. Aclarar que el termistor que estoy utilizando proviene de una impresora 3d e incluso le he hecho varias pruebas colocandolo en la misma y funciona perfecto, asi que el termistor está en buen estado.
Explico el problema, en temperatura ambiente no hay problema, me da temperaturas buenas. El problema empieza cuando el hotend toma calor y la temperatura se lee normalmente hasta los 120/130 aproximadamente y luego llega un punto donde me empieza a arrojar valores de -273° y asi sucesivamente hasta que el hotend se enfria nuevamente. He intentado tambien calentarlo de forma externa con un llama pequeña y las temperaturas nuevamente son correctas hasta que empieza a fallar en valores por encima de los 120 aproximadamente. Como dije, el termistor esta en buen estado ya que lo pruebo conectandolo en la impresora y funciona correcto asi que no es eso el problema . Adjunto las conexiones y codigo

int Vo;
float R1 = 100000;              // resistencia fija del divisor de tension 
float logR2, R2, TEMPERATURA;
float c1 = 2.114990448e-03, c2 = 0.3832381228e-04, c3 = 5.228061052e-07;
// coeficientes de S-H en pagina: 
// http://www.thinksrs.com/downloads/programs/Therm%20Calc/NTCCalibrator/NTCcalculator.htm

void setup() {
Serial.begin(9600);		// inicializa comunicacion serie a 9600 bps
}

void loop() {
  Vo = analogRead(A0);			// lectura de A0
  R2 = R1 * (1023.0 / (float)Vo - 1.0);	// conversion de tension a resistencia
  logR2 = log(R2);			// logaritmo de R2 necesario para ecuacion
  TEMPERATURA = (1.0 / (c1 + c2*logR2 + c3*logR2*logR2*logR2)); 	// ecuacion S-H
  TEMPERATURA = TEMPERATURA - 273.15;   // Kelvin a Centigrados (Celsius)

  Serial.print("Temperatura: "); 	// imprime valor en monitor serie
  Serial.print(TEMPERATURA);
  Serial.println(" C"); 
  delay(500);				// demora de medio segundo entre lecturas
}

¿Qué temperaturas y valores de resistencia obtenidos usaste para el cálculo de los coeficientes?

En la sección documentación existe un buen tutorial al respecto, búscalo o buenos hilos como éste

Hice las mismas conexiones que mostraste en la imagen de simulacion en protheus,
modifique el codigo a mis parámetros, termistor 100k junto con sus valores de coeficientes y resistencia de 100k para el pull up (probé tambien con 10k) quedando asi:

#include <math.h>
#include <LibPrintf.h>

const int Rc = 100000; //valor de la resistencia pull up
const int Vcc = 5;
const int SensorTempeartura = A1;
//const int sensorPresion = A0;


#define A 2.114990448e-3
#define B 0.3832381228e-4
#define C 5.228061052e-7
float K = 2.5; //factor de disipacion en mW/C

/*float presion() {
  float tmp;
  float valor = (float) analogRead(sensorPresion) * 5.0 / 1023.0;
  //printf("Presion del ADC = %2.5f\n", valor);
  tmp = 250.0 * (valor - 0.51808);
  return tmp;
}*/


void setup() {
  Serial.begin(9600);
}

void loop()  {
  float raw = analogRead(SensorTempeartura);
  float V =  raw / 1023.0 * Vcc;
  float R = (Rc * V ) / (Vcc - V);
  float logR  = log(R);
  float R_th = 1.0 / (A + B * logR + C * logR * logR * logR );
  float kelvin = R_th - V * V / (K * R) * 1000;
  float celsius = kelvin - 273.15;
  //static float  fpresion;
 // fpresion = presion();
  //printf("Presion : %2.1f\n", fpresion);
  printf("T : %2.1f\n", celsius);
  delay(600);
}

Y se imprime esto en el serial :
image

Te agradeceria si puedes ayudarme, me ha costado bastante y aun no logro acertar en este problema

mira, acabo de hacer una simulacion con el primer codigo que he mandado usando las mismas conexiones y me ahorroja los mismos errores a temperaturas cercanas a los 100°. Concluí que hay problemas con el calculo ya que llegando a los 100° la resistencia se vuelve 0 y por ende arroja valores de -273° . Estaria teniendo problemas al armar el calculo. Lo cual, me parece super raro ya que estoy usando el mismo codigo que en varios videos usan y coeficientes similares para termistores de 100k.

¿No habrá alguna variable,que vaya en overflow? Tienes algunas definida como int y en alguna fórmula igual alguna constante se autodefine como int.

Imprime los valores de todas tus variables para identificar dónde está el problema.

Me llama la atención que en tu diagrama tienes conectado A0 y en el programa lees A1 (originalmente leías A0).

Si lees un pin analógico flotante puedes tener como resultado Vcc, y eso haría que R (y por consiguiente logR) sea "nan"

no te sabria responder eso, ya que estoy usando un codigo que extraje de un video de youtube que usa los mismos componentes y conexiones asi que practicamente no le he cambiado nada

te dejare imagenes del valor de la resistencia calculada a medida que muevo el potenciometro que simula ser el termistor de 100k.




Te vuelvo a preguntar

Te falta esta librería para imprimir en punto flotante.

Arduino no tiene soporte de punto flotante como el que se necesita para imprimir con formato, para eso se usa LibPrintf.h
En cambio los nodemcu y ESP32 si lo tienen. Los STM32 tmb, basicamente es una cuestión de tamaño de flash.

Gracias a todos los que se tomaron el tiempo en intentar ayudar. Era una estupidez, tenia que ajustar los coeficientes, mi error fue copiar los mismos valores que he visto en el tutorial de youtube, creyendo que no habria problema al ser ambos termistores de 100k. Ahora funciona correcto, me ayudo bastante hacer la simulacion en tinkercad, ya que gracias a eso me di cuenta que me arrojaba valores de -273° cuando el potenciometro estaba al minimo (simulando el termistor a temperaturas altas) y ahi me di cuenta que debia ajustar los coeficientes y el problema era software no hardware como yo creía. Fue el punto de inflexion en todo este problema!. Estuve a punto de descarta usar termistor e ir directamente por el modulo max6675 y termocupla tipo k :grimacing:

El error empieza aca

  float logR  = log(R);

No existe el log de un número negativo
R es negativo y su log() no existe en los reales.

Por eso nan.

¿Y que un tonto (o sea yo) te preguntase 2 veces cómo determinaste los coeficientes no te hizo sospechar nada?

Si me hubieses respondido te ahorrabas 18hs de trabajo porque estaba casi seguro que los coeficientes no eran los de tu NTC y te hubiese dicho que no te servían. :wink:

Si, realmente tienes razón. Mas tonto he sido yo en pasar por alto eso al creer que eran los mismos solo por tener los mismos termistores :sweat_smile:

Claramente ya sabes que estuvo mal, pero el enlace que puse post#3 empezaba con la calculadora de coeficientes.
Pero tu también haces referencia a dicho hilo.
Seguramente no lo leíste, o lo pasaste por alto.
Bueno, así es la electrónica, si no eres preciso es como matemática, llegas a resultados erróneos o que no existen.

Lo he leido si, el tema es que nunca crei que los coeficientes fuesen el problema porque como dije tenia el mismo termistor con el que vi que hicieron las pruebas en el video que usé de guía y entonces use los mismos valores que estaban usando allí. Entonces yo creia que el problema pasaba por otro lado y por eso habia descartado inicialmente un problema de coeficientes