Sous vide (control de cocción a baja temperatura)

De antemano gracias por su ayuda.
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);
    }
}
}

Saludos. Varias recomendaciones:

  • Inserta tu código según las especificaciones que en este lugar están establecidas, para mejor entendernos todos (podrás encontrarlas en este enlace.
  • Tu código no tiene un solo comentario, es muy complicado entender qué quieres hacer de esa manera.
  • No muestras el mensaje completo de tu compilador, seguro que te dice algo más. En mi computadora indica:

pantalla_y_termometro:7:10: fatal error: Adafruit_SSD1306.h: No such file or directory
#include <Adafruit_SSD1306.h>
^~~~~~~~~~~~~~~~~~~~
compilation terminated.
exit status 1
Adafruit_SSD1306.h: No such file or directory

El mensaje de error deja claro que, en mi caso, no tengo la biblioteca necesaria, pero no podemos saber qué te sucede a ti exáctamente

El la debe tener instaladisima porque la incluyó 3 veces... ::slight_smile:

Moderador:
Hola, bienvenido al foro Arduino.
En la sección proyectos tienes estos dos hilos que debiste haber leído antes de postear

Como tu consulta es para otra sección lo muevo a Software.
En el título no debe usarse la palabra Ayuda. Edita!!
Los códigos se postean usando etiquetas y solo se adjuntan cuando superan 9k. Edita y lee esto:

Normas del foro

gatul:
El la debe tener instaladisima porque la incluyó 3 veces... ::slight_smile:

Si, me acuerdo de cuando no existía el #ifndef, jejjee que tiempos y que locuras, menos mal que a él no le ha afectado