Control de cocción a baja temperatura

Intento hacer un circulador para “sous vide”, para lo cual necesito mantener el agua a cierto rango de temperatura durante varias horas, en mi caso los rangos de temperatura serán 3 diferentes: 45°c, 55°c, 65°c los cuales se seleccionaran a través de un boton pulsador para cada caso y los datos se mostraran por medio de una Oled, y los parametros de temperatura se alcanzan con una resistencia para calentar el agua la cual se enciende y apaga por medio de condicionales if.

Pero a la hora de correr el programa en mi arduino uno de los leds y el pin de la resistencia se quedan encendido siempre aun sin seleccionar nada, y la temperatura no me la marca en la Oled.
Supongo que mi problema esta en las condicionales de seleccion de temperatura

#include <Adafruit_GFX.h>
#include <Adafruit_GrayOLED.h>
#include <Adafruit_SPITFT.h>
#include <Adafruit_SPITFT_Macros.h>
#include <gfxfont.h>
#include <Adafruit_SSD1306.h>
#include <splash.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h>    
 
OneWire  ds(10);  
 
#define ANCHO 128              //Parametros pantalla Oled32x128
#define ALTO 32       
#define OLED_RESET 4    
Adafruit_SSD1306 oled(ANCHO, ALTO, &Wire, OLED_RESET);  

int HEAT = 11;            //resistencia para calentar agua
      //leds indicadores de seleccion de temperatura
int led45 = 4;           //led para 45°C
int led55 = 5;           //led para 55°C
int led65 = 6;           //led para 65°C
      //botones para seleccionar temperatura
int input45 = 1;         //boton para 45°C
int input55 = 2;         //boton para 55°C
int input65 = 3;         //boton para 65°C

void setup() {
  
  Wire.begin();                             //inicio del sensor de temp ds18b20
  oled.begin(SSD1306_SWITCHCAPVCC, 0x3C);   //inico display oled
   Serial.begin(9600);

   pinMode(HEAT,OUTPUT);        //resistencia de calor declarada como salida
  
pinMode(led45, OUTPUT);         //declarar leds indicadores de temp como salidas
pinMode(led55, OUTPUT);
pinMode(led65, OUTPUT);

pinMode(input45, INPUT);        //declarar botones seleccionadores de temp como entradas
pinMode(input55, INPUT);
pinMode(input65, INPUT);
}



 
void loop() {
   byte i;                    //variables para sensor de temp
  byte present = 0;
  byte type_s;
  byte data[12];
  byte addr[8];
  float celsius;

  int16_t raw = (data[1] << 8) | data[0];             //deteccion de temperatura por el sensor
  if (type_s) {
    raw = raw << 3; 
    if (data[7] == 0x10) {
      
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  } else {
    byte cfg = (data[4] & 0x60);
    if (cfg == 0x00) raw = raw & ~7;  
    else if (cfg == 0x20) raw = raw & ~3; 
    else if (cfg == 0x40) raw = raw & ~1; 
    
  }
  
  oled.clearDisplay();           //inicio de la impresion de datos en la pantalla
  oled.setTextColor(WHITE);  
  oled.setCursor(35, 0);     
  oled.setTextSize(1);      
  oled.print("-Sous Vide-");       //titulo del proyecto
  oled.setCursor (10, 15);    
  oled.setTextSize(2);     
  int tiempo = (millis() * 2.778 * pow(10, -7));     //cronometro del tiempo desde que se enciende la maquina (siempre encendido) mostrado en horas (conversion millis-horas)
  oled.print(tiempo);
  oled.setTextSize(1);
  oled.print(" hrs.");      
  oled.setCursor (10, 64);    
  oled.setTextSize(2); 
  celsius = (float)raw / 16.0;                     //mostrar temperatura del agua en pantalla
  oled.print(celsius);
  oled.setTextSize(1);
  oled.print(" °C");
         oled.display();     

                //comienzo de condicionales para estabilizar temperatura del agua al rango seleccionado por medio de la resistencia         
     if (digitalRead(input45) == HIGH) {
digitalWrite(led45, HIGH);                                  //si se selecciona el boton de 45°c entonces enciende el led45 
    if (celsius<41 || celsius>48){                          // y la resistencia cuando la temperatura baje de 41°c y cuando pase de 48°c paga resistencia
    digitalWrite(HEAT, HIGH);
    }
    }

if (digitalRead(input55) == HIGH) {
digitalWrite(led55, HIGH);                                  //si se selecciona el boton de 55°c entonces enciende el led55
    if (celsius<51 || celsius>58){                          // y la resistencia cuando la temperatura baje de 51°c y cuando pase de 58°c paga resistencia
    digitalWrite(HEAT, HIGH);
    }
    }

if (digitalRead(input65) == HIGH) {
digitalWrite(led65, HIGH);                                   //si se selecciona el boton de 65°c entonces enciende el led65
    if (celsius<61 || celsius>68){                          // y la resistencia cuando la temperatura baje de 61°c y cuando pase de 68°c paga resistencia
    digitalWrite(HEAT, HIGH);
    }
}
}

Prueba de este modo

#include <Adafruit_GFX.h>
#include <Adafruit_GrayOLED.h>
#include <Adafruit_SPITFT.h>
#include <Adafruit_SPITFT_Macros.h>
#include <gfxfont.h>
#include <Adafruit_SSD1306.h>
#include <splash.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h>   
 
OneWire  ds(10); 
 
#define ANCHO 		128              //Parametros pantalla Oled32x128
#define ALTO 		32       
#define OLED_RESET 	4   
Adafruit_SSD1306 oled(ANCHO, ALTO, &Wire, OLED_RESET); 

int HEAT = 11;            //resistencia para calentar agua
      //leds indicadores de seleccion de temperatura
int led45 	= 4;           //led para 45°C
int led55 	= 5;           //led para 55°C
int led65 	= 6;           //led para 65°C
      //botones para seleccionar temperatura
const byte input45 = 1;         //boton para 45°C
const byte input55 = 2;         //boton para 55°C
const byte input65 = 3;         //boton para 65°C
bool estado45, estado45Ant = false;
bool estado55, estado45Ant = false;
bool estado65, estado45Ant = false;


void setup() {
	Wire.begin();                             //inicio del sensor de temp ds18b20
	oled.begin(SSD1306_SWITCHCAPVCC, 0x3C);   //inico display oled
	Serial.begin(9600);

	pinMode(HEAT,OUTPUT);        //resistencia de calor declarada como salida

	pinMode(led45, OUTPUT);         //declarar leds indicadores de temp como salidas
	pinMode(led55, OUTPUT);
	pinMode(led65, OUTPUT);

	pinMode(input45, INPUT);        //declarar botones seleccionadores de temp como entradas
	pinMode(input55, INPUT);
	pinMode(input65, INPUT);
}
 
void loop() {
	byte i;                    //variables para sensor de temp
	byte present = 0;
	byte type_s;
	byte data[12];
	byte addr[8];
	float celsius;

	int16_t raw = (data[1] << 8) | data[0];             //deteccion de temperatura por el sensor
	if (type_s) {
		raw = raw << 3;
		if (data[7] == 0x10) {
			raw = (raw & 0xFFF0) + 12 - data[6];
		}
	} else {
	byte cfg = (data[4] & 0x60);
	if (cfg == 0x00) raw = raw & ~7; 
	else if (cfg == 0x20) raw = raw & ~3;
	else if (cfg == 0x40) raw = raw & ~1;

	}

	oled.clearDisplay();           //inicio de la impresion de datos en la pantalla
	oled.setTextColor(WHITE); 
	oled.setCursor(35, 0);     
	oled.setTextSize(1);     
	oled.print("-Sous Vide-");       //titulo del proyecto
	oled.setCursor (10, 15);   
	oled.setTextSize(2);     
	int tiempo = (millis() * 2.778 * pow(10, -7));     //cronometro del tiempo desde que se enciende la maquina (siempre encendido) mostrado en horas (conversion millis-horas)
	oled.print(tiempo);
	oled.setTextSize(1);
	oled.print(" hrs.");     
	oled.setCursor (10, 64);   
	oled.setTextSize(2);
	celsius = (float)raw / 16.0;                     //mostrar temperatura del agua en pantalla
	oled.print(celsius);
	oled.setTextSize(1);
	oled.print(" °C");
	oled.display();     

	//comienzo de condicionales para estabilizar temperatura del agua al rango seleccionado por medio de la resistencia
	estado45 = digitalRead(input45);
	if (estado45 && !estado45Ant) {
		digitalWrite(led45, HIGH);                                  //si se selecciona el boton de 45°c entonces enciende el led45
		if (celsius<41 || celsius>48){                          // y la resistencia cuando la temperatura baje de 41°c y cuando pase de 48°c paga resistencia
			digitalWrite(HEAT, HIGH);
		}
	}
	estado45Ant = estado45;
	
	estado55 = digitalRead(input55);
	if (estado55 && !estado55Ant) {
		digitalWrite(led55, HIGH);                                  //si se selecciona el boton de 55°c entonces enciende el led55
		if (celsius<51 || celsius>58){                          // y la resistencia cuando la temperatura baje de 51°c y cuando pase de 58°c paga resistencia
			digitalWrite(HEAT, HIGH);
		}
	}
	estado55Ant = estado55;
	
	estado65 = digitalRead(input65);
	if (estado65 && !estado65Ant) {
		digitalWrite(led65, HIGH);                                   //si se selecciona el boton de 65°c entonces enciende el led65
		if (celsius<61 || celsius>68){                          // y la resistencia cuando la temperatura baje de 61°c y cuando pase de 68°c paga resistencia
			digitalWrite(HEAT, HIGH);
		}
	}
	estado65Ant = estado65;
}

surbyte:
Prueba de este modo

#include <Adafruit_GFX.h>

#include <Adafruit_GrayOLED.h>
#include <Adafruit_SPITFT.h>
#include <Adafruit_SPITFT_Macros.h>
#include <gfxfont.h>
#include <Adafruit_SSD1306.h>
#include <splash.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h>

OneWire  ds(10);

#define ANCHO 128              //Parametros pantalla Oled32x128
#define ALTO 32      
#define OLED_RESET 4  
Adafruit_SSD1306 oled(ANCHO, ALTO, &Wire, OLED_RESET);

int HEAT = 11;            //resistencia para calentar agua
     //leds indicadores de seleccion de temperatura
int led45 = 4;           //led para 45°C
int led55 = 5;           //led para 55°C
int led65 = 6;           //led para 65°C
     //botones para seleccionar temperatura
const byte input45 = 1;         //boton para 45°C
const byte input55 = 2;         //boton para 55°C
const byte input65 = 3;         //boton para 65°C
bool estado45, estado45Ant = false;
bool estado55, estado45Ant = false;
bool estado65, estado45Ant = false;

void setup() {
Wire.begin();                             //inicio del sensor de temp ds18b20
oled.begin(SSD1306_SWITCHCAPVCC, 0x3C);   //inico display oled
Serial.begin(9600);

pinMode(HEAT,OUTPUT);        //resistencia de calor declarada como salida

pinMode(led45, OUTPUT);         //declarar leds indicadores de temp como salidas
pinMode(led55, OUTPUT);
pinMode(led65, OUTPUT);

pinMode(input45, INPUT);        //declarar botones seleccionadores de temp como entradas
pinMode(input55, INPUT);
pinMode(input65, INPUT);

}

void loop() {
byte i;                    //variables para sensor de temp
byte present = 0;
byte type_s;
byte data[12];
byte addr[8];
float celsius;

int16_t raw = (data[1] << 8) | data[0];             //deteccion de temperatura por el sensor
if (type_s) {
	raw = raw << 3;
	if (data[7] == 0x10) {
		raw = (raw & 0xFFF0) + 12 - data[6];
	}
} else {
byte cfg = (data[4] & 0x60);
if (cfg == 0x00) raw = raw & ~7; 
else if (cfg == 0x20) raw = raw & ~3;
else if (cfg == 0x40) raw = raw & ~1;

}

oled.clearDisplay();           //inicio de la impresion de datos en la pantalla
oled.setTextColor(WHITE); 
oled.setCursor(35, 0);     
oled.setTextSize(1);     
oled.print("-Sous Vide-");       //titulo del proyecto
oled.setCursor (10, 15);   
oled.setTextSize(2);     
int tiempo = (millis() * 2.778 * pow(10, -7));     //cronometro del tiempo desde que se enciende la maquina (siempre encendido) mostrado en horas (conversion millis-horas)
oled.print(tiempo);
oled.setTextSize(1);
oled.print(" hrs.");     
oled.setCursor (10, 64);   
oled.setTextSize(2);
celsius = (float)raw / 16.0;                     //mostrar temperatura del agua en pantalla
oled.print(celsius);
oled.setTextSize(1);
oled.print(" °C");
oled.display();     

//comienzo de condicionales para estabilizar temperatura del agua al rango seleccionado por medio de la resistencia
estado45 = digitalRead(input45);
if (estado45 && !estado45Ant) {
	digitalWrite(led45, HIGH);                                  //si se selecciona el boton de 45°c entonces enciende el led45
	if (celsius<41 || celsius>48){                          // y la resistencia cuando la temperatura baje de 41°c y cuando pase de 48°c paga resistencia
		digitalWrite(HEAT, HIGH);
	}
}
estado45Ant = estado45;

estado55 = digitalRead(input55);
if (estado55 && !estado55Ant) {
	digitalWrite(led55, HIGH);                                  //si se selecciona el boton de 55°c entonces enciende el led55
	if (celsius<51 || celsius>58){                          // y la resistencia cuando la temperatura baje de 51°c y cuando pase de 58°c paga resistencia
		digitalWrite(HEAT, HIGH);
	}
}
estado55Ant = estado55;

estado65 = digitalRead(input65);
if (estado65 && !estado65Ant) {
	digitalWrite(led65, HIGH);                                   //si se selecciona el boton de 65°c entonces enciende el led65
	if (celsius<61 || celsius>68){                          // y la resistencia cuando la temperatura baje de 61°c y cuando pase de 68°c paga resistencia
		digitalWrite(HEAT, HIGH);
	}
}
estado65Ant = estado65;

}

Muchisimas gracias, lo intenté pero al compilar me decia “error redefinition of “bool estado45Ant”” pues la declaracion se repetia 3 veces iguales, intenté corregirlo y logré compilar sin problema pero a la hora de conectar y correr el programa sigue sin funcionar.

Sera porque puse bool estado45Ant 3 veces
cambia por

bool estado55Ant;
bool estado65Ant;

un poco de simple intiución te debería haber permitido salvar el error.

Acá esta el error

bool estado45, estado45Ant = false;
bool estado55, estado45Ant = false;
bool estado65, estado45Ant = false;

estado45Ant es para estado45
para
estado55, debería ser estado55Ant y asi

Moderador:
En el título no debe usarse la palabra Ayuda. Edita!!
No se como se me pasó el título de tu post.
Y otra cosa, para qué repites lo que yo te he puesto?
Se lee arriba de modo que no hace falta repetirlo. Punto 14 ultimo párrafo de las normas de este foro.

Lee las Normas del foro

surbyte:
Sera porque puse bool estado45Ant 3 veces
cambia por

bool estado55Ant;

bool estado65Ant;




un poco de simple intiución te debería haber permitido salvar el error.

Acá esta el error



bool estado45, estado45Ant = false;
bool estado55, estado45Ant = false;
bool estado65, estado45Ant = false;




estado45Ant es para estado45
para 
estado55, debería ser estado55Ant y asi

Muchas gracias, mi intuición me permitió corregir ese error, como dije en mi respuesta anterior, y no tuve problemas de nuevo para compilar, a pesar de eso a la hora de conectar y correr el programa el código corregido no tiene sentido pues sigue sin realizar ninguna accion (especificamente todas las salidas de leds y la de la resistencia estan siempre ON desde el principio).

surbyte:
Moderador:
En el título no debe usarse la palabra Ayuda. Edita!!
No se como se me pasó el título de tu post.
Y otra cosa, para qué repites lo que yo te he puesto?
Se lee arriba de modo que no hace falta repetirlo. Punto 14 ultimo párrafo de las normas de este foro.

Lee las Normas del foro

El punto 5 del foro dice claramente que busque un titulo inteligente y descriptivo, en el mío se describe que necesito y por qué, además me parece que es bastante breve. Al incluir la palabra "Ayuda" capta mas la atención pues el resultado en las vistas y las respuestas es mayor. Aunque el p.5 aclara que se deben evitar algunos tipos de títulos, por que solo piden ayuda y no especifican el tema, y no porque la palabra "ayuda este prohibida" (Si es así dígame, porfavor) por eso intente ser detallado en mi Tema.

Comentario adicional: Ultimo aspecto del punto 13 el cual deberian respetar mas los moderadores.

:o
El 99.99% de los hilos es de alguien que necesita ayuda.
Si todos los mensajes tuvieran en el titulo la palabra ayuda, funcionaria mejor el foro ?
Tu eres especial ?

De vedad llevas suficiente tiempo en el foro como para rebotarte delante de un aviso del moderador?

Off-topic: @Gianni0123 no te creas que es tan así como lo planteas, no creo que por poner "ayuda" en el título tengas más respuestas (en lo particular desde el vamos me predispone mal y me quita las ganas de responder) y claramente tu tema lo demuestra ya que solo @surbyte respondió a tu consulta (y encima le muerdes la mano, lo que no me parece muy inteligente).