max 6675 releA releB con la ajuda de ignorante absoluto esta SOLUCIONADO

Funciona si la temperatura es mayor a 38° como hacer que se inicie si la temperatura es menor a 38° gracias

#include "max6675.h"

const byte thermoDO  = 7;
const byte thermoCS  = 6;
const byte thermoCLK = 5;

MAX6675 thermocouple(thermoCLK, thermoCS, thermoDO);

const byte vccPin    = 4;
const byte gndPin    = 3;
const byte relePinA   = 10;
const byte relePinB   = 9;
unsigned long start, presento, leoTemprelePinA;
unsigned long debounce;  // agrege esta variable o centencia para que no se apagara al inicio al aplicarla en loop no me copila el codigo tal vez la estoy aplicando en el lugar equibocado
bool flag = false;
float temprelePinA; 
float temprelePinB;

void setup() {
  
  Serial.begin(9600);
  pinMode(vccPin, OUTPUT); 
  digitalWrite(vccPin, HIGH);
  pinMode(gndPin, OUTPUT); 
  digitalWrite(gndPin, LOW);
  pinMode(relePinA, OUTPUT);
  pinMode(relePinB, OUTPUT);    
  Serial.println("flama 4");

  delay(600);
  digitalWrite(relePinB, LOW);
}

void loop() {
  

  if (millis() - leoTemprelePinA > 500UL) {  
      temprelePinA = thermocouple.readCelsius();
      leoTemprelePinA = millis();
  }      

  if (millis() - presento > 500UL) {  
      Serial.print("C = " + String(temprelePinA)); 
      Serial.println();
      presento = millis();   //inicia enciende la flama relePinA
  }
           
  if ( temprelePinA > 70.00) {  if (millis() - start > 500UL){
        if (flag) {
            digitalWrite(relePinA, HIGH);  // apaga la flama al alcanzar los 70° grados c
            flag = false;
            start = millis();
        }
       if (millis() - start > 500UL) {
           
        }
   }
     flag = true;
      
                   
  void releB();    //void de releB (ventilador) debe apagar ventilador al regresar la temperatura a los 38°
              
       if (millis() - leoTemprelePinA > 500UL) {  
      temprelePinA = thermocouple.readCelsius();  //lee la temperatura 
      leoTemprelePinA = millis();
  }      
     if (millis() - leoTemprelePinA >500UL) { //lee cada 500 millis segundos 
    // flag = false;
    //  start = millis(); // si activo esta centencia nunca apaga el ventilador relePinB no se si exista una centencia contraria a start 
     }
      if (millis() - start > 500UL){ // espera para apagar el releB// si aumento estos millis para dar tiempo a que la temperatura supere los 38° ya no funciona 
      if ( temprelePinA < 38.00){     // apaga el releB al regresar la temperatura a 38° // pero se apaga al inicio si es menor a 38° 
         if (flag){                       
          digitalWrite(relePinB,  HIGH);// al restablecer apaga al inicio si es menos a 38°
         } 
     // else // si agreo este else ya no apaga nunca y es logico
      {
       //  digitalWrite(relePinB,  LOW); // esto no funciona aqui 
         flag = true; 
      }
      }    // segun e visto estos corchetes se deben cerrar en su lugar despues de cada centencia no se si esto tenga algo que ver 
      }   // toda via falta mucho por aprender 
  }
}

re editando codigo max 6675

A ver como funciona esto:

#include "max6675.h"

const byte thermoDO  = 12;
const byte thermoCS  = 11;
const byte thermoCLK = 10;

MAX6675 thermocouple(thermoCLK, thermoCS, thermoDO);
const byte vccPin    = 9;
const byte gndPin    = 8;
const byte relePin   = 7;
unsigned long start, presento;
bool flag = false;

void setup() {
  
  Serial.begin(9600);
  pinMode(vccPin, OUTPUT); 
  digitalWrite(vccPin, HIGH);
  pinMode(gndPin, OUTPUT); 
  digitalWrite(gndPin, LOW);
  pinMode(relePin, OUTPUT);
      
  Serial.println("quemador 4");
  delay(600);
}

void loop() {
  
  if (millis() - presento > 3000UL) {  // cada 3 segundos muestro la temp sin usar delay(3000)
      Serial.print("C = "); 
      Serial.println(thermocouple.readCelsius());
      presento = millis();
  }
    
   if ( thermocouple.readCelsius() > 68.00) {
        if (flag) {
            digitalWrite(relePin, HIGH);
            flag = false;
            start = millis();
        }
        if (millis() - start > 5000UL) {
            digitalWrite(relePin, LOW);
            flag = false;
        }
   }
   else 
      flag = true;  // como la temperatura es inferior a 68 preparo el flag
                    // para que permita el accionamiento en cuanto supere los
                    // 68 grados.
}

esta muy moderno el codigo con millis const byte etcétera te lo agradezco para mi desgracia no funciono se queda congelada la temperatura en realidad el codigo funciona bien apaga el quemador a los 68.25° grados apaga el rele en el pin 7 no y se activa el rele despues de reiniciar el arduino no quiero que se restablezca solo reconozco mi culpabilidad por ser muy malo para explicarme pero analizando tu respuesta veo que no fui claro mi discurso y creo que con la siguiente explicación espero y sea visible mi necesidad
modifique el codigo donde agrege el pinMode(6,OUTPUT); que sera el rele que apague la maquina despues de 5 minutos enfriando el producto te doy las gracias por hace me ver que los delay ya son historia los millis son el futuro de los programas complejos espero y poder reparar el codigo para que no se congele la lectura de la temperatura
saludo desde queretato mx

#include "max6675.h"

  int thermoDO = 12;
  int thermoCS = 11;
  int thermoCLK = 10;

MAX6675 thermocouple(thermoCLK, thermoCS, thermoDO);
  int vccPin = 9;
  int gndPin = 8;
 
void setup() {
  Serial.begin(9600);

  pinMode(vccPin, OUTPUT); digitalWrite(vccPin, HIGH);
  pinMode(gndPin, OUTPUT); digitalWrite(gndPin, LOW);
  pinMode(7, OUTPUT);
  pinMode(6, OUTPUT);  
      
  Serial.println("secadora   4");
  delay(600);
}

void loop() {
  digitalWrite(6, LOW);
   Serial.print("C = "); 
   Serial.println(thermocouple.readCelsius());
    
   if(thermocouple.readCelsius() > 68.00){
   digitalWrite(7, HIGH);
  }
   delay(3000);  
  }  

  //pasados 5 minutos desde que digitalWrite(7, HIGH); activar rele pinMode(6, HIGH);
  // else 
  //esperar hasta nuevo restablecimiento para iniciar el ciclo

Porque dices que el programa no funciona si lo he probado con un DHT22 y si lo hace?
Activa el rele cuando superas 68 y lo detenie luego de 5 segundos

Ahhh eran 5 minutos!!

Pues hombre, en lugar de copiar y no mirar lo que he puesto, simplemente cambias 5000 que son 5 x 1000 mseg y lo reemplazas por 5 x 60 x 1000 = 300000 mseg equivalente a 5 minutos y listo.

Eso no es que no funcione, es un error porque yo no estoy metido en tu problema y confundí 5 segundos con 5 minutos.

no lo e provado con DHT con MAX 6675 no funciona en el monitor serie solo aparece 71.50° la enfrie o caliente sigue en 71.50 no puedo subir una foto del sensor MAX 6675 son muy diferentes una esta basada en termopar tipo K y la otra en LM35 no son compatibles una proporciona de 11 mili voltios a 120 mili voltios y DHT de 0 a 225 lo que es igual 0 3.3 volts
Saludos

A ver.. no importa si uso el DHT o el MAX6675 con ambos debe funcionar porque la rutina es simple y por rutina solo hablo de la parte donde se compara. Claro que una cosa es leer tu termocupla y otra un DHT.

Yo probe la parte donde acciona el rele con algo que tengo solo para verificar el funcionamiento que entendí que dijiste que no funcionaba.
La rutina está con los 5 segundos (que mal puse y te explique que cambies) lo hizo bien.

Ahora me vas a decir que esto

if (millis() - presento > 3000UL) {  // cada 3 segundos muestro la temp sin usar delay(3000)
      Serial.print("C = "); 
      Serial.println(thermocouple.readCelsius());
      presento = millis();
  }

no es lo mismo que esto

 Serial.print("C = "); 
   Serial.println(thermocouple.readCelsius());
   
   if(thermocouple.readCelsius() > 68.00){
   digitalWrite(7, HIGH);
  }
   delay(3000);

Todo tu código se detiene x 3 segundos siempre debido a delay(3000)

El mio al usar millis() chequea todo el tiempo y presenta cada 3 segundos.

EDITO : perdona, he editado varias veces y te pido que leas esto al final.
Tu titulo dice Agregar rele.. no tiene nada que ver con el sensor. Yo he hecho como que leo tu sensor sin tenerlo.. pero me he fijado en el funcionamiento del rele. Espero se entienda.

Este es el código mas rapido cada 500 mseg

#include "max6675.h"

const byte thermoDO  = 12;
const byte thermoCS  = 11;
const byte thermoCLK = 10;

MAX6675 thermocouple(thermoCLK, thermoCS, thermoDO);

const byte vccPin    = 9;
const byte gndPin    = 8;
const byte relePin   = 7;
unsigned long start, presento, leoTemp;
bool flag = false;
float temp; 

void setup() {
  
  Serial.begin(9600);
  pinMode(vccPin, OUTPUT); 
  digitalWrite(vccPin, HIGH);
  pinMode(gndPin, OUTPUT); 
  digitalWrite(gndPin, LOW);
  pinMode(relePin, OUTPUT);
      
  Serial.println("quemador 4");
  delay(600);
}

void loop() {
  
  
  if (millis() - leoTemp > 500UL) {  // cada 3 segundos muestro la temp sin usar delay(3000)
      temp = thermocouple.readCelsius();
      leoTemp = millis();
  }      

  if (millis() - presento > 1000UL) {  // cada 3 segundos muestro la temp sin usar delay(3000)
      Serial.print("C = " + String(temp)); 
      presento = millis();
  }

  if ( temp > 68.00) {
        if (flag) {
            digitalWrite(relePin, HIGH);
            flag = false;
            start = millis();
        }
        if (millis() - start > 5000UL) {
            digitalWrite(relePin, LOW);
            flag = false;
        }
   }
   else 
      flag = true;  // como la temperatura es inferior a 68 preparo el flag
                    // para que permita el accionamiento en cuanto supere los
                    // 68 grados.
}

No se que son VccPin y GNDPin, si estas alimentando el MAX6675 con los pines del arduino eso funciona porque tienes suerte.

que bien funciona este codigo solo le agregue Serialprintln(); para que de la lectura en una linea nueva me costo algo conseguir hielo a estas horas para probar la precisión y tal y como lo pensaba los millis hacen mas exactas las lecturas ahora el marguen de error es de 0.25° lo mismo a cero grados que ha 100° y con los delay el marguen de error 1.75° cero grados y 3° de error a los 100°. E estado estudiando los millis pero toda via no consigo entender casi nada esta semana tomare un curso sobre el tema ahora quisiera que me ayuden a agregar un segundo rele que des active un motor monofasico 5 minutos despues de apagar quemadores voy a agregar el hardware al codigo y si lo logro regreso a agradecer y cerrar el hilo y sino lo consigo regreso a ver si es posible que me ayuden.
le estoy muy agradecido por su ayuda y enseñanza sobre los millis.

O si usted me lo aconseja cierro este hilo (solucionado) e inicio uno nuevo para agregar el segundo rele
saludos

Sigue aqué.

Quieres entender millis() solo ve a Documentación => indice de temas tutoriales => millis()

ya funciona si la temperatura es mayor a 38° grados sube la temperatura a 70° apaga el rele A y cuando la temperatura desciende al 38° apaga el releB pero si al inicio la temperatura es menor a 38° ya se cumple la sentencia solo apaga el rele A a 70° pero al regresar la temperatura a 38° no se apaga el rele B
gracias

#include "max6675.h"

const byte thermoDO  = 7;
const byte thermoCS  = 6;
const byte thermoCLK = 5;

MAX6675 thermocouple(thermoCLK, thermoCS, thermoDO);

const byte vccPin    = 4;
const byte gndPin    = 3;
const byte relePinA   = 10;
const byte relePinB   = 9;
unsigned long start, presento, leoTemprelePinA;
unsigned long debounce;  // agrege esta variable o centencia para que no se apagara al inicio al aplicarla en loop no me copila el codigo tal vez la estoy aplicando en el lugar equibocado
bool flag = false;
float temprelePinA; 
float temprelePinB;

void setup() {
  
  Serial.begin(9600);
  pinMode(vccPin, OUTPUT); 
  digitalWrite(vccPin, HIGH);
  pinMode(gndPin, OUTPUT); 
  digitalWrite(gndPin, LOW);
  pinMode(relePinA, OUTPUT);
  pinMode(relePinB, OUTPUT);    
  Serial.println("flama 4");

  delay(600);
  digitalWrite(relePinB, LOW);
}

void loop() {
  

  if (millis() - leoTemprelePinA > 500UL) {  
      temprelePinA = thermocouple.readCelsius();
      leoTemprelePinA = millis();
  }      

  if (millis() - presento > 500UL) {  
      Serial.print("C = " + String(temprelePinA)); 
      Serial.println();
      presento = millis();   //inicia enciende la flama relePinA
  }
           
  if ( temprelePinA > 70.00) {  if (millis() - start > 500UL){
        if (flag) {
            digitalWrite(relePinA, HIGH);  // apaga la flama al alcanzar los 70° grados c
            flag = false;
            start = millis();
        }
       if (millis() - start > 500UL) {
           
        }
   }
     flag = true;
      
                   
  void releB();    //void de releB (ventilador) debe apagar ventilador al regresar la temperatura a los 38°
              
       if (millis() - leoTemprelePinA > 500UL) {  
      temprelePinA = thermocouple.readCelsius();  //lee la temperatura 
      leoTemprelePinA = millis();
  }      
     if (millis() - leoTemprelePinA >500UL) { //lee cada 500 millis segundos 
    // flag = false;
    //  start = millis(); // si activo esta centencia nunca apaga el ventilador relePinB no se si exista una centencia contraria a start 
     }
      if (millis() - start > 500UL){ // espera para apagar el releB// si aumento estos millis para dar tiempo a que la temperatura supere los 38° ya no funciona 
      if ( temprelePinA < 38.00){     // apaga el releB al regresar la temperatura a 38° // pero se apaga al inicio si es menor a 38° 
         if (flag){                       
          digitalWrite(relePinB,  HIGH);// al restablecer apaga al inicio si es menos a 38°
         } 
     // else // si agreo este else ya no apaga nunca y es logico
      {
       //  digitalWrite(relePinB,  LOW); // esto no funciona aqui 
         flag = true; 
      }
      }    // segun e visto estos corchetes se deben cerrar en su lugar despues de cada centencia no se si esto tenga algo que ver 
      }   // toda via falta mucho por aprender 
  }
}

re editado surbyte sera correcto de esta forma la re edición
gracias

a raíz de de la sugerencia de abandonar la alimentación por pines 8 (gnd) 9 (5vcc) cheque el consumo del modulo max 6675 y si que es realmente bajo 1.6 miliamperios

Edita por favor todo lo que acabo de ver!!!
Y deja de repetir lo que te dicen y para peor lo que tu mismo has escrito.

surbyte:
Edita por favor todo lo que acabo de ver!!!
Y deja de repetir lo que te dicen y para peor lo que tu mismo has escrito.

ya lo edite que mas tengo que hacer con el codigo

foto de max 6675 con rele de dos canales con falla en el encendido del segundo canal
gracias por su ayuda

aqui no me da la opción subir cambios echos al codigo o imagenes afines

feliperuiz:
aqui no me da la opción subir cambios echos al codigo o imagenes afines

como se usa el codigo del tablon desde a qui usar respuesta rápida es igual que quote?
a mi me parece que es lo mismo pero ya tengo mis dudas si se esta repitiendo todo otra vez si no pruebo no me entero

se supone que arduino funciona en secuencia y el rele B se apaga al inico del codigo y se debe apagar despues de cumplir la sentencia del rele A sera que tengo que regresar a los delay (); para que respete la secuencia del apagar primero el rele A y despues el rele B

#include "max6675.h"

const byte thermoDO  = 7;
const byte thermoCS  = 6;
const byte thermoCLK = 5;

MAX6675 thermocouple(thermoCLK, thermoCS, thermoDO);

const byte vccPin    = 4;
const byte gndPin    = 3;
const byte relePinA   = 10;
const byte relePinB   = 9;
unsigned long start, presento, leoTemp;
unsigned long debounce;  
bool flag = false;
float temp; 


void setup() {
  
  Serial.begin(9600);
  pinMode(vccPin, OUTPUT); 
  digitalWrite(vccPin, HIGH);
  pinMode(gndPin, OUTPUT); 
  digitalWrite(gndPin, LOW);
  pinMode(relePinA, OUTPUT);
  pinMode(relePinB, OUTPUT);    
  Serial.println("flama 4");

  delay(600);
  digitalWrite(relePinB, LOW);
}

void loop() {
  

  if (millis() - leoTemp > 500UL) {  
      temp = thermocouple.readCelsius();
      leoTemp = millis();
  }      

  if (millis() - presento > 500UL) {  
      Serial.print("C = " + String(temp)); 
      Serial.println();
      presento = millis();   
  }
           
  if ( temp > 70.00) {  if (millis() - start > 500UL){
        if (flag) {
            digitalWrite(relePinA, HIGH);  
            flag = true;
           // start = millis();
        }
      // if (millis() - start > 500UL) {
           
        }
   }
                     
  void releB();   
              
       if (millis() - leoTemp > 500UL) {  
      temp = thermocouple.readCelsius();   
      leoTemp = millis();
  }      
     if (millis() - leoTemp >500UL) {  
     flag = true;
      start = millis();  
     }
      if (millis() + start > 2500UL){   
       // delay(15000);                                    
      }
      if ( temp > 38.00) {  if (millis() - start > 500UL){   
         if (flag){                       
          digitalWrite(relePinB,  HIGH);
         } 
    
      {
        
         flag = true; 
      }
      }
      }
}

No has de volver a los delay(). Lo que has de hacer es utilizar "máquinas de estado". En índice de tutoriales puedes encontrar un par de enlaces que hablan de las máquinas de estado.

Una máquina de estados es básicamente una variable que nos ayuda a saber en qué paso estamos y un conjunto de condicionales que van variando su valor según transcurre el tiempo o se da una serie de circunstancias. Para controlar el paso del tiempo y "las circunstancias" nos valdremos, si es necesario, de otras variables.

No tengo claro qué es lo que quieres hacer. Pero si por ejemplo: quieres que según unas condiciones se active un relé A, se apage el relé A, se encienda el relé B y se apague el relé B, eso son, como mínimo, cuatro "estados", tal vez más, de una máquina de estados. Deberías de tener una variable que te indicara en qué estado se encuentra, y cuando se den las condiciones de cambiar de estado, enciendes o apagas los relés que quieras y cambias el valor de la variable para saber que está en un nevo estado.

El loop() ha de estar contínuamente ejecutándose rápidamente, sin delay(), verificando en qué estado están las máquinas de estado y si se dan las condiciones para cambiar de estado. Ppuedes tener varias máquinas de estado, cada una controlando cosas distintas, aunque estén relacionadas entre sí.

Por ejemplo: la variable flag que tienes en el programa se podría considerar una máquina de estados con dos estados posibles. Pero tal vez esa variable venía bien que sólo tuviera dos estados posibles cuando sólo había un relé (relé A apagado, relé A encendido). Pero ahora quieres controlar dos relés. Tal vez esa variable debería de tener más de dos valores posibles o tal vez necesites otra variables (máquina de estado) para controlar el relé B.

se que me va a costar un regaño reconozco que no se que es un hipervinculo una etiqueta tablon pero quiero compartirle el susodicho codigo max 6675 releA releB ya funciona a un que no comprendo como esta echo un asco hasta hora creo que no me e explicado con claridad cual es su función no se si un simulador lo pueda leer o un humano si yo mismo que tengo tres meses trabajando en el no entiendo ni la mitad de los renglones si edito o repito mal me puede decir lo que quiera con una condición que también haga un comentario sobre el codigo del cual usted también es participe
saludos
si funciona el codigo a un que usted no lo crea
Aqui en respuesta rapida no hay donde pegar el codigo solo como texto plano si voy a edición rapida parece que se repite y no quiero seguir rompiendo las normas del foro se lo envio por privado

Hola feliperuiz, me gustaría ayudarte, pero no tengo muy claro aún cómo quieres que se comporten los dos relés.

Creo entender que el relé A sirve para calentar algo, por lo que supongo que se ha de encender de alguna manera ¿Pulsando un botón tal vez o simplemente nada más encender el Arduino este enciende el relé A? Y que una vez se alcance los 70 grados ha de apagar el relé A.

Mientras que el relé B ha de empezar estando apagado y sólo se ha de encender una vez que se alcancen los 70 grados y se apague el relé A. El relé B ha de permanecer encendido hasta que la temperatura baje a los 38 grados.

Pero parece ser que hay que esperar cinco minutos... ¿para qué hay que esperar cinco minutos?

Esto es lo que he entendido, pero tengo la impresión de que estoy equivocado. Así que si me aclaras las siguientes dudas y puedes aportar más información, tal vez te pueda ayudar.

¿Los relés se activan poniendo la salida del Arduino a nivel alto (HIGH) o a nivel bajo (LOW)?

¿Inicialmente cómo han de estar cada relé? ¿Apagados o encendidos?

¿Qué condiciones se han de dar, o haber dado, para que se encienda cada uno de los relés?

¿Qué condiciones se han de dar, o hacer dado, para que se apague cada uno de los relés?

¿Qué es lo que está conectado a cada relé? (Es para hacerme una mejor idea de lo que quieres).

Imagina que yo no tengo ni idea de nada, y que me pides que apague y encienda a mano los relé A y B. Y que para hacerlo dispongo de un termómetro que me dice la temperatura y un reloj por si necesito esperar un tiempo determinado para encender o apagar los relé. Explícame ahora cuándo quieres que te encienda y apague cada relé, de tal forma que te puedas ir y dejarme solo con ellos, con la tranquilidad de que con la explicación que me das yo, que soy algo torpe, lo haré bien. Porque sinceramente, si no tengo claro lo que hay que hacer: no creo que te pueda ayudar. Y me gustaría ayudarte.

Si ha de funcionar tal como creo: al final la cosa parece ser más fácil de lo que creía. Incluso se podría haber hecho con delay() (más de uno me llamará hereje por lo que acabo de decir :D).

Por lo que creo entender, nada más arrancar el Arduino los dos relés han de ponerse en funcionamiento y esto se supone que es para calentar algo. Cada medio segundo se toma una muestra de temperatura y se enseña por el puerto serie. Si mientras se está calentando se superan los 70 grados, se ha de apagar el relé A y continuar encendido el relé B. En ese momento se deja de calentar y se pasa a enfriar. Si no está calentando es que está enfriando, es entonces cuando el relé B ha de apagarse si la temperatura baja de los 38 grados.

Una vez apagados los dos relés, no se volverán a encender hasta que se reinicie el Arduino (pulsar el botón de reset o apagar y encender).

Si esto es lo que se busca, mi propuesta de código es esta:

#include "max6675.h"

const byte thermoDO  = 7;
const byte thermoCS  = 6;
const byte thermoCLK = 5;

MAX6675 thermocouple(thermoCLK, thermoCS, thermoDO);

const byte vccPin    = 4;
const byte gndPin    = 3;
const byte relePinA   = 10;
const byte relePinB   = 9;
float temprelePinA;
float temprelePinB;

unsigned long instanteAnterior;
bool enfriando = false;

void setup() {
  Serial.begin(9600);
  pinMode(vccPin, OUTPUT);
  digitalWrite(vccPin, HIGH);
  pinMode(gndPin, OUTPUT);
  digitalWrite(gndPin, LOW);
  pinMode(relePinA, OUTPUT);
  pinMode(relePinB, OUTPUT);   
  Serial.println("flama 4");

  delay(600);
  digitalWrite(relePinB, LOW);
}

void loop() {
  if (millis() - instanteAnterior > 500UL) {    // Cada 500 milisegundos toma la temperatura, la muestra y verifica si ha de hacer algo.
    instanteAnterior = millis();                // Para saber cuánto tiempo ha transcurrido desde la "vez anterior"
    temprelePinA = thermocouple.readCelsius();  // lee la temperatura

    Serial.print("C = " + String(temprelePinA));
    Serial.println();

    if (temprelePinA > 70.00) {         // Verifica si se superan los 70 grados
      digitalWrite(relePinA, HIGH);     // Apaga la flama al superar los 70° grados C
      enfriando = true;                 // Ya no está calentando
    }
    if (enfriando) {                    // Si está enfriando
      if ( temprelePinA < 38.00) {      // Verifica si ha bajado de 38 grados
        digitalWrite(relePinB,  HIGH);  // Apaga el relé B al alcanzar los 38° (una vez apagado no importa que se apague una y otra vez)
      }
    }
  }
}

La "máquina de estado" es la variable enfriando y de tipo boolean ya que sólo basta con controlar dos estados: al comenzar está calentando, por lo que no está enfriando. Una vez superado los 70 grados pasa a estar enfriando. El relé B sólo se ha de apagar si está enfriando y la temperatura baja de los 38 grados.

El control del relé A no hace falta hacerlo depender de si está enfriando o no, ya que sólo puede alcanzar esa temperatura si está encendido y entonces se ha de apagar, sí o sí.

No lo he podido probar porque no dispongo de sonda de temperaturahttps://forum.arduino.cc/index.php?topic=630591.0. Así que no descarto que exista algún fallo.