Hola!
Soy nuevo en el foro, y relativamente nuevo en el mundo Arduino, aunque tengo muchisima experiencia en programación C.
Estoy realizando un pequeño desarrollo para mi empresa, con el objetivo de controlar automáticamente unas cargas de agua.
El proceso es simple, al pulsar un botón, abro una electroválvula con un relé, y utilizo un caudalímetro hall para controlar el flujo de agua. Al llegar a la cantidad de litros configurada, cierro la electrovalvula, y el proceso queda a la espera de que se vuelva a tocar el botón para repetir la carga.
Todo parecía funcionar bien hasta que realice la primer prueba con agua, y me di cuenta que no sensaba bien los litros. Revise el codigo y la ecuación para el calculo mil veces pero todo esta bien.
Decidí conectar nuevamente el Arduino a la compu y hacer un debug imprimiendo las variables en cada ciclo.
Alli descubri que recibia pulsos que hacian disparar una interrupción, aun cuando no estaba circulando agua por el caudalímetro, y pude verificar que esto dejaba de suceder si desconectaba la electroválvula.
Por lo que entiendo, la electroválvula genera ruido (no estoy seguro si por retorno en el relé o por inducción electromagnética). El relé es optoacoplado así que entiendo debería estar aisalando mi circuito de baja tensión correctamente del ruido de la alta tensión.
Comprobé también que solo al conectar el cable al pin 2 de mi arduino (es el pin que dispara la interrupción 0 que estoy usando), ya comienzo a recibir pulsos.
Alguien tiene algo de experiencia con estos problemas? Alguna recomendación?
Les copio el código:
// CONSTANTES
const int pinBoton = 7; // Pin del Boton
const int pinLedRojo = 9; // Pin del Led Rojo
const int pinLedAzul = 10; // Pin del Led Azul
const int pinLedVerde = 11; // Pin del Led Verde
const int pinRele = 12; // Pin del Rele
const int pinCaudalimetro = 2; // Pin del Caudalimetro
const int pinBotonStart = 13; // Pin del Boton
const double TOPE3L = 3; // Tope de señales para 3L
const double TOPE4L = 4; // Tope de señales para 4L
const int ROJO = 1;
const int AZUL = 2;
const int VERDE = 3;
// VARIABLES
int estadoLed = 1; // Led en Rojo
volatile int pulsos;
double caudalTope;
double litrosLeidos;
int estadoCaudalimetro;
int ultimoEstadoCaudalimetro;
int lectura; // Lectura boton
int estadoBoton; // Lectura del boton
int ultimoEstadoBoton = HIGH; // Lectura anterior del boton
long ultimoRebote = 0; // Ultima vez que se presiono el boton
long delayRebote = 5; // Tiempo de rebote
int lecturaSt; // Lectura boton
int estadoBotonSt; // Lectura del boton
int ultimoEstadoBotonSt = HIGH; // Lectura anterior del boton
long ultimoReboteSt = 0; // Ultima vez que se presiono el boton
long delayReboteSt = 5; // Tiempo de rebote
void setup() {
pinMode(pinBoton, INPUT);
pinMode(pinBotonStart, INPUT);
pinMode(pinLedRojo, OUTPUT);
pinMode(pinLedAzul, OUTPUT);
pinMode(pinLedVerde, OUTPUT);
pinMode(pinRele, OUTPUT);
pinMode(pinCaudalimetro, INPUT);
digitalWrite(pinLedRojo, HIGH);
digitalWrite(pinLedAzul, LOW);
digitalWrite(pinLedVerde, LOW);
caudalTope = TOPE3L;
attachInterrupt(0, leoPulsos, RISING); //Vinculo la interrupcion 0 a la funcion leoPulsos
Serial.begin(9600);
}
void leoPulsos () { // Esta funcion agrega un pulso cuando se detecta una interrupcion
pulsos++;
}
boolean debounce(boolean last, int pin) { // Función antirebote
boolean current = digitalRead(pin);
if (last != current) {
delay(5);
current = digitalRead(pin);
}
return current;
}
void loop() {
int lectura = digitalRead(pinBoton);
if (lectura != ultimoEstadoBoton) {
ultimoRebote = millis();
}
if ((millis() - ultimoRebote) > delayRebote) {
if (lectura != estadoBoton) {
estadoBoton = lectura;
if (estadoBoton == LOW) {
switch (estadoLed) {
case ROJO:
digitalWrite(pinLedRojo, LOW);
digitalWrite(pinLedAzul, HIGH);
caudalTope = TOPE4L;
estadoLed = AZUL;
break;
case AZUL:
digitalWrite(pinLedAzul, LOW);
digitalWrite(pinLedRojo, HIGH);
caudalTope = TOPE3L;
estadoLed = ROJO;
break;
}
}
}
}
int lecturaSt = digitalRead(pinBotonStart);
if (lecturaSt != ultimoEstadoBotonSt) {
ultimoReboteSt = millis();
}
if ((millis() - ultimoReboteSt) > delayReboteSt) {
if (lecturaSt != estadoBotonSt) {
estadoBotonSt = lecturaSt;
if (estadoBotonSt == LOW) {
// ABRO ELECTROVALVULA
digitalWrite(pinRele, HIGH);
// SETEO EL LED EN VERDE - CARGA EN PROCESO
digitalWrite(pinLedAzul, LOW);
digitalWrite(pinLedRojo, LOW);
digitalWrite(pinLedVerde, HIGH);
pulsos = 0;
litrosLeidos = 0;
// CONTROLO LA CARGA
while (litrosLeidos < caudalTope) {
sei();
delay(1000); // Espero un segundo
cli();
litrosLeidos = litrosLeidos + ((pulsos / 5.5) / 60); // (Pulsos en un segundo) / 5.5Q, = tasa de flujo en LxM luego divido por 60 para saber cuantos litros pasaron en un segundo
Serial.print (litrosLeidos, DEC);
Serial.print (" L/seg\r\n");
}
// CIERRO LA ELECTROVALVULA
digitalWrite(pinRele, LOW);
// APAGO EL LED VERDE
digitalWrite(pinLedVerde, LOW);
// SETEO EL LED EN EL ESTADO ANTERIOR
if (estadoLed == ROJO) {
digitalWrite(pinLedRojo, HIGH);
} else {
digitalWrite(pinLedAzul, HIGH);
}
}
}
}
ultimoEstadoBoton = lectura;
ultimoEstadoBotonSt = lecturaSt;
}
