Necesito leer los pulsos de un contador de agua y en función de estos activar 3 bombas dosificadoras de aditivos durante un tiempo determinado para cada una.
Según he leído lo mejor es utilizar interrupciones para que no perder los pulsos.
He intentado con diferentes formas de temporizar si se cumplen un determinado nº de pulsos, y la rutina funciona correctamente, pero si recibo un pulso en mitad de la rutina deja de funcionar...
Este es el código. Un saludo y gracias..
//--------------------------------------------------
//Declara puertos de entradas y salidas y variables
//--------------------------------------------------
// Botones
const int BTN1 = 18;
const int BTN2 = 19;
const int BTN3 = 20;
const int ledverde = 53; //Le ponemos nombre al pin 13
const int ledrojo = 49; //Le ponemos nombre al pin 13
const int ledamarillo = 51; //Le ponemos nombre al pin 13
const int POT = 2;
volatile long lastInt; // Tiempo en que se realizo la última interrupción.
int contador = 0; //Variable para guardar la cuenta de pulsaciones
int valorPOT = 0;
//int estadoAnteriorBoton = 0; //Declaramos e inicializamos la variable
//int valorBoton = 0; //Declaramos e inicializamos la variable
//------------------------------------
//Funcion principal
//------------------------------------
void setup() // Se ejecuta cada vez que el Arduino se inicia
{
Serial.begin(9600); //Inicia comunicación serie
pinMode(ledverde,OUTPUT); //Configura el pin como una salida, LED
pinMode(ledrojo,OUTPUT); //Configura el pin como una salida, LED
lastInt = 0;
// Asociamos la interrupción a nuestro código
attachInterrupt(5,int5,RISING); // línea 18
attachInterrupt(4,int4,RISING); // línea 19
//attachInterrupt(3,int3,RISING); // línea 20
}
// Incrementa y escribe el número al display
void increment() {
contador++; //Aumentamos en una unidad la cuenta
Serial.print("Contador=");Serial.println(contador); //Imprime el valor por consola
digitalWrite(ledverde,HIGH); //Encendemos el led
delay (10000);
digitalWrite(ledverde,LOW); //Encendemos el led}
//valorPOT = analogRead(POT)*10;
//Serial.print("// ValorPOT=");Serial.println(valorPOT); //Imprime el valor por consola
//if(contador>5){contador=0;} //Aumentamos en una unidad la cuenta
}
// Decrementa y escribe el número al display
void decrement() {
contador--; //Aumentamos en una unidad la cuenta
Serial.print("Contador="); Serial.println(contador); //Imprime el valor por consola
digitalWrite(ledrojo,HIGH); //Encendemos el led}
delay (10000);
digitalWrite(ledrojo,LOW); //Encendemos el led}
}
void int5() {
if((millis()-lastInt)>400) {
increment();
lastInt = millis();
}
}
void int4() {
if((millis()-lastInt)>400) {
decrement();
lastInt = millis();
}
}
// Loop vacío
void loop() {
if(contador==5){
valorPOT = analogRead(POT)*10;
//Serial.print("ValorPOT=");Serial.println(valorPOT); //Imprime el valor por consola
digitalWrite(ledrojo, HIGH); // enciende el pin 13
Serial.println((millis()-lastInt));
if((millis()-lastInt)>valorPOT) {
digitalWrite(ledrojo, LOW); // apaga el pin 13
Serial.print("ContadorReset=");
contador=0; //Aumentamos en una unidad la cuenta
Serial.println(contador); //Imprime el valor por consola
}
}
}