Buenas noches. Bueno, como verán he tomado las sugerencias de ustedes, y debo reconocer que sí, queda mucho más ordenado.
Ahora bien, tengo la dificultad (y creo que es muy parecida al posteo anterior) o sigo con lo mismo, no sabría aclarar. El punto es el siguiente: hago referencia a la parte de "case 5"
Cuando el sensor detecta x temperatura inicia el timeOut y también un cronómetro (un contador). Para que el buzzer del contador deje de sonar tengo que usar la línea INICIO_HERVIDO = false;
pero si la empleo, claramente está, que no funciona el cronómetro. Y creo que una situación similar era si apretaba teclaA para iniciar crónometro, o me funciona el cronómetro o no puedo silenciar el buzzer del timeOut. Cómo lo podría resolver? Por lo pronto muchas gracias.
#include <LiquidCrystal.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Keypad.h>
#include <TimeOut.h>
#define Buzzer_1 30
#define Buzzer_2 31
#define ONE_WIRE_BUS 9
#define Rele_Resistencia_de_Macerado 51
#define Rele_Bomba_1_Recirculado_Macerado 52
#define Rele_heladera_Frio 50
#define Rele_heladera_Calor 53
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
const int led1_Agua_Macerado_y_Lavado = 40;
const int led3_Calentado_Recirculado = 41;
const int led2_Hervido = 42;
const int led4_Adiciones_Tardias = 43;
const int led5_Macerado_ON = 44;
const int led6_Macerado_OFF = 45;
const int led7_Heladera_Frio = 46;
const int led8_Heladera_Calor = 47;
const int led9_Mash_Out = 48;
boolean teclaA_Cronometro = false; // EN CRONÓMETRO
boolean teclaB_Macerado = false; // EN MACERADO
boolean teclaC_MashOut = false; // EN MASH OUT
boolean INICIO_MACERADO = true;// EN Macerado
boolean INICIO_HERVIDO = true;// EN Hervido
boolean INICIO = true;
boolean InicioCronometro = true;
boolean MaceradoCronometro = true;
TimeOut Temp_Macerado_Parte_1;
TimeOut Temp_Macerado_Parte_2;
TimeOut Temp_Hervido_Parte_1;
TimeOut Temp_Hervido_Parte_2;
const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte rowPins[ROWS] = {22, 24, 26, 28};
byte colPins[COLS] = {23, 25, 27, 29};
Keypad teclado = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
int secuencia;
int entrada;
float Sensor_Agua; //sensors.getTempCByIndex(0);
float Sensor_Mosto; //sensors.getTempCByIndex(1);
float Sensor_Hervido; //sensors.getTempCByIndex(2);
float Sensor_Fermentacion; //sensors.getTempCByIndex(3);
/// CRONOMETRO/CONTADOR///
unsigned long tiempoactual = 0;
int segundos = 0;
int minutos = 0;
int hora = 0;
/// FERMENTACION///
int Dia = 0;
float Temperatura_xdia[] = {24, 24, 24, 25, 26, 20, 21, 21, 18, 13, 7, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3};
float MenosMargenTemp = 0.4;
float MasMargenTemp = 0.4;
Interval intervaloFermentacion;
/////////////////////// void Adiciones Tardias Macerado ///////////////////
void n2_Adiciones_Tardias_Macerado() {
lcd.setCursor(13, 2);
lcd.print ("Ad Tard");
digitalWrite(led4_Adiciones_Tardias, HIGH);
tone(Buzzer_1, 200);
}
///////////////// void MACERADO ///////////////////////
void n1_Macerado() {
lcd.setCursor(9, 3);
lcd.print ("FIN");
digitalWrite (led5_Macerado_ON, LOW);
digitalWrite (led6_Macerado_OFF, HIGH);
tone(Buzzer_1, 200);
}
////////////////////// void Mash Out //////////////////////////////
void n6_Mash_Out() {
lcd.setCursor(9, 3);
lcd.print ("FIN");
tone(Buzzer_1, 200);
}
/////////////////////// void Hervido PARTE 1 //////////////
void n4_Adiciones_Tardias_Hervido() {
lcd.setCursor(0, 3);
lcd.print ("Ad Tard");
digitalWrite(led4_Adiciones_Tardias, HIGH);
tone(Buzzer_1, 200);
}
//////////////////////// void Hervido PARTE 2 ///////////////////////////
void n3_Hirviendo() {
digitalWrite(led2_Hervido, LOW);
lcd.setCursor(5, 3);
lcd.print ("FIN HERVIDO");
tone(Buzzer_1, 200);
}
//////////////////////FERMENTACION//////////////////////
void Nuevo_dia() {
if ( Dia < 22 ) // cambiar a cantidad de dias
Dia++;
}
//////////////////////CRONOMETRO////////////////////////
void muestroTiempo() {
char buffer[20];
segundos++;
if (segundos == 60) {
segundos = 0;
minutos ++;
}
if (minutos == 60) {
minutos = 0;
hora ++;
}
if (hora == 24) {
hora = 0;
}
lcd.setCursor(0, 3);
sprintf(buffer, "%2d:%02d:%02d", hora, minutos, segundos);
lcd.print(buffer);
}
void midoTemperaturas() {
sensors.requestTemperatures();
Sensor_Agua = sensors.getTempCByIndex(0);
}
void setup() {
lcd.begin( 20, 4);
lcd.setCursor(7, 0);
lcd.print("-ANVER-");
lcd.setCursor(1, 2);
lcd.print("British Golden Ale");
delay (2000);
lcd.clear();
pinMode(led1_Agua_Macerado_y_Lavado , OUTPUT);
pinMode(led2_Hervido , OUTPUT);
pinMode(led3_Calentado_Recirculado , OUTPUT);
pinMode(led4_Adiciones_Tardias , OUTPUT);
pinMode(led5_Macerado_ON , OUTPUT);
pinMode(led6_Macerado_OFF , OUTPUT);
pinMode(led7_Heladera_Frio , OUTPUT);
pinMode(led8_Heladera_Calor , OUTPUT);
pinMode(led9_Mash_Out, OUTPUT);
pinMode(Buzzer_1, OUTPUT);
pinMode(Buzzer_2, OUTPUT);
pinMode(Rele_Resistencia_de_Macerado, OUTPUT);
pinMode(Rele_Bomba_1_Recirculado_Macerado, OUTPUT);
pinMode(Rele_heladera_Frio, OUTPUT);
pinMode(Rele_heladera_Calor, OUTPUT);
digitalWrite(Rele_Resistencia_de_Macerado, 1);
digitalWrite(Rele_Bomba_1_Recirculado_Macerado, 1);
digitalWrite(Rele_heladera_Frio, 1);
digitalWrite(Rele_heladera_Calor, 1);
sensors.begin();
secuencia = 1;
entrada = 1;
}
void loop() {
TimeOut::handler();
midoTemperaturas();
char tecla = teclado.getKey ();
switch (tecla) {
case 'A': // Inicio Cronómetro
teclaA_Cronometro = true;
break;
case 'B': // Inicio Macerado
teclaB_Macerado = true;
break;
case 'C': // Inico Mash Out
teclaC_MashOut = true;
break;
case 'D': // para agua de lavado buzzer 2
INICIO = false;
noTone (Buzzer_2);
digitalWrite(led1_Agua_Macerado_y_Lavado, LOW);
lcd.setCursor(2, 1);
lcd.print(" ");
break;
case '2': secuencia = 2;
entrada = 1;
break;
case '3': secuencia = 3;
entrada = 1;
break;
case '4': secuencia = 4;
entrada = 1;
break;
case '5': secuencia = 5;
entrada = 1;
break;
case '6': secuencia = 6;
entrada = 1;
break;
case '7': secuencia = 7;
entrada = 1;
break;
case '8': secuencia = 8;
entrada = 1;
break;
case '9': secuencia = 9;
entrada = 1;
break;
}
/////////////////////////////////////////////////////
/// **************** BLOQUE 1 AGUA MACERADO*****************///
/////////////////////////////////////////////////////
switch (secuencia) {
case 1: if ( entrada == 1 ) {
entrada = 2;
lcd.setCursor(0, 0);
lcd.print("1 -AGUA MACERADO- 2");
tiempoactual = 0;
segundos = 0;
minutos = 0;
hora = 0;
}
lcd.setCursor(16, 2);
lcd.print(Sensor_Agua, 1);
if ( Sensor_Agua <= 23) {
lcd.setCursor( 9, 2);
lcd.print("CAL");
digitalWrite(led1_Agua_Macerado_y_Lavado, LOW);
noTone (Buzzer_2);
}
else {
digitalWrite(led1_Agua_Macerado_y_Lavado, HIGH);
lcd.setCursor(9, 2);
lcd.print("OK ");
tone (Buzzer_2, 500);
}
if (teclaA_Cronometro == true && (millis() >= tiempoactual + 1000) ) {
tiempoactual = millis();
muestroTiempo();
}
break;
//////////////////////////////////////////////////////////
// **************** BLOQUE 2 MACERADO PARTE 1 *****************/////
/////////////////////////////////////////////////////////
case 2: if ( entrada == 1 ) {
entrada = 2;
digitalWrite(led1_Agua_Macerado_y_Lavado, LOW);
noTone(Buzzer_2);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("2 -AGUA DE LAVADO- 3");
lcd.setCursor(0, 2);
lcd.print("-MACERADO-");
tiempoactual = 0;
segundos = 0;
minutos = 0;
hora = 0;
}
/////////Parte 1 A -- AGUA DE LAVADO///////
lcd.setCursor(16, 1);
lcd.print(Sensor_Agua, 1);
if (INICIO == true) {
if (Sensor_Agua <= 25) {
lcd.setCursor( 9, 1);
lcd.print("CAL");
noTone (Buzzer_2);
}
else {
digitalWrite(led1_Agua_Macerado_y_Lavado, HIGH);
lcd.setCursor(2, 1);
lcd.print("OK Cancel D");
tone (Buzzer_2, 150); // Apagamos con Tecla D = INICIO = false
}
}
//////////PARTE 1 B -- MACERADO - ADICIONES TARDIAS 45´///////
Sensor_Mosto = sensors.getTempCByIndex(1);
lcd.setCursor(16, 3);
lcd.print(Sensor_Mosto, 1);
if (teclaB_Macerado == true) {
lcd.setCursor(9, 3);
lcd.print("ON ");
digitalWrite(led5_Macerado_ON, HIGH);
Temp_Macerado_Parte_1.timeOut(10000, n2_Adiciones_Tardias_Macerado);// son 45 min
if (Sensor_Mosto <= 20) {
digitalWrite(led3_Calentado_Recirculado, HIGH);
digitalWrite(Rele_Resistencia_de_Macerado, LOW);
digitalWrite(Rele_Bomba_1_Recirculado_Macerado, LOW);
} else if (Sensor_Mosto >= 26) {
digitalWrite(led3_Calentado_Recirculado, LOW);
digitalWrite(Rele_Resistencia_de_Macerado, HIGH);
digitalWrite(Rele_Bomba_1_Recirculado_Macerado, HIGH);
}
teclaB_Macerado = false;
if (teclaA_Cronometro == true && (millis() >= tiempoactual + 1000) ) {
tiempoactual = millis();
muestroTiempo();
}
}
break;
//////////////////////////////////////////////////////////
// **************** BLOQUE 3 MACERADO PARTE 2 *****************/////
/////////////////////////////////////////////////////////
case 3: if ( entrada == 1 ) {
entrada = 2;
Temp_Macerado_Parte_1.cancel();
noTone(Buzzer_1);
digitalWrite(led1_Agua_Macerado_y_Lavado, 0);
digitalWrite(led5_Macerado_ON, 0);
digitalWrite(led4_Adiciones_Tardias, LOW);
digitalWrite(led3_Calentado_Recirculado, LOW);
digitalWrite(Rele_Resistencia_de_Macerado, HIGH);
digitalWrite(Rele_Bomba_1_Recirculado_Macerado, HIGH);
lcd.clear ();
lcd.setCursor(0, 0);
lcd.print("3 -AGUA DE LAVADO- 4");
lcd.setCursor(0, 2);
lcd.print("-MACERADO-");
Temp_Macerado_Parte_2.timeOut(4000, n1_Macerado);
}
////////Parte 2 A -- AGUA DE LAVADO///////
Sensor_Agua = sensors.getTempCByIndex(0);
lcd.setCursor(16, 1);
lcd.print(Sensor_Agua, 1);
if (INICIO == true) {
if (Sensor_Agua <= 25) {
lcd.setCursor( 9, 1);
lcd.print("CAL");
noTone (Buzzer_2);
}
else {
digitalWrite (led1_Agua_Macerado_y_Lavado, HIGH);
lcd.setCursor(2, 1);
lcd.print("OK Cancel D");
tone (Buzzer_2, 150); // Apagamos con Tecla D = INICIO = false
}
INICIO = false;
}
//////////PARTE 2 B -- MACERADO - ADICIONES TARDIAS 45´///////
Sensor_Mosto = sensors.getTempCByIndex(1);
lcd.setCursor(16, 3);
lcd.print(Sensor_Mosto, 1);
if (Sensor_Mosto <= 20) {
digitalWrite (led3_Calentado_Recirculado, HIGH);
digitalWrite(Rele_Resistencia_de_Macerado, LOW);
digitalWrite(Rele_Bomba_1_Recirculado_Macerado, LOW);
} else if (Sensor_Mosto >= 26) {
digitalWrite(led3_Calentado_Recirculado, LOW);
digitalWrite (Rele_Resistencia_de_Macerado, HIGH);
digitalWrite (Rele_Bomba_1_Recirculado_Macerado, HIGH);
}
break;
//////////////////////////////////////////////////////////
// **************** BLOQUE 4 MASH OUT *****************/////
/////////////////////////////////////////////////////////
case 4: if ( entrada == 1 ) {
entrada = 2;
lcd.clear();
Temp_Macerado_Parte_2.cancel();
noTone(Buzzer_1);
digitalWrite (led6_Macerado_OFF, LOW);
digitalWrite(led3_Calentado_Recirculado, LOW);
digitalWrite (led1_Agua_Macerado_y_Lavado, LOW);
digitalWrite (Rele_Resistencia_de_Macerado, HIGH);
digitalWrite (Rele_Bomba_1_Recirculado_Macerado, HIGH);
lcd.setCursor(0, 0);
lcd.print("4 -MASH OUT- 5");
lcd.setCursor(5, 3);
lcd.print("ON tecla C");
}
if (teclaC_MashOut == true) {
lcd.setCursor(5, 3);
lcd.print(" ");
sensors.requestTemperatures();
Sensor_Mosto = sensors.getTempCByIndex(1);
lcd.setCursor(16, 2);
lcd.print(Sensor_Mosto, 1);
if (Sensor_Mosto < 23) {
lcd.setCursor( 9, 2);
lcd.print("CAL");
digitalWrite(led3_Calentado_Recirculado, HIGH);
digitalWrite (led9_Mash_Out, LOW);
digitalWrite(Rele_Resistencia_de_Macerado, LOW);
digitalWrite(Rele_Bomba_1_Recirculado_Macerado, LOW);
}
else if (Sensor_Mosto > 25) {
lcd.setCursor(9, 2);
lcd.print("ON ");
digitalWrite (led9_Mash_Out, HIGH);
digitalWrite(led3_Calentado_Recirculado, LOW);
digitalWrite (Rele_Resistencia_de_Macerado, HIGH);
digitalWrite (Rele_Bomba_1_Recirculado_Macerado, HIGH);
}
}
break;
//////////////////////////////////////////////////////////
// **************** BLOQUE 5 HERVIDO PARTE 1 *****************/////
/////////////////////////////////////////////////////////
case 5: if ( entrada == 1 ) {
entrada = 2;
digitalWrite (Rele_Resistencia_de_Macerado, HIGH);
digitalWrite (Rele_Bomba_1_Recirculado_Macerado, HIGH);
digitalWrite (led6_Macerado_OFF, LOW);
digitalWrite(led3_Calentado_Recirculado, LOW);
noTone(Buzzer_1);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("5 -HERV PARTE 1- 6");
}
Sensor_Hervido = sensors.getTempCByIndex(2);
lcd.setCursor(16, 2);
lcd.print(Sensor_Hervido, 1);
if (INICIO_HERVIDO == true) {
if (Sensor_Hervido <= 23 ) {
lcd.setCursor( 9, 2);
lcd.print("CAL");
digitalWrite(led2_Hervido, LOW);
} else {
lcd.setCursor( 9, 2);
lcd.print( "HIR");
digitalWrite(led2_Hervido, HIGH);
Temp_Hervido_Parte_1.timeOut(50000, n4_Adiciones_Tardias_Hervido);// de 0 a 50 min
if (millis() >= tiempoactual + 1000) {
tiempoactual = millis();
muestroTiempo();
}
//INICIO_HERVIDO = false;
}
}
break;
//////////////////////////////////////////////////////////
// **************** BLOQUE 6 HERVIDO PARTE 2 *****************/////
/////////////////////////////////////////////////////////
case 6: if ( entrada == 1 ) {
entrada = 2;
digitalWrite(led2_Hervido, LOW);
Temp_Hervido_Parte_1.cancel();
noTone(Buzzer_1);
lcd.clear();
digitalWrite(led4_Adiciones_Tardias, LOW);
lcd.setCursor(0, 0);
lcd.print("6 -HERV PARTE 2- 7");
lcd.setCursor( 9, 2);
lcd.print( "HIR");
digitalWrite(led2_Hervido, HIGH);
Temp_Hervido_Parte_2.timeOut(10000, n3_Hirviendo);
}
Sensor_Hervido = sensors.getTempCByIndex(2);
lcd.setCursor(16, 2);
lcd.print(Sensor_Hervido, 1);
break;
//////////////////////////////////////////////////////////
// **************** BLOQUE 7 WHIRLPOOL *****************/////
/////////////////////////////////////////////////////////
case 7: if ( entrada == 1 ) {
entrada = 2;
noTone (Buzzer_1);
Temp_Hervido_Parte_2.cancel();
digitalWrite(led2_Hervido, 0);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("7 -WHIRPOOL- 8");
}
Sensor_Hervido = sensors.getTempCByIndex(2);
lcd.setCursor(16, 2);
lcd.print(Sensor_Hervido, 1);
break;
//////////////////////////////////////////////////////////
// **************** BLOQUE 8 FERMENTACION PARTE 1 *****************/////
/////////////////////////////////////////////////////////
case 8: if ( entrada == 1 ) {
entrada = 2;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("8 -FERMENTACION- 9");
lcd.setCursor(2, 1);
lcd.print("PARA INICIAR SIG");
}
sensors.requestTemperatures();
Sensor_Fermentacion = sensors.getTempCByIndex(3);
lcd.setCursor(16, 3);
lcd.print(Sensor_Fermentacion, 1);
break;
//////////////////////////////////////////////////////////
// **************** BLOQUE 9 FERMENTACION PARTE 2*****************/////
/////////////////////////////////////////////////////////
case 9: if ( entrada == 1 ) {
entrada = 2;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("9 -FERMENTACION- 2");
intervaloFermentacion.interval( 200000, Nuevo_dia);
}
sensors.requestTemperatures();
Sensor_Fermentacion = sensors.getTempCByIndex(3);
lcd.setCursor(0, 3);
lcd.print( "Temp Ferment ");
lcd.print(Sensor_Fermentacion, 1);
lcd.setCursor( 0, 1);
lcd.print( "Dia: ");
lcd.print( Dia);
lcd.setCursor( 0, 2);
lcd.print( "Temp Objetivo ");
lcd.print( Temperatura_xdia[Dia], 1 );
if ( Sensor_Fermentacion <= (Temperatura_xdia[Dia] - MenosMargenTemp)) {
digitalWrite (led7_Heladera_Frio, 0);
digitalWrite (led8_Heladera_Calor, 1);
digitalWrite(Rele_heladera_Frio, 1);
digitalWrite(Rele_heladera_Calor, 0);
lcd.setCursor( 13, 1);
lcd.print( " ");
} else if ( Sensor_Fermentacion >= (Temperatura_xdia[Dia] + MasMargenTemp)) {
digitalWrite (led7_Heladera_Frio, 1);
digitalWrite (led8_Heladera_Calor, 0);
digitalWrite(Rele_heladera_Frio, 0);
digitalWrite(Rele_heladera_Calor, 1);
lcd.setCursor( 13, 1);
lcd.print( " ");
} else {
lcd.setCursor( 13, 1);
lcd.print( "Temp OK");
digitalWrite (led7_Heladera_Frio, 0);
digitalWrite (led8_Heladera_Calor, 0);
digitalWrite(Rele_heladera_Frio, 1);
digitalWrite(Rele_heladera_Calor, 1);
}
break;
}
}