cocción
unknown
c_cpp
3 years ago
6.3 kB
20
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...