cocción

mail@pastecode.io avatar
unknown
c_cpp
2 years ago
6.3 kB
16
Indexable
Never
#include <Wire.h>
#include <RTClib.h>
#include <LiquidCrystal_I2C.h>   
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Adafruit_PWMServoDriver.h>

//-------------CONFIG----------------
int pin_sensorTemperatura = 5;

int tiempo_Lupulo_1 = 50;
int tiempo_Lupulo_2 = 60;
int tiempo_Lupulo_3 = 80;
int tiempo_Fin = 100;

//pines
//servos de los lupulos
int servo1=1;
int servo2=2;
int servo3=3;
int servosAbiertos=0; //Ira sumandose de a uno hasta la cantidad de servos abiertos (para detectarlos y que no se abran dos veces)
int valvula=5; //pin valvula de gas

//La válvula de gas se mantendrá abierta mientras se encuentre en el rango entre estas dos temperaturas:
int temperatura_Minima=75;
int temperatura_Maxima=85;

//servos con driver
Adafruit_PWMServoDriver servos = Adafruit_PWMServoDriver(0x40);
unsigned int pos0=172; // ancho de pulso en cuentas para posición 0°
unsigned int pos180=565; // ancho de pulso en cuentas para la posición 180°

//-------------------------------------------------------





















//------------CÓDIGO------------------

//Variable del RTC (reloj)
RTC_DS3231 rtc;

//Variable del LCD: 'TyT' de "Tiempo y Temperatura" (texto que se pondrá dentro de él)
LiquidCrystal_I2C TyT(0x3F,  16,2);

//Pin en el que irá el sensor de temperatura (DEFINIDO EN LA CONFIG)
const int pinT = pin_sensorTemperatura;
OneWire oneWireBus(pinT);

//Variable que refiere al sensor de temperatura
const int oneWirePin = 5;
DallasTemperature sensor(&oneWireBus);

//Tiempos de cocción para lúpulos combinados en una matriz (ELEMENTOS DEFINIDOS EN LA CONFIG)
int tiempos[]={tiempo_Lupulo_1,   tiempo_Lupulo_2,   tiempo_Lupulo_3,   tiempo_Fin};

bool inicio=false; //Variable que activo cuando se inicia el proceso de cocción.
bool fin=false; //Variable que activo cuando termina el proceso de cocción.

DateTime startTime; //Explicado en el setup
//-------------------------------------------------------

void setup () {

  //servos setup
  Serial.begin(9600);
  servos.setPWMFreq(60); //Frecuecia PWM de 60Hz o T=16,66ms

      
  //Comandos de inicialización de componentes explicados anteriormente
  sensor.begin();
  TyT.init();
 
  //Condicional que detecta el módulo RTC
  if (! rtc.begin()) {
    Serial.println("No se encontró un módulo RTC conectado.");
    while (1);
  }
  startTime = rtc.now(); //Variable que guarda el momento en el que se inició el proceso de cocción

  digitalWrite(valvula,HIGH); //se abre la valvula de gas
}


//Función para el cambio de posición de los servos
void setServo(uint8_t n_servo, int angulo) {
  int duty;
  duty=map(angulo,0,180,pos0, pos180);
  servos.setPWM(n_servo, 0, duty);  
}
//-------------------------
 
 
void loop () {
  setServo(servo1,180); //acomodamos la posición de las compuertas para cargar las pellets del lúpulo.
  setServo(servo2,180);
  setServo(servo3,180);
    
  sensor.requestTemperatures(); //comando necesario para posteriormente utilizar las temperaturas del sensor


  //Detecta si el proceso todavia no terminó
  if (fin==false) {
    //Detecta si se supera la temperatura máxima (DEFINIDO EN LA CONFIG)
    if (sensor.getTempCByIndex(0)>=temperatura_Maxima){ 
      //Cierra válvula
      digitalWrite(valvula,LOW);
      //Si no, prende la válvula si es que está apagada
      } else {
        if (digitalRead(valvula)==LOW){
          digitalWrite(valvula,HIGH);}
        }
   }
 
  //Hasta que la temperatura no llega al mínimo para comenzar, no arrnca la cocción
  while ((sensor.getTempCByIndex(0)<temperatura_Minima) && (inicio==false)) {
    delay(10);
    startTime = rtc.now(); //Se actualiza el tiempo de inicio hasta que la temperatura llegue al punto (si no iniciaría sin la temperatura adecuada
    if (sensor.getTempCByIndex(0)>=temperatura_Minima){inicio = true;} //activa la variable de inicio si la temperatura llega y termina el loop
    //si 'inicio' no existiera, la temperatura al bajar reiniciaría por completo el proceso de cocción.
  }
 

  DateTime now = rtc.now();  //Variable que guarda el tiempo todo el rato (tiempo en presente)
  TimeSpan tiempo = now-startTime; //Variable que detecta cuanto tiempo pasó desde el inicio de la cocción


  //Checkea los 4 tiempos y opera servos y valvulas (DEFINIDO ANTES DEL SETUP. ELEMENTOS DE LA MATRIZ DEFINIDOS EN CONFIG)
  if ((tiempo.totalseconds()/60)>= tiempos[0]) {
     //Se abre en tiempo[0]
     //detecta si ya se había abierto
     if (servosAbiertos<1){
      setServo(servo1,90);
      delay(6000);
      setServo(servo1,180);
      servosAbiertos +=1;
     }
  }
  if ((tiempo.totalseconds()/60)>= tiempos[1]) {
     //Se abre en tiempo[1]
       if (servosAbiertos<2){
       setServo(servo2,90);
       delay(6000);
       setServo(servo2,180);
       servosAbiertos +=1;
       }
     
  }
  if ((tiempo.totalseconds()/60)>= tiempos[2]) {
     //Se abre en tiempo[2]
     if (servosAbiertos<3){
     setServo(servo3,90);
     delay(6000);
     setServo(servo3,180);
     servosAbiertos +=1;
     }
  }
  
  //Tiempo final. se termina el proceso al cumplir este condicional.
  if ((tiempo.totalseconds()/60)>= tiempos[3]) {
     //Cierra la válvula y acaba el proceso en el cuarto tiempo.
     digitalWrite(valvula,LOW);
     fin=true;        
  }
  
  //Este proceso, incluso una vez terminado, se sigue ejecutando indefinidamente, Aún así, no altera al proceso ya que cada componente se mantiene en el mismo estado.
 
  //Bloque que imprime los datos de temperatura y tiempo (TyT) por un LCD:

  //tiempo
  TyT.setCursor(0,0);
  TyT.print(tiempo.hours());
  TyT.setCursor(2,0);
  TyT.print(":");
  TyT.setCursor(3,0);
  TyT.print(tiempo.minutes());
  TyT.setCursor(5,0);
  TyT.print(":");
  TyT.setCursor(6,0);
  TyT.print(tiempo.seconds());
 
  //temperatura
  TyT.setCursor(0,1);
  TyT.print(sensor.getTempCByIndex(0));
  TyT.setCursor(3,1);
  TyT.print("°C");
  delay(10);
 
  //Resultado esperado: 'HH:MM:SS' 'tt°C' (HH=hora, MM=minuto, SS=segundo, tt=Temperatura) 
  //-------------------------------------------------------
}