Buenas tardes a todos! No soy un gran sabio en todo este tema, pero de momento le estoy encontrando la motivación a este mundo!
Os comento el problema que tengo y aunque he estado buscando por la red información para solucionarlo, he sido incapaz de entender y aplicar, así que no me queda otra salida (a priori) que consultarlo públicamente.
Proyecto: Un sistema que me permita medir un flujo de agua depositado en un recipiente activando una electroválvula que permitirá el paso del el flujo del liquido haciéndolo pasar por el caudalímetro.
Lógica: Cuando el nivel de agua sea X, activar el relé de la electroválvula de 12v para permitir el paso del flujo por el caudalímetro calculando a su vez la cantidad de agua extraída.
Consulta/Problema: He ido incorporando partes del código según me he ido informando de los distintos elementos, con el objetivo de validar las distintas funciones por separado e incorporadas. El punto clave viene en la parte del código para la lectura de los valores del caudalímetro. En este caso, me ayude de la información del portal de Luis Llamas, y aunque su versión literal sobre el caudalímetro funciona de maravilla, al incorporarlo junto al mío llega un punto en que deja de correr.
Después de intentar seccionarlo, he llegado a la conclusión de que el problema proviene en la función de interrupción para el cálculo de L/min, atendiendo a que en esa parte del código se incorporan Interrupts y NoInterrupts.
Aquí es donde me detengo, ya que según he leído creo que entro en "bucle" con un IF de millis() para temporalizar la ejecución de todo el código. Es decir, que por una parte defino una variable como tiempo de espera, mientras que para la función del caudalímetro también se define una variable para el periodo de calculo de flujo.
He probado: tiempoespera < variablecaudalimetro, tiempoespera > variablecaudalimetro, tiempoespera = variablecaudalimetro, y sin poder subsanar el error de "bloqueo". Según he leído, las interrupciones bloquean también las actualizaciones de millis() con lo que, según todo lo que he podido ir probando el problema puede venir en la creación de un lapso de tiempo.
Os dejo el código con la voluntad de poder aclarar este punto del que no he pedido salir.
Agradeceré cualquier aportación que pueda liberarme de este punto sin retorno en el que estoy del mismo modo que de cualquier comentario, observación o aportación para futuros en cuanto a estructura, disposición, ...
gracias de antemano,
saludos!
// C++ code
//
const int Agua = A0;
const int Rele_bomba = 8;
const int Caudalimetro = 2;
byte estado=0;
//variable de tiempo
unsigned long tiempoanterior =0;
unsigned long tiempoahora;
int vt_espera =2400;
int i = 0; //CONTADOR
//VARIABLES HUMEDAD
int Humedad=0;
float vHumedad=0;
//*****************CAUDALIMETRO **************************
const int measureInterval = 2500;
volatile int pulseConter;
// YF-S201
const float factorK = 7.5;
// FS300A
//const float factorK = 5.5;
// FS400A
//const float factorK = 3.5;
float volume = 0;
long t0 = 0;
void ISRCountPulse()
{
pulseConter++;
}
float GetFrequency()
{
pulseConter = 0;
interrupts();
delay(measureInterval);
noInterrupts();
return (float)pulseConter * 1000 / measureInterval;
}
//***FIN *****************CAUDALIMETRO **************************
void setup()
{
Serial.begin(9600);
pinMode(Rele_bomba,OUTPUT);
pinMode(Caudalimetro,OUTPUT);
digitalWrite(Rele_bomba, LOW);
attachInterrupt(digitalPinToInterrupt(Caudalimetro), ISRCountPulse, RISING);
}
void loop()
{
float vAgua = analogRead(Agua);
Serial.println ("**************************************");
Serial.println (" NUEVA LECTURA ");
Serial.println ("**************************************");
Serial.print(" Estado= ");
Serial.print(estado);
Serial.print(" / Contador= ");
Serial.println(i);
Serial.print("Humedad =");
Serial.print(vAgua);
Serial.println("%");
if(vAgua >= 250)
{
switch (estado)
{
case 0:
Serial.println (" --> Iniciando....");
Serial.print(" e= ");
Serial.print(estado);
estado = 1;
break;
case 1:
digitalWrite(Rele_bomba, HIGH);
//********************CAUDALIMETRO **************************
// obtener frecuencia en Hz
float frequency = GetFrequency();
// calcular caudal L/min
float flow_Lmin = frequency / factorK;
Serial.print("Frecuencia: ");
Serial.print(frequency, 0);
Serial.print(" (Hz)\tCaudal: ");
Serial.print(flow_Lmin, 3);
Serial.println(" (L/min)");
//***FIN *****************CAUDALIMETRO **************************
estado = 2;
break;
case 2:
Serial.println (" --> Finalizado.");
Serial.print(" e= ");
Serial.print(estado);
i=i+1;
estado = 0;
break;
}
}
else
{
//Mensaje principal
Serial.println (" -->No se han alcanzado valores de nivel de agua");
digitalWrite(Rele_bomba, LOW);
i=i+1;
}
delay(9000);
}