Aaaa bien. Acá está el código completo
#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_de_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 Calentar_Recircular = false; // EN MACERADO
boolean INICIO_MACERADO = true;// EN Macerado
boolean INICIO_HERVIDO = true;// EN Hervido
boolean INICIO = 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 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_de_Macerado, OUTPUT);
pinMode(Rele_heladera_Frio, OUTPUT);
pinMode(Rele_heladera_Calor, OUTPUT);
digitalWrite(Rele_Resistencia_de_Macerado, 1);
digitalWrite(Rele_Bomba_de_Macerado, 1);
digitalWrite(Rele_heladera_Frio, 1);
digitalWrite(Rele_heladera_Calor, 1);
sensors.begin();
secuencia = 1;
entrada = 1;
}
void loop() {
TimeOut::handler();
char tecla = teclado.getKey ();
if (tecla == 'A') { // Inicio Cronómetro
teclaA_Cronometro = true;
}
if (tecla == 'B') { // Inicio Macerado
teclaB_Macerado = true;
Calentar_Recircular = true;
}
if (tecla == 'C') { // Inico Mash Out
teclaC_MashOut = true;
}
if (tecla == 'D') { // para agua de lavado buzzer 2
INICIO = false;
noTone (Buzzer_2);
digitalWrite (led1_Agua_Macerado_y_Lavado, LOW);
lcd.setCursor(9, 1);
lcd.print(" ");
}
/////////////////////////////////////////////////////
/// **************** BLOQUE 1 AGUA MACERADO*****************///
/////////////////////////////////////////////////////
if ( secuencia == 1 ) {
if ( entrada == 1 ) {
entrada = 2;
lcd.setCursor(0, 0);
lcd.print("1 -AGUA MACERADO- 2");
tiempoactual = 0;
segundos = 0;
minutos = 0;
hora = 0;
}
sensors.requestTemperatures();
sensors.setResolution(12);
Sensor_Agua = sensors.getTempCByIndex(0);
lcd.setCursor(16, 2);
lcd.print(Sensor_Agua, 1);
if ( Sensor_Agua <= 21) {
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, 150);
}
if (teclaA_Cronometro == true && (millis() >= tiempoactual + 1000) ) {
tiempoactual = millis();
segundos++;
if (segundos == 60) {
segundos = 0;
minutos ++;
}
if (minutos == 60) {
minutos = 0;
hora ++;
}
if (hora == 24) {
hora = 0;
}
lcd.setCursor(0, 2);
if (hora < 10)
{
lcd.print("0");
}
lcd.print(hora);
lcd.print(":");
lcd.setCursor(3, 2);
if (minutos < 10)
{
lcd.print("0");
}
lcd.print(minutos);
lcd.print(":");
lcd.setCursor(6, 2);
lcd.print (segundos);
if (segundos < 10)
{
lcd.print(" ");
}
}
//////////////////////////////////////////////////////////
// **************** BLOQUE 2 MACERADO PARTE 1 *****************/////
/////////////////////////////////////////////////////////
if ( tecla == '2') {
secuencia = 2;
entrada = 1;
teclaA_Cronometro = false; //tiene que estar acá
}
}
else if ( secuencia == 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;
}
sensors.requestTemperatures();
sensors.setResolution(12);
/////////Parte 1 A -- AGUA DE LAVADO///////
Sensor_Agua = sensors.getTempCByIndex(0);
lcd.setCursor(16, 1);
lcd.print(Sensor_Agua, 1);
if (INICIO == true) {
if (Sensor_Agua <= 21) {
lcd.setCursor( 9, 1);
lcd.print("CAL");
noTone (Buzzer_2);
}
else {
digitalWrite (led1_Agua_Macerado_y_Lavado, HIGH);
lcd.setCursor(9, 1);
lcd.print("OK ");
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
teclaB_Macerado = false;
}
//if (teclaB_Macerado == true || Calentar_Recircular == true) {
if (Calentar_Recircular == true) {
if (Sensor_Mosto <= 25) {
digitalWrite (led3_Calentado_Recirculado, HIGH);
digitalWrite(Rele_Resistencia_de_Macerado, LOW);
digitalWrite(Rele_Bomba_de_Macerado, LOW);
} else if (Sensor_Mosto >= 26) {
digitalWrite(led3_Calentado_Recirculado, LOW);
digitalWrite (Rele_Resistencia_de_Macerado, HIGH);
digitalWrite (Rele_Bomba_de_Macerado, HIGH);
}
//teclaB_Macerado = false;
}
if (teclaA_Cronometro == true && (millis() >= tiempoactual + 1000) ) {
tiempoactual = millis();
segundos++;
if (segundos == 60) {
segundos = 0;
minutos ++;
}
if (minutos == 60) {
minutos = 0;
hora ++;
}
if (hora == 24) {
hora = 0;
}
lcd.setCursor(12, 2);
if (hora < 10)
{
lcd.print("0");
}
lcd.print(hora);
lcd.print(":");
lcd.setCursor(15, 2);
if (minutos < 10)
{
lcd.print("0");
}
lcd.print(minutos);
lcd.print(":");
lcd.setCursor(18, 2);
lcd.print (segundos);
if (segundos < 10)
{
lcd.print(" ");
}
}
//////////////////////////////////////////////////////////
// **************** BLOQUE 3 MACERADO PARTE 2 *****************/////
/////////////////////////////////////////////////////////
if ( tecla == '3') {
secuencia = 3;
entrada = 1;
teclaA_Cronometro = false;
// Temp_Macerado_Parte_1.cancel();
// Temp_Macerado_Parte_2.timeOut(4000, n1_Macerado);
// teclaA_Cronometro = false;
// INICIO_MACERADO = true;
// digitalWrite(led4_Adiciones_Tardias, LOW);
// digitalWrite(led3_Calentado_Recirculado, LOW);
// digitalWrite (Rele_Resistencia_de_Macerado, HIGH);
// digitalWrite (Rele_Bomba_de_Macerado, HIGH);
// noTone(Buzzer_1);
// lcd.clear ();
}
}
else if ( secuencia == 3 ) { //
if ( entrada == 1 ) {
entrada = 2;
INICIO = false; //para cancelar INICIO en Parte 1 A -- AGUA DE LAVADO
Temp_Macerado_Parte_1.cancel();
//Temp_Macerado_Parte_2.timeOut(4000, n1_Macerado);
digitalWrite(led4_Adiciones_Tardias, LOW);
digitalWrite(led3_Calentado_Recirculado, LOW);
digitalWrite (Rele_Resistencia_de_Macerado, HIGH);
digitalWrite (Rele_Bomba_de_Macerado, HIGH);
noTone(Buzzer_1);
lcd.clear ();
lcd.setCursor(0, 0);
lcd.print("3 -AGUA DE LAVADO- 4");
lcd.setCursor(0, 2);
lcd.print("-MACERADO-");
}
sensors.requestTemperatures();
sensors.setResolution(12);
/////////AGUA DE LAVADO///////
Sensor_Agua = sensors.getTempCByIndex(0);
lcd.setCursor(16, 1);
lcd.print(Sensor_Agua, 1);
if (INICIO_MACERADO == true) {//// Se cancela con Tecla D
if (Sensor_Agua <= 22) {
lcd.setCursor( 9, 1);
lcd.print("CAL");
noTone (Buzzer_2);
}
else {
digitalWrite (led1_Agua_Macerado_y_Lavado, HIGH);
lcd.setCursor(9, 1);
lcd.print("OK ");
tone (Buzzer_2, 150);
}
}
// if (tecla == 'D') { // para agua de lavado buzzer 2
// INICIO_MACERADO = false;
// noTone (Buzzer_2);
// }
/////////CONTROL DE TEMPERATURA DEL MOSTO///////
Sensor_Mosto = sensors.getTempCByIndex(1);
lcd.setCursor(16, 3);
lcd.print(Sensor_Mosto, 1);
if (Sensor_Mosto <= 25) {
digitalWrite (led3_Calentado_Recirculado, HIGH);
digitalWrite(Rele_Resistencia_de_Macerado, LOW);
digitalWrite(Rele_Bomba_de_Macerado, LOW);
} else if (Sensor_Mosto >= 26) {
digitalWrite(led3_Calentado_Recirculado, LOW);
digitalWrite (Rele_Resistencia_de_Macerado, HIGH);
digitalWrite (Rele_Bomba_de_Macerado, HIGH);
}
//////////////////////////////////////////////////////////
// **************** BLOQUE 4 MASH OUT *****************/////
/////////////////////////////////////////////////////////
if ( tecla == '4') { // test
secuencia = 4;
entrada = 1;
}
}
else if ( secuencia == 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_de_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();
sensors.setResolution(12);
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_de_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_de_Macerado, HIGH);
}
}
//////////////////////////////////////////////////////////
// **************** BLOQUE 5 HERVIDO PARTE 1 *****************/////
/////////////////////////////////////////////////////////
if ( tecla == '5') { // test
secuencia = 5;
entrada = 1;
}
}
else if ( secuencia == 5 ) {
if ( entrada == 1 ) {
entrada = 2;
digitalWrite (Rele_Resistencia_de_Macerado, HIGH);
digitalWrite (Rele_Bomba_de_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");
}
sensors.requestTemperatures();
sensors.setResolution(12);
Sensor_Hervido = sensors.getTempCByIndex(2);
lcd.setCursor(16, 2);
lcd.print(Sensor_Hervido, 1);
if (INICIO_HERVIDO == true) {
if (Sensor_Hervido <= 25 ) {
lcd.setCursor( 9, 1);
lcd.print("CAL");
digitalWrite(led2_Hervido, LOW);
} else {
lcd.setCursor( 9, 1);
lcd.print( "HIR");
digitalWrite(led2_Hervido, HIGH);
Temp_Hervido_Parte_1.timeOut(10000, n4_Adiciones_Tardias_Hervido);// de 0 a 50 min
INICIO_HERVIDO = false;
}
}
//////////////////////////////////////////////////////////
// **************** BLOQUE 6 HERVIDO PARTE 2 *****************/////
/////////////////////////////////////////////////////////
if ( tecla == '6') {
secuencia = 6;
entrada = 1;
}
}
else if ( secuencia == 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, 1);
lcd.print( "HIR");
digitalWrite(led2_Hervido, HIGH);
Temp_Hervido_Parte_2.timeOut(10000, n3_Hirviendo);
}
sensors.requestTemperatures();
sensors.setResolution(12);
Sensor_Hervido = sensors.getTempCByIndex(2);
lcd.setCursor(16, 2);
lcd.print(Sensor_Hervido, 1);
//////////////////////////////////////////////////////////
// **************** BLOQUE 7 WHIRLPOOL *****************/////
/////////////////////////////////////////////////////////
if ( tecla == '7') {
secuencia = 7;
entrada = 1;
}
}
else if ( secuencia == 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");
}
sensors.requestTemperatures();
sensors.setResolution(12);
Sensor_Hervido = sensors.getTempCByIndex(2);
lcd.setCursor(16, 2);
lcd.print(Sensor_Hervido, 1);
//////////////////////////////////////////////////////////
// **************** BLOQUE 8 FERMENTACION PARTE 1 *****************/////
/////////////////////////////////////////////////////////
if ( tecla == '8') { // test volver a empezar
secuencia = 8;
entrada = 1;
}
}
else if ( secuencia == 8 ) { // fin
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();
sensors.setResolution(12);
Sensor_Fermentacion = sensors.getTempCByIndex(3);
lcd.setCursor(16, 3);
lcd.print(Sensor_Fermentacion, 1);
//////////////////////////////////////////////////////////
// **************** BLOQUE 9 FERMENTACION INICIO*****************/////
/////////////////////////////////////////////////////////
if ( tecla == '9') { // test volver a empezar
secuencia = 9;
entrada = 1;
}
}
else if ( secuencia == 9 ) { // fin
if ( entrada == 1 ) {
entrada = 2;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("9 -FERMENTACION- 2");
intervaloFermentacion.interval( 200000, Nuevo_dia);
}
sensors.requestTemperatures();
sensors.setResolution(12);
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);
}
// VER QUE HACER
//////////////////////////////////////////////////////////
// **************** BLOQUE 10 FIN*****************/////
/////////////////////////////////////////////////////////
if ( tecla == '2') { // test volver a empezar
secuencia = 1;
entrada = 1;
lcd.clear();
digitalWrite(Rele_heladera_Frio, 1);
digitalWrite(Rele_heladera_Calor, 1);
digitalWrite (led7_Heladera_Frio, 0);
digitalWrite (led8_Heladera_Calor, 0);
}
}
}
/////////////////////// void Adiciones Tardias Macerado ///////////////////
void n2_Adiciones_Tardias_Macerado() {
lcd.setCursor(0, 3);
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++;
}