Buenas noches amigos. Llevo unos días ideando un programa para dosificar producto químico en un depósito de mezcla y me he quedado atascado.
Agradecería que alguien me diera un empujoncito en el tema.
Os explico y adjunto el programa.
--- Funcionamiento del programa ----
En primer lugar, tenemos un caudalímetro, una tolva de sinfín para dosificar químicos y un depósito para realizar el mezclado con agua.
La alimentación de agua al depósito es manual mediante una llave.
Cada vez que pasa un litro de agua por el caudalímetro, la tolva dosifica una cantidad predeterminada de químico en el depósito.
Sabemos que para dosificar 5 gramos/litro de agua, la tolva debe estar funcionando 1´3 segundos.
Al tener bastante caudal de llenado, necesitamos que ese tiempo que estará la tolva dosificando por cada litro, se vaya acumulando en una variable, que es la que iremos comparando con cero, para saber cuando tiene que parar o accionarse de nuevo la tolva según vaya llenando el depósito.
Tengo en el programa una variable que se me desborda cuando llega a cero, que es timeacumulado y creo que tiene que ver con cómo estoy midiendo los tiempos o bien que me falta poner alguna variable a cero al entrar o salir del bucle, pero no doy con ello por más que lo miro.
Si alguien me pudiera orientar un poco con el tema, os lo agradecería, porque debe ser algo no demasiado complicado para alguien con experiencia en programación.
Os dejo aquí el programa, gracias de antemano
//****************************************************************************
// * PROGRAMA DE DOSIFICACIÓN DE DETERGENTE EN POLVO MEDIANTE SINFÍN *
//****************************************************************************
//DEFINICIÓN DE VARIABLES PARA PINES DE ENTRADA/SALIDA
const int caudalimetro = 2; //Caudalimetro conectado a D2 (lectura mediante interrupciones)
const int motor = 3; //Motor tolva en D3
//DEFINICIÓN DE VARIABLES
int pulsos; //Pulsos contados por el caudalímetro
int pulsosXlitro = 27; //Pulsos que genera el caudalimetro por cada litro que ha pasado por él
unsigned long timePredetMotor = 1300; //Tiempo predeterminado en milisegundos para dosificación de 5 gramos/litro
unsigned long timeTotal; //Tiempo total de dosificación (predeterminado+ajustable)
unsigned long timeAcumulado; //Acumulador de tiempo de funcionamiento del motor.
unsigned long inicialMillis = 0; //Variable para calcular tiempos
unsigned long ttranscurrido = 0; //Variable para calcular tiempos
//****************************************************************************
//****************************************************************************
void setup() {
Serial.begin(9600);
pinMode (caudalimetro, INPUT_PULLUP); //Caudalimetro como entrada
pinMode (motor, OUTPUT); //Motor como salida
attachInterrupt(0, leePulsosISR, RISING); //Configuro la interrupción 0 (pin D2) por flanco ascendente
}
//****************************************************************************
//****************************************************************************
void loop() {
//Aqui contamos cada litro que pasa por el caudalímetro.
if (pulsos>=pulsosXlitro){ //si pulsos>=27,.....hemos contado 1 litro en caudalimetro.
timeAcumulado = timeAcumulado + timePredetMotor;
pulsos = 0; //Pulsos = 0, para que empiece otra vez a contar desde 0 hasta 27 y poder contar otro litro.
inicialMillis = millis();
}
//Mientras tiempo acumulado es >0, motorON, sino, motorOFF
while (timeAcumulado>0){ //Si hay tiempo en acumulador.... voy comparando con ttranscurrido, para encender o apagar el motor
ttranscurrido = millis()-inicialMillis; //Voy calculando el tiempo transcurrido entre inicial y actual
timeAcumulado = timeAcumulado-ttranscurrido; //
digitalWrite(motor, HIGH); //Enciendo motor
}
digitalWrite(motor, LOW); //Apago motor
}
//****************************************************************************
//****************************************************************************
//CONTAMOS LOS PULSOS MEDIANTE INTERRUPCIONES
void leePulsosISR(){ //A cada pulso del caudalímetro, sumo 1 a la variable pulsos.
pulsos++;
}