cocción
unknown
c_cpp
4 years ago
6.3 kB
23
Indexable
#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)
//-------------------------------------------------------
}Editor is loading...