Termometro digital sonda distinta y atenuación

Buenas tardes.

Tengo un termometro digital Chino la el cual usa una sonda NTC 10KΩ 3950. Lo que no se es cómo hacer y tampoco se si es posible, sería coneCtarlo a una sonda NTC de valores distintos. No se si hay alguna forma de hacer un apaño o algún tipo de adaptación para que marque la temperatura correcta con la sonda cambiada.

Otra cosa que necesito saber. ¿Hay alguna forma de atenuar a demanda el display LED del termometro?

Dejo aqui las fotos del aparato y de los valores de los NTC:

El Termómetro
236464.png

Valores de la sonda actual
Screenshot from 2026-09-19 13-33-12.png


Valores de la sonda que necesito instalar
Screenshot from 2026-09-19 13-32-01.png
 
Última edición por un moderador:
Para comparar las sondas hace falta la curva resistencia/temperatura, no solo un valor en Ohmios. TDK describe la característica de una NTC mediante la resistencia a una temperatura de referencia y el valor B; para comprobar un intervalo más amplio utiliza tablas R/T. Antes de recomendar un adaptador, ¿puedes indicar de qué equipo procede la nueva sonda y qué intervalo de temperaturas quieres medir? Si tienes su referencia o ficha técnica, mejor.

Sobre la atenuación del LED, ¿qué modelo exacto es el termómetro y dispone de algún ajuste de brillo? No propondría modificar la alimentación sin conocer el aparato.
 
Última edición por un moderador:
Creo que todo es NO, mas allá que puedas hacer una adaptación de las sondas, con un arreglo de operacionales para ajustar las lecturas del nuevo, la tabla del nuevo denota poca precisión, muy distinta a la tabla de la sonda original, conclusión, cuando se quiere medir algo así y mantener la exactitud y precisión, se tiene que tener el conjunto original según el fabricando.
 
Para comparar las sondas hace falta la curva resistencia/temperatura, no solo un valor en Ohmios. TDK describe la característica de una NTC mediante la resistencia a una temperatura de referencia y el valor B; para comprobar un intervalo más amplio utiliza tablas R/T. Antes de recomendar un adaptador, ¿puedes indicar de qué equipo procede la nueva sonda y qué intervalo de temperaturas quieres medir? Si tienes su referencia o ficha técnica, mejor.

Sobre la atenuación del LED, ¿qué modelo exacto es el termómetro y dispone de algún ajuste de brillo? No propondría modificar la alimentación sin conocer el aparato.
La sonda nueva proviene directamente de Renault ya que es un proyecto que tengo entre manos con mi coche. El intervalo de temperaturas seria los valores normales que puedes medir de ambiente, nada especial. Estoy buscando una tabla mas detallada de la sonda nueva, si la consigo la paso.

En relación con la atenuación, no tiene ajuste de brillo y es uno generico que compre por amazon que no trae marca ni modelo, no obstante dejo aqui una foto de la parte trasera.238779.png
 
Estás tratando de resolver el problema de forma errónea...
1- Justo ese termómetro que has comprado no es muy popular, te conviene buscar el módulo W1209, también emplea una NTC, y suele ser controlado por un microcontrolador STM8.

Ésta placa suele ser modificada (hackeada dicen) y la convierten en tacómetro, voltímetro, velocímetro, etc., fácilmente. Porque reprograman al micro STM8 según les plazca y no arman nada... busca porque hay información al respecto.

2-Con ésto de la Arduineria (ciencia de programacion y modularización electrónica para novatos, y prototipado) existe seguro la solución para tal o cual NTC, y seguro un proyecto que se le ocurrió a alguien. Deberías buscar por ese lado la solución a la lectura de tu NTC.
 
Cuando yo era joven esos termómetros tenían dos potenciómetros, si ahora va todo programado pues habrá que reprogramar el chip. ¿Como? ni idea
 
Lamentablemente la salida de practicamente el 99.9% de los NTC no es lineal y un amp op no te va ayudar mucho. Así que primero necesitas hacer ingenieria inversa aplicando Steinhart-Hart en un Excel con esas sondas nuevas... con esos datos vas a poder saber mas o menos de que curva estamos hablando. Creo que hay un tópico en el foro que habla al respecto...

Después, lamentablemente si son distintas curvas por lejos, vas a tener que descartar tu modulo. Si son iguales, genial.
Como es un NTC, podés hacerlo vos mismo con un simple mirocontrolador y un MAX6682 que prácticamente lo amoldás a cualquier NTC... si queres sumar display lcd o un display de 7 segmentos (4 digitos), te recomiendo el tm1637.

Lo bueno del MAX y el TM, es que vienen ya listos en formato shield, solo conectas y te faltaría sumar la programación al micro.
 
Estás tratando de resolver el problema de forma errónea...
1- Justo ese termómetro que has comprado no es muy popular, te conviene buscar el módulo W1209, también emplea una NTC, y suele ser controlado por un microcontrolador STM8.

Ésta placa suele ser modificada (hackeada dicen) y la convierten en tacómetro, voltímetro, velocímetro, etc., fácilmente. Porque reprograman al micro STM8 según les plazca y no arman nada... busca porque hay información al respecto.

2-Con ésto de la Arduineria (ciencia de programacion y modularización electrónica para novatos, y prototipado) existe seguro la solución para tal o cual NTC, y seguro un proyecto que se le ocurrió a alguien. Deberías buscar por ese lado la solución a la lectura de tu NTC.
Es justo lo que le iba a comentar, con un arduino puede hacer un adaptador "analogo-digital" entre la sonda original y el modulo chino, tal vez cueste hacerlo pero de ser posible es posible, solo que hay que calibrar,hacer mediciones de control, escribir valores promedio, graficar curvas de las sondas, colocar seteos de temperatura seguros para ajuste de lectura entre aumentos y reducciones de grados, y asi lograr una lectura que sea "fiable".
 
Don Scooter... ahora esos potenciómetros se convirtieron en I.A. ( y todo esto empieza a hacerse aburrido)

Ale, de casualidad entre a chusmear en el link y no me tires con nada por la cabeza, pero tiene un error "matemástrico" conceptual y un par de detalles que van a romper la precision o el funcionamiento real... Ese es el problema muchas veces del C&P confiando a ciegas de una IA...
Raro en un IA, pero mira el error de la formula del divisor. La IA de turno que te respondio te dijo que la formula de la resistencia es:

float resistenciaNTC = R_AUX * ((1023.0 / (float)valorADC) - 1.0);

Ahora, sin ver el hardware asume algo y si el NTC esta conectado a VCC y la resistencia fija (R_AUX) a GND, la fórmula correcta es:

R_NTC = R_AUX * ((1023.0 / valorADC) - 1.0)

Supongamos que el hardware esta conectado alverre, o sea está conectado a GND y la R_AUX a VCC, la fórmula cambia a:

R_NTC = R_AUX / ((1023.0 / valorADC) - 1.0)

medir te va a medir, pero te va a dar la temperatura invertida y va a ver cosaeloco en la pantalla cuando sientas quesube la temperatura real, pero en la pantalla te dice que baja... cuack!
El otro tema es la poca inteligencia que le ponen muhas veces las IAs para responder y no preguntar primero para asumir el hardware. Fijate que en los comentarios te deja bien claro que vas a usar a futuro el shield LCD keypad que justamente es muy problemático cuando cambia el valor de la fuente, pero eso es lo de menos por ue se edita 1 o dos líneas o usar uno i2c (menos cablerio)… Loque si, por ahi miraría de sumar a la edición otras lineas mas... por ejemplo ese sketch eta imprimiendo "TEMP. ACTUAL" adentro del loop(). Esto hace que el LCD reescriba esa cadena de texto fija cada 500 milisegundos. Va a causar un parpadeo feo... Yo lo hubiera ralizado con un texto estatico desde el setup() y en el loop() solo modificaria el valor de la variable que muestra la temperatura.
Lo mismo que reomendo la IA, pero corregido y optimizado suponiendo que tenés el NTC a VCC y R_AUX a GND:

C++:
#include <LiquidCrystal.h>
#include <math.h>

// Configuracion de los pines para el Shield LCD Keypad
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

// Configuración del sensor
const int pinNTC = A1; //mirar por las dudas si el shield tiene la pista de A1, sino pasar a los otros puertos analogicoas         
const float R_AUX = 3000.0;     
const float R_NOMINAL = 3000.0; 
const float T_NOMINAL = 25.0;   
const float BETA = 3950.0;       

void setup()
  {
  lcd.begin(16, 2);
  lcd.clear();
 
  // Mensaje de bienvenida
  lcd.setCursor(0, 0);
  lcd.print("Termometro NTC");
  lcd.setCursor(0, 1);
  lcd.print("Iniciando...");
  delay(1500);
  lcd.clear();
  // Imprimimos el texto fijo una sola vez aca para evitar parpadeos
  lcd.setCursor(0, 0);
  lcd.print("TEMP. ACTUAL:");
  }

void loop()
  {
  int valorADC = analogRead(pinNTC);
  // evitamos divisiones por cero o lecturas fuera de rango
  if (valorADC <= 0 || valorADC >= 1023)
    {
    lcd.setCursor(0, 1);
    lcd.print("Error Sensor    ");
    delay(500);
    return;
    }
  // Calcular la resistencia del NTC (si es que la NTC a VCC y R_AUX a GND)
  float resistenciaNTC = R_AUX * ((1023.0 / (float)valorADC) - 1.0);
  // Ecuacion Beta de Steinhart-Hart
  float temperaturaK = resistenciaNTC / R_NOMINAL;     
  temperaturaK = log(temperaturaK);                   
  temperaturaK /= BETA;                               
  temperaturaK += 1.0 / (T_NOMINAL + 273.15);         
  temperaturaK = 1.0 / temperaturaK;                   
  // Convertir a Celsius
  float temperaturaC = temperaturaK - 273.15;
  // Mostrar solo el valor variable en la segunda fila
  lcd.setCursor(0, 1);
  lcd.print(temperaturaC, 1);
  lcd.print(" ");
  lcd.write(0xDF);            // Simbolo de grados
  lcd.print("C     ");        // Espacios para borrar caracteres viejos si pasa de 2 a 1 dígito
  delay(500);
  }

Lo que yo recomendaba anteriormente era algo asi multi hardware que parte de estas líneas las use para otro proyecto, asi que corte algunas partes y la pegue en este nuevo sketch... solo hay que descomentar las líneas correspondientes según lo que se va a usar (LCD o 7segmentos) y el control del brillo de ambos (pulsadores o un simple poteniometro)... es una idea modularizada para simplificar hardware

C++:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <TM1637Display.h>
#include <math.h>

// ==========================================
// 1. CONFIGURACIÓN DE PANTALLA (comentar o descomentar solo una para habilitar la configuracion del hardware)
// ==========================================
#define MODO_PANTALLA_LCD
//#define MODO_PANTALLA_TM1637

// ==========================================
// 2. INTERFAZ DE CONTROL (comentar o descomentar solo una para habilitar la configuracion del hardware)
// ==========================================
#define CONTROL_POR_POTENCIOMETROS 
//#define CONTROL_POR_PULSADORES     

// ==========================================
// 3. SELECCIÓN DE SENSOR NTC (comentar o descomentar solo una para habilitar la configuracion del hardware)
// ==========================================
//#define SENSOR_NTC_ANALOGICO       
#define SENSOR_MAX6682             

// ==========================================
// ASIGNACIÓN ESTRICTA DE PINES I/O
// ==========================================
const int PIN_RELAY          = 10;
const int PIN_PWM_BRILLO     = 6;   // Salida PWM física para controlar el brllo del display LCD

#ifdef CONTROL_POR_POTENCIOMETROS
  const int PIN_POT_SETPOINT = A1;
  const int PIN_POT_BRILLO   = A2;
#endif

#ifdef CONTROL_POR_PULSADORES
  const int PIN_BTN_SET_UP   = 2;
  const int PIN_BTN_SET_DOWN = 3;
  const int PIN_BTN_BRI_UP   = 4;
  const int PIN_BTN_BRI_DOWN = 5;
#endif

#ifdef SENSOR_NTC_ANALOGICO
  const int pinNTC           = A0;         
  const float R_AUX          = 3000.0;     
  const float R_NOMINAL      = 3000.0; 
  const float T_NOMINAL      = 25.0;   
  const float BETA           = 3950.0;       
#endif

#ifdef SENSOR_MAX6682
  const int MAX6682_CS       = 7; 
  const int MAX6682_MISO     = 12;
  const int MAX6682_SCK      = 13;
#endif

// ==========================================
// PARAMETROS POR SI SE USA EL MOD TERMOSTATO
// ==========================================
const float HISTERESIS       = 1.0;
// el agua tiene inercia térmica, asi que sumamos3 minutos en milisegundos para proteger el equipo para no ciclar rápido... 3 minutos es una delta considerable
const unsigned long TIEMPO_MIN_APAGADO = 180000;

// Variables de control interno
int nivelBrillo = 4;     
int setpointDecimas = 300;
bool relayActivo = false;
unsigned long tUltimoApagado = 0; // registro para el anti-cicladorapido

// Variables para la lógica del TM1637 (Titileo y timeout de 2 segundos)
unsigned long tUltimoCambioSet = 0;
bool mostrandoSetpoint = false;
bool alternarTitileo = false;
unsigned long tUltimoTitileo = 0;

// Instanciación de pantallas (A4 y A5 se manejan nativos por Wire en I2C)
#ifdef MODO_PANTALLA_LCD
  LiquidCrystal_I2C lcd(0x27, 16, 2);
#endif
#ifdef MODO_PANTALLA_TM1637
  #define CLK_TM1637 8
  #define DIO_TM1637 9
  TM1637Display tmDisplay(CLK_TM1637, DIO_TM1637);
#endif

// Función de lectura MAX6682
#ifdef SENSOR_MAX6682
float leerMAX6682()
  {
  unsigned int datos = 0;
  digitalWrite(MAX6682_CS, LOW);
  delayMicroseconds(1);
  for (int i = 15; i >= 0; i--)
    {
    digitalWrite(MAX6682_SCK, HIGH);
    delayMicroseconds(1);
    if (digitalRead(MAX6682_MISO)) datos |= (1 << i);
    digitalWrite(MAX6682_SCK, LOW);
    delayMicroseconds(1);
    }
  digitalWrite(MAX6682_CS, HIGH);
  if (datos == 0xFFFF || datos == 0) return -999.0;
  return ((datos >> 5) & 0x03FF) * 0.25;
  }
#endif

void setup()
  {
  pinMode(PIN_RELAY, OUTPUT);
  digitalWrite(PIN_RELAY, LOW);
  pinMode(PIN_PWM_BRILLO, OUTPUT);

  #ifdef CONTROL_POR_PULSADORES
    pinMode(PIN_BTN_SET_UP, INPUT_PULLUP);
    pinMode(PIN_BTN_SET_DOWN, INPUT_PULLUP);
    pinMode(PIN_BTN_BRI_UP, INPUT_PULLUP);
    pinMode(PIN_BTN_BRI_DOWN, INPUT_PULLUP);
  #endif

  #ifdef SENSOR_MAX6682
    pinMode(MAX6682_CS, OUTPUT);
    pinMode(MAX6682_SCK, OUTPUT);
    pinMode(MAX6682_MISO, INPUT);
    digitalWrite(MAX6682_CS, HIGH);
    digitalWrite(MAX6682_SCK, LOW);
  #endif

  #ifdef MODO_PANTALLA_LCD
    lcd.init();
    lcd.clear();
  #endif
  #ifdef MODO_PANTALLA_TM1637
    tmDisplay.clear();
  #endif
  }

void loop()
  {
  int anteriorSetpoint = setpointDecimas;

  /////////////////////////////////////////
  // 1_INTERFAZ DE USUARIO
 /////////////////////////////////////////
  #ifdef CONTROL_POR_POTENCIOMETROS
    int lecturaBrillo = analogRead(PIN_POT_BRILLO);
    #ifdef MODO_PANTALLA_LCD
      nivelBrillo = map(lecturaBrillo, 0, 1023, 0, 255);
    #endif
    #ifdef MODO_PANTALLA_TM1637
      nivelBrillo = map(lecturaBrillo, 0, 1023, 0, 7);
    #endif

    int lecturaSet = analogRead(PIN_POT_SETPOINT);
    setpointDecimas = map(lecturaSet, 0, 1023, 150, 450); // 15.0°C a 45.0°C
  #endif

  #ifdef CONTROL_POR_PULSADORES
    if (digitalRead(PIN_BTN_BRI_UP) == LOW)
     {
      #ifdef MODO_PANTALLA_LCD
        nivelBrillo = min(nivelBrillo + 15, 255);
      #endif
      #ifdef MODO_PANTALLA_TM1637
        nivelBrillo = min(nivelBrillo + 1, 7);
      #endif
      delay(150);
     }
    if (digitalRead(PIN_BTN_BRI_DOWN) == LOW)
     {
      #ifdef MODO_PANTALLA_LCD
        nivelBrillo = max(nivelBrillo - 15, 0);
      #endif
      #ifdef MODO_PANTALLA_TM1637
        nivelBrillo = max(nivelBrillo - 1, 0);
      #endif
      delay(150);
     }

    if (digitalRead(PIN_BTN_SET_UP) == LOW)
     {
      setpointDecimas = min(setpointDecimas + 1, 450);
      delay(150);
     }
    if (digitalRead(PIN_BTN_SET_DOWN) == LOW)
     {
      setpointDecimas = max(setpointDecimas - 1, 150);   
      delay(150);
     }
  #endif

  // Detectar si se modifico el setpoint
  if (setpointDecimas != anteriorSetpoint)
   {
    tUltimoCambioSet = millis();
    mostrandoSetpoint = true;
   }

  // aplicar brillo por hardware en D6 (para el LCD se usa el pin PWM)
  #ifdef MODO_PANTALLA_LCD
    analogWrite(PIN_PWM_BRILLO, nivelBrillo);
  #endif
  #ifdef MODO_PANTALLA_TM1637
    tmDisplay.setBrightness(nivelBrillo);
  #endif

  float tempSetpointReal = setpointDecimas / 10.0;

  /////////////////////////////
  // 2_ADQUISICION DEL SENSOR
  ///////////////////////////
  float temperaturaC = 0.0;
  bool errorSensor = false;

  #ifdef SENSOR_NTC_ANALOGICO
    int valorADC = analogRead(pinNTC);
    if (valorADC <= 0 || valorADC >= 1023)
     {
      errorSensor = true;
     }
     else
     {
      float resistenciaNTC = R_AUX * ((1023.0 / (float)valorADC) - 1.0);
      float temperaturaK = resistenciaNTC / R_NOMINAL;     
      temperaturaK = log(temperaturaK);                   
      temperaturaK /= BETA;                               
      temperaturaK += 1.0 / (T_NOMINAL + 273.15);         
      temperaturaK = 1.0 / temperaturaK;                   
      temperaturaC = temperaturaK - 273.15;
     }
  #endif

  #ifdef SENSOR_MAX6682
    temperaturaC = leerMAX6682();
    if (temperaturaC == -999.0) errorSensor = true;
  #endif

  if (errorSensor)
   {
    digitalWrite(PIN_RELAY, LOW);
    #ifdef MODO_PANTALLA_LCD
      lcd.setCursor(0, 0); lcd.print("ERROR SENSOR    ");
      lcd.setCursor(0, 1); lcd.print("SISTEMA PARADO  ");
    #endif
    #ifdef MODO_PANTALLA_TM1637
      uint8_t dataErr[] = { 0x79, 0x50, 0x50, 0x00 };
      tmDisplay.setSegments(dataErr);
    #endif
    delay(500);
    return;
   }

  ////////////////////////////////
  // 3_LÓGICA DE CONTROL DE RELAY
  /////////////////////////////////
  unsigned long tiempoActual = millis();

  if (temperaturaC <= (tempSetpointReal - HISTERESIS))
   {
    // Intenta encender la caldera porque hace frío
    // Evaluamos si ya pasó el tiempo prudencial de protección desde el último apagado
    if (!relayActivo && (tiempoActual - tUltimoApagado >= TIEMPO_MIN_APAGADO || tUltimoApagado == 0))
     {
      relayActivo = true;
     }
   }
  else if (temperaturaC >= (tempSetpointReal + HISTERESIS))
   {
    // Apaga la caldera porque ya llegó a la temperatura objetivo
    if (relayActivo)
     {
      relayActivo = false;
      tUltimoApagado = tiempoActual; // Guardamos la hora exacta del apagado
     }
   }
 
  digitalWrite(PIN_RELAY, relayActivo ? HIGH : LOW);

  ///////////////////////////
  // 4. CONTROL DE PANTALLAS
  ///////////////////////////
  #ifdef MODO_PANTALLA_LCD
    // linea 1: temperatura actual y estado del relay
    lcd.setCursor(0, 0);
    lcd.print("TEMP: "); lcd.print(temperaturaC, 1); lcd.write(0xDF); lcd.print("C  ");
    lcd.setCursor(12, 0);
    lcd.print(relayActivo ? "[ON]" : "[OFF]");

    // Línea 2: temperatura seteada
    lcd.setCursor(0, 1);
    lcd.print("SET:  "); lcd.print(tempSetpointReal, 1); lcd.write(0xDF); lcd.print("C  ");
  #endif

  #ifdef MODO_PANTALLA_TM1637
    // Evaluar la ventana de tiempo de 2 segundos (2000 ms) tras tocar el setpoint
    if (mostrandoSetpoint && (tiempoActual - tUltimoCambioSet < 2000))
     {
      // Controlar el ritmo del titileo (cada 200 ms vacía/muestra)
      if (tiempoActual - tUltimoTitileo > 200)
       {
        alternarTitileo = !alternarTitileo;
        tUltimoTitileo = tiempoActual;
       }
      
      if (alternarTitileo)
       {
        tmDisplay.clear();
       }
       else
       {
        tmDisplay.showNumberDec((int)tempSetpointReal, false);
       }
     }
     else
     {
      // Pasaron los 2 segundos o no se tocó nada: vuelve a temperatura actual fija
      mostrandoSetpoint = false;
      tmDisplay.showNumberDec((int)temperaturaC, false);
     }
  #endif
  delay(20);
}
 
Atrás
Arriba