Buenas tardes, les quiero consultar lo siguiente: Tengo una dificultad con el llamado al timeOut que lo pueden encontrar en ////// PARTE B////// if (teclaB==true) y mas abajo Temporizador_2.timeOut (40000, n1_Macerado);
Lo que sucede es que después de un tiempo, el código/la placa entra como en un cortocircuito/desborde (no se como llamarlo). Y creo que es porque está puesto de una manera que la función es llamada todo el tiempo. entonces la pregunta sería, ¿cómo tendría que hacer para que la función si ya fue llamada no lo haga devuelta?
Gracias por su tiempo.
#include <LiquidCrystal.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Keypad.h>
#include <TimeOut.h>
#define BuzzerPin 10
#define ONE_WIRE_BUS 9
#define Rele_Resistencia_de_Macerado 32
#define Rele_Bomba_de_Macerado 34
#define Rele_heladera_Frio 33
#define Rele_heladera_Calor 35
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 Buzzer_SONAR = 30;
const int led1_Agua_Macerado_y_Lavado = 40;
const int led2_Macerado = 42;
const int led3_Recirculado = 41;
const int led4_Adiciones_Tardias = 43;
const int led5_Hervido = 44;
const int led6_OK = 45;
const int led7_Heladera_Frio = 46;
const int led8_Heladera_Calor = 47;
const int led9_Mash_Out = 48;
TimeOut Temporizador_1; // Adiciones tardías Macerado 45 min
TimeOut Temporizador_2; // Macerado 60 min
TimeOut Temporizador_3; // Mash Out
TimeOut Temporizador_4; // Adiciones tardías Hervido 45 min
TimeOut Temporizador_5; // Hervido
TimeOut Temporizador_6;
void n1_Macerado();
void n2_Adiciones_Tardias_Macerado();
void n3_Hirviendo();
void n4_Adiciones_Tardias_Hervido();
void n5_Whirpool();
void n6_Mash_Out();
boolean buzzer_habilitado = false;
boolean teclaB = false;
boolean teclaC = false;
boolean tecla9 = false;
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);
void setup() {
lcd.begin( 20, 4);
lcd.setCursor(7, 1);
lcd.print("ANVER");
delay (2000);
lcd.clear();
pinMode(led1_Agua_Macerado_y_Lavado , OUTPUT);
pinMode(led3_Recirculado , OUTPUT);
pinMode(led2_Macerado , OUTPUT);
pinMode(led4_Adiciones_Tardias , OUTPUT);
pinMode(led5_Hervido , OUTPUT);
pinMode(led6_OK , OUTPUT);
pinMode(led7_Heladera_Frio , OUTPUT);
pinMode(led8_Heladera_Calor , OUTPUT);
pinMode(led9_Mash_Out, OUTPUT);
pinMode(BuzzerPin, OUTPUT);
pinMode(Buzzer_SONAR, INPUT_PULLUP);
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, HIGH);
digitalWrite(Rele_Bomba_de_Macerado, HIGH);
digitalWrite(Rele_heladera_Frio, HIGH);
digitalWrite(Rele_heladera_Calor, HIGH);
sensors.begin();
secuencia = 1;
entrada = 1;
}
void loop() {
TimeOut::handler();
char tecla = teclado.getKey ();
if (tecla == 'B') {
teclaB = true;
}
if (tecla == 'C') {
teclaC = true;
}
if (tecla == '9') {
tecla9 = true;
}
boolean sensorVal = digitalRead( Buzzer_SONAR);
/////////////////////////////////////////////////////
/// **************** BLOQUE 1 AGUA *****************///
/////////////////////////////////////////////////////
if ( secuencia == 1 ) {
if ( entrada == 1 ) {
entrada = 2;
sensors.requestTemperatures();
Sensor_Agua = sensors.getTempCByIndex(0);
lcd.setCursor(3, 0);
lcd.print("-AGUA MACERADO-");
lcd.setCursor(15, 1);
lcd.print(Sensor_Agua);
//// CONDICION: AGUA DE MACERADO ES A 75°////
if ( Sensor_Agua < 30) {
lcd.setCursor( 9, 3);
lcd.print("CAL");
digitalWrite (led1_Agua_Macerado_y_Lavado, LOW);
}
else if ( Sensor_Agua > 31 ) {
digitalWrite (led1_Agua_Macerado_y_Lavado, HIGH);
lcd.setCursor(9, 3);
lcd.print("OK ");
}
}
//////////////////////////////////////////////////////////
// **************** BLOQUE 2 MACERADO *****************/////
/////////////////////////////////////////////////////////
if ( tecla == '2') {
secuencia = 2;
entrada = 1;
digitalWrite (led1_Agua_Macerado_y_Lavado, LOW);
lcd.clear();
}
}
else if ( secuencia == 2 ) {
if ( entrada == 1 ) {
entrada = 2;
}
sensors.requestTemperatures();
/////// PARTE A //////////
lcd.setCursor(2, 0);
lcd.print("-AGUA DE LAVADO-");
Sensor_Agua = sensors.getTempCByIndex(0);
lcd.setCursor(15, 1);
lcd.print(Sensor_Agua);
if ( Sensor_Agua <= 29) {
lcd.setCursor( 9, 1);
lcd.print("CAL");
digitalWrite (led1_Agua_Macerado_y_Lavado, LOW);
}
else {
digitalWrite (led1_Agua_Macerado_y_Lavado, HIGH);
lcd.setCursor(9, 1);
lcd.print("OK ");
}
/////// PARTE B //////////
lcd.setCursor(5, 2);
lcd.print("-MACERADO-");
Sensor_Mosto = sensors.getTempCByIndex(1);
lcd.setCursor(15, 3);
lcd.print(Sensor_Mosto);
if (teclaB == true) {
lcd.setCursor(15, 3);
lcd.print(Sensor_Mosto);
lcd.setCursor(9, 3);
lcd.print("ON ");
digitalWrite(led2_Macerado, HIGH);
Temporizador_2.timeOut(40000, n1_Macerado);
Temporizador_1.timeOut(10000, n2_Adiciones_Tardias_Macerado);// son 45 min
if (Sensor_Mosto < 29) {
lcd.setCursor(0, 3);
lcd.print ("CAL");
digitalWrite(led3_Recirculado, HIGH);
//digitalWrite(Rele_Resistencia_de_Macerado, LOW);
//digitalWrite(Rele_Bomba_de_Macerado, LOW);
}
else {
lcd.setCursor(0, 3);
lcd.print ("OK ");
digitalWrite(led3_Recirculado, LOW);
// digitalWrite (Rele_Resistencia_de_Macerado, HIGH);
// digitalWrite (Rele_Bomba_de_Macerado, HIGH);
}
}
//////////////////////////////////////////////////////////
// **************** BLOQUE 4 MASH OUT *****************/////
/////////////////////////////////////////////////////////
if ( tecla == '3') {
// Temporizador_1.cancel();
// Temporizador_2.cancel();
// digitalWrite(led4_Adiciones_Tardias, LOW);
lcd.clear();
secuencia = 3;
entrada = 1;
}
}
else if ( secuencia == 3 ) { //
if ( entrada == 1 ) {
entrada = 2;
}
sensors.requestTemperatures();
Sensor_Mosto = sensors.getTempCByIndex(1);
lcd.setCursor(15, 1);
lcd.print(Sensor_Mosto);
lcd.setCursor(6, 0);
lcd.print ("Mash Out");
if (teclaC == true) {
//digitalWrite (led9_Mash_Out, HIGH);
lcd.setCursor( 9, 3);
lcd.print("ON");
if (Sensor_Mosto < 29) {
lcd.setCursor( 0, 1);
lcd.print("CAL");
digitalWrite(led3_Recirculado, HIGH);
// digitalWrite(Rele_Resistencia_de_Macerado, LOW);
// digitalWrite(Rele_Bomba_de_Macerado, LOW);
}
else {
lcd.setCursor(0, 1);
lcd.print(" ");
digitalWrite (led9_Mash_Out, HIGH);
digitalWrite(led3_Recirculado, LOW);
// digitalWrite (Rele_Resistencia_de_Macerado, HIGH);
// digitalWrite (Rele_Bomba_de_Macerado, HIGH);
Temporizador_3.timeOut (6000, n6_Mash_Out);
}
}
//////////////////////////////////////////////////////////
// **************** BLOQUE 4 HERVIDO *****************/////
/////////////////////////////////////////////////////////
if ( tecla == '4') {
Temporizador_3.cancel();
lcd.clear();
secuencia = 4;
entrada = 1;
}
}
else if ( secuencia == 4 ) { //
if ( entrada == 1 ) {
entrada = 2;
}
sensors.requestTemperatures();
Sensor_Hervido = sensors.getTempCByIndex(2);
lcd.setCursor(6, 0);
lcd.print("-HERVIDO-");
lcd.setCursor(15, 1);
lcd.print(Sensor_Hervido);
if (Sensor_Hervido < 29 ) {
lcd.setCursor( 9, 2);
lcd.print("CAL");
digitalWrite(led5_Hervido, LOW);
} else {
lcd.setCursor( 9, 2);
lcd.print( "HIR");
digitalWrite(led5_Hervido, HIGH);
// Temporizador_4.timeOut(5000, n4_Adiciones_Tardias_Hervido);// de 0 a 50 min
// Temporizador_5.timeOut (10000, n3_Hirviendo);// de 0 a 60 min
}
if ( tecla == '5') {
// digitalWrite(led4_Adiciones_Tardias, LOW);
digitalWrite(led5_Hervido, LOW);
// Temporizador_4.cancel();
// Temporizador_5.cancel();
lcd.clear();// test
secuencia = 5;
entrada = 1;
}
}
//////////////////////////////////////////////////////////
// **************** BLOQUE 5 FERMENTACION *****************/////
/////////////////////////////////////////////////////////
else if ( secuencia == 5 ) { // secuencia == 5 fermentacion
if ( entrada == 1 ) {
entrada = 2;
}
sensors.requestTemperatures();
Sensor_Fermentacion = sensors.getTempCByIndex(3);
lcd.setCursor(3, 0);
lcd.print("-FERMENTACION-");
lcd.setCursor(15, 1);
lcd.print(Sensor_Fermentacion);
if ( tecla == '6') {
lcd.clear();// test
secuencia = 6;
entrada = 1;
}
}
else if ( secuencia == 6 ) { // fin
if ( entrada == 1 ) {
entrada = 2;
lcd.setCursor(3, 0);
lcd.print("-FINALIZADO-");
// una sola vez
}
// ver que hacer...
if ( tecla == '2') { //Acá para volver a empezar
secuencia = 1;
entrada = 1;
}
}
}
///////////////// void MACERADO ///////////////////////
void n1_Macerado() {
lcd.setCursor(9, 3);
lcd.print ("OFF");
digitalWrite(led2_Macerado, LOW);
// if ( buzzer_habilitado )
// tone(BuzzerPin, 500);
}
/////////////////////// void Adiciones Tardias Macerado ///////////////////
void n2_Adiciones_Tardias_Macerado() {
lcd.setCursor(0, 3);
digitalWrite(led4_Adiciones_Tardias, HIGH);
lcd.print ("Ad Tard");
if (tecla9 == true) {
digitalWrite(led4_Adiciones_Tardias, LOW);
Temporizador_1.cancel();
}
// if ( buzzer_habilitado )
// tone(BuzzerPin, 500);
}
//////////////////////// void Hervido ///////////////////////////
void n3_Hirviendo() {
// lcd.setCursor(5, 3);
// lcd.print ("Hirviendo");
digitalWrite(led5_Hervido, LOW);
// if ( buzzer_habilitado )
// tone(BuzzerPin, 500);
}
/////////////////////// void Adiciones Tardias Hervido //////////////
void n4_Adiciones_Tardias_Hervido() {
lcd.setCursor(0, 1);
lcd.print ("Adiciones");
digitalWrite(led4_Adiciones_Tardias, HIGH);
// if ( buzzer_habilitado )
// tone(BuzzerPin, 500);
}
////////////////////// void Mash Out //////////////////////////////
void n6_Mash_Out() {
lcd.setCursor(9, 3);
lcd.print ("FIN");
digitalWrite (led9_Mash_Out, LOW);
// if ( buzzer_habilitado )
// tone(BuzzerPin, 500);
}