Cocción de Cerveza con Arduino

cavieres
 avatar
user_0086645678
c_cpp
2 years ago
5.9 kB
5
Indexable
Never
#include <Wire.h>
#include <RTClib.h>
#include <LiquidCrystal_i2C.h>   
#include <OneWire.h>
#include <DallasTemperature.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
int servo1=0;
int servo2=0;
int servo3=0;
int servo4=0;
//pin valvula de gas
int valvula=0;

//La válvula de gas se mantendrá abierta mientras se encuentre en el rango entre estas dos temperaturas
//-----------Temperatura mínima excluida, temperatura máxima incluída---------------------------------
int temperatura_Minima=75;
int temperatura_Maxima=85;
//-----------------------------------------------------------------------------------------------------






















//-------------------------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_i2 TyT(0x3F,  16,2);
//-----------------------------------------------------------------------------------------

//---------Variable que refiere al sensor de temperatura----------
DallasTemperature sensor(&oneWireBus);
//----------------------------------------------------------------

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


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

//Variable que activo cuando termina el proceso.
int fin=false;
//----------------------------------------------
 
void setup () {
    
//Comandos de inicialización de componentes
 Serial.begin(9600);
 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);
 }
//-----------------------------------------------------

//Variable que guarda el momento en el que se inició el proceso de cocción
 DateTime startTime = rtc.now();
//-----------------------------------------------------------------------
}
 
 
 
void loop () {
    
//comando necesario para posteriormente utilizar las temperaturas del sensor    
 sensor.requestTemperatures();
//--------------------------------------------------------------------------

//Variable que guarda el tiempo todo el rato (tiempo en presente)
 DateTime now = rtc.now();
//--------------------------------------------------------------

//----Variable que detecta cuanto tiempo pasó desde el inicio de la cocción
 TimeSpan tiempo = now-startTime;
//-------------------------------------------------------------------------
 
//Bloque encargado del abre y cierre de la válvula de gas-----
//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, detecta si se supera la temperatura mínima(TAMBIÉN DEFINIDO EN CONFIG)
     } else {
         if (sensor.getTempCByIndex(0)>temperatura_Minima) {
             
             //Si esto pasa, la temperatura es mayor a la minima y menor a la maxima al mismo tiempo, por lo que la válvula se abre
             digitalWrite(valvula,HIGH);
         }
     }
 }
//-------------------------------------------------------------
 
 //Checkea los 4 tiempos y opera servos y valvulas (DEFINIDO ANTES DEL SETUP. ELEMENTOS DE LA MATRIZ DEFINIDOS EN CONFIG)
 //A medida que el tiempo que pasa es mayor al tiempo de inicio, se van abriendo las válvulas consecutivamente
 if ((tiempo.totalseconds()/60)>= tiempos[0]) {
     if ((tiempo.totalseconds()/60)>= tiempos[1]) {
         if ((tiempo.totalseconds()/60)>= tiempos[2]) {
             if ((tiempo.totalseconds()/60)>= tiempos[3]) {
                 
                 //Cierra la válvula y acaba el proceso en el cuarto tiempo.
                 digitalWrite(valvula,LOW);
                 fin=true;
                 
             }
             //Se abre en tiempo[2]
             digitalWrite(servo3,HIGH);
         } 
         //Se abre en tiempo[1]
         digitalWrite(servo2,HIGH);
     }
     
     //Se abre en tiempo[0]
     digitalWrite(servo1,HIGH);
     
 }
 //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(now.hour());
 TyT.setCursor(2,0);
 TyT.print(":");
 TyT.setCursor(3,0);
 TyT.print(now.minute());
 TyT.setCursor(5,0);
 TyT.print(":");
 TyT.setCursor(6,0);
 TyT.print(now.second());
 
 //temperatura
 TyT.setCursor(0,1);
 TyT.print(sensor.getTempCByIndex(0));
 TyT.setCursor(3,1);
 TyT.print("C°");
 delay(10);
 
//-------Resultado esperado: 'HH:MM:SS' 'ttC°' (HH=hora, MM=minuto, SS=segundo, tt=Temperatura)-----------
 
//----------------------------------------------------------------------
}