Hola a todos, muchas gracias por la información que recibi de todos ustedes en post anterior. Esta vez algo raro esta pasando y me pregunto si tiene que ver con que me haya brincado algun truquito, o en que realidad soy muy malo programando =)
Bueno, larga historia corta, uso el arduino para controlar los ventiladores dentro de una camara de refrigeración. Esta dentro de mi tablero, como pueden ver. Tiene su fuente y sus relevadores.
La cosa es que asi de repente parece que se quedara "pegado".
Me explico; la subrutina void refrigeracion(); depende exclusivamente de que la variable termostato, este en HIGH... y le he visto con mis propios ojos... le medi 4.46V... por lo que debio entrar la subrutina.... me llamo la atencion, conecte mi celular, para ver que tiraba el serial (gracias Android)... y nada... nada de nada... sin mover ningun dato, oprimí el rest del arduino y voila... todo funciono normal.
Detalle extra... estuvo funcionando sin problemas por una semana.... despues comenzo a tirarse al rededor de las 5pm... tres dias consecutivos, en los que tuvo que ser reiniciado manualmente, y ahora por lo que me dicen... dura unas tres horas de operacion efectiva.
Ideas?
Quizas alguna variable?
Quizas el loop encuentra en una fraccion de segundo que no se cumplen
ninguna de las condiciones logicas?
Y como evitarlo??
Les dejo el código tal cual esta...
//TODAS LAS SALIDAS ESTAN INVERIDAS PARA PODER OPERAR LA TABLILLA DE RELAYS
//EJEMPLO, SI NECESITO ENCENDER UN FOCO EN LUGAR DE
// digitalWrite(focoDes, HIGH);
//ESCRIBIMOS;
//digitalWrite(focoDes, LOW);
//DEBIDO A COMO OPERAN LOS RELEVADORES.
// DECLARACION DE PINES A SER USADOS EN EL PROGRAMA
int comp =13; // Pin para control del compresor
int sol = 12; // pin para el control de la solenoide
int motores[4] = {8,9,10,11}; //Pines controlar motores del difusor
int focoRef= 6 ; //Pin para encender el foco de la refrigeracion
int focoDes= 5 ; //Pin para encender el foco deshielo
int Term = 4; //Pin para leer el estado del termostato
int SW2 = 3; //pin para leer el switch principal
int SW1 = 2; //pin para leer el switch principal
//DECLARACION DE VARIABLES GLOBALES
int Switch = 0; //variable para almacenar el estado del switch
int EdoSW1 = 0;
int EdoSW2 = 0;
int EdoTerm = 0; //para alamcenear el estado del termostato
int caso = 1; //variable de 1 a 4 para alternar los motores difussor
boolean Encendido = false; //Variable para comparar si se ha encendio o apagado el termostato
// fila / columna
int ArrayMotores[6][4] ={{HIGH, HIGH, HIGH, HIGH } , //Primer arreglo de encendio de motores
{LOW, HIGH, HIGH, HIGH } ,// Segundo... cada 1 y 0 corresponden a un motor
{HIGH, LOW , HIGH, HIGH } , //encendido o apagado.
{HIGH, HIGH, LOW , HIGH } ,
{HIGH, HIGH, HIGH, LOW } ,
{LOW, LOW, LOW, LOW } ,
};
void setup(){
Serial.begin(9600);
pinMode(comp, OUTPUT);
pinMode(sol, OUTPUT);
pinMode(focoRef, OUTPUT);
pinMode(focoDes, OUTPUT);
pinMode(Term, INPUT);
pinMode(SW1, INPUT);
pinMode(SW2, INPUT);
for(int b; b<4; b++){ //inicia contador de 1 a 4
pinMode(motores[b], OUTPUT); //declara cada motor como pin de salida
digitalWrite(motores[b], HIGH); //Apaga cada motor
}
}
void loop(){
EdoSW1 = digitalRead(SW1);
EdoSW2 = digitalRead(SW2);
if(EdoSW1 ==1 && EdoSW2 ==0){
Switch=1;
}
if(EdoSW1 ==0 && EdoSW2 ==1){
Switch=2;
}
if(EdoSW1 ==0 && EdoSW2 ==0){
Switch =0;
}
switch(Switch){
case 0:
Serial.println("El switch esta apagado");
delay(200); //remover en la verson final
digitalWrite(focoRef, HIGH);
digitalWrite(focoDes, HIGH);
AllOff();
break;
case 1:
Serial.println("El switch esta en refrigeracion");
delay(200); //remover en la version final
digitalWrite(focoRef, HIGH);
digitalWrite(focoDes, LOW);
refrigeracion();
break;
case 2:
Serial.println("El switch esta en deshielo");
delay(200);// remover en la version final
digitalWrite(focoRef, LOW);
digitalWrite(focoDes, HIGH);
deshielo();
break;
}
delay(250);
}
// subrutina de deshielo, deja encendido solo los motores del evaporador.
void deshielo(){
digitalWrite(sol,LOW); //enciende la solenoide
delay(1000); //remover en version final);
digitalWrite(comp, HIGH); //apaga el compresor
delay(1000); //remover en version final
for(int a; a<4 ; a++){
digitalWrite(motores[a], ArrayMotores[5][a]);
delay(1000);
}
}
// subrutina para apagar todo; compresor, solenoide, evaporador.
void AllOff(){
digitalWrite(sol,HIGH); //Apaga la solenoide
delay(500); //remover en version final);
digitalWrite(comp, HIGH); //apaga el compresor
delay(200); //remover en version final
for(int u; u<4; u++){
digitalWrite(motores[u], ArrayMotores[0][u]);
}
}
//subrutina que encendera la refrigeracion y alternara los motores del
//difusor.
void refrigeracion(){
EdoTerm = digitalRead(Term);
if(caso >= 5){
caso=1;}
if(EdoTerm == HIGH){
digitalWrite(sol, HIGH); //Apaga la solenoide, deja pasar liquido
for(int d; d<4; d++){
digitalWrite(motores[d], ArrayMotores[5][d]);
delay(1000);
}
delay(1000); //retraso en la entrada del compresor
digitalWrite(comp, LOW); //enciende el compresor
Serial.print("El termostato esta encendido "); Serial.println(caso);
Encendido = true;
}
if(EdoTerm == LOW){
if(Encendido == true){
caso++;}
Serial.print("El termostato esta apagado ");
Serial.print("comienza subrutina"); Serial.println(caso);
digitalWrite(sol, LOW); //Enciende solenoide, no pasa liquido
delay(1000); //retraso en la entrada del compresor
digitalWrite(comp, HIGH); //Apaga el compresor
for(int e; e<4; e++){
digitalWrite(motores[e], ArrayMotores[caso][e]);
}
Encendido = false;
}
}
Y algunas fotillos para que vean a que nos enfrentamos, en ellas esta el diagrama, combina los 5v del arduino con controles 220V etc etc..
Si lo requieren hago un video explicativo de que funciones realiza el pequeño aparato, aunque creo que esto es mas centrado en el codigo.. :![]()
Muchas gracias de antemano!!!!







