Muy buenas tardes a todos.
Estoy con un proyecto que creía bastante simple, pero ha llegado un punto en el que ya no sé qué es lo que estoy haciendo mal.
En una máquina que tenemos en fábrica queremos detectar cuando unas piezas son demasiado largas al ser alimentadas de forma automática en un proceso.
Para ello la idea era poner una chapìta abatible a cierta altura y que, cuando pasase una pieza que hiciera contacto con la chapita, durante x segundos un relé activase una electroválvula para expulsar esa pieza defectuosa.
Eso lo tengo hecho, pero me encuentro con que, si durante esos 5 segundos en los que la electroválvula está soplando, llega otra pieza larga y toca la chapita, el tiempo que el soplido está activo no vuelve a 5 segundos, si no que acaba su cuenta atrás y listo.
Me estuve informando sobre las pausas sin delay y pensaba que lo tendría listo con este sketch, pero algo hago mal:
#include <SoftwareSerial.h>
unsigned long acumulado = 0; // Variable que incremetará su valor si las piezas cierran el contacto
const int sensor1 = 13; // Pin al que va conectado uno de los cables que harán de contacto
const int sensor2 = 11; // Pin al que va conectado el otro de los cables que hará de contacto
const int rele = 7; // Pin al que irá el relé (Mosfet) que activará el soplido
unsigned long ahora = 0; // Variable que contendrá el valor del tiempo que hace que tocó la pieza
unsigned long gap = 0;
unsigned long diff = 0;
int valor = 0; // Variable que nos dará el estado del contacto entre los dos pines
void setup() {
pinMode(sensor1, OUTPUT); // Declaramos que el pin del sensor 1, será solo de salida.
pinMode(sensor2, INPUT); // Declaramos que el pin del sensor 2, será solo de entrada.
digitalWrite(sensor2, HIGH); // Activamos el internal pull up del pin del sensor
pinMode(rele, OUTPUT);
digitalWrite(rele, HIGH); // Conectamos un segundo el soplido poniendo el relé en HIGH para saber que todo va ok al encender
delay(1000);
digitalWrite(rele, LOW); // Conectamos un segundo el soplido poniendo el relé en HIGH para saber que todo va ok al encender
Serial.begin(9600); // Durante la ejecución del programa en la aplicación real no será necesario el serial, para pruebas, sí
}
// Esta es la parte del código que se va a ir ejecutando sin parar a modo de loop
void loop() {
valor = digitalRead(sensor2);
if (valor > 0) { // Si no hay ningún contacto, declaramos que el valor acumulado de contactos es 0;
acumulado = 0;
}
if (valor < 1) {
acumulado = acumulado + 1; // Si sí que lo hay, aumentamos el valor de contacto en 1
}
if (acumulado > 2500) { // Si el valor de contactos seguidos es mayor que 2500 (así evito falsos positivos)...
ahora = millis(); // a la variable ahora le asigno el valor de millis
gap = ahora + 5000; // y a la variable gap el valor de ahora + 5000 ms
Serial.println("Contacto"); // en la aplicación real no será necesario el puerto de serie
}
if (millis() < gap) { // Esta es la función que uso para soplar durante 5 segundos
diff = gap - millis();
digitalWrite(rele, HIGH);
Serial.print("Soplamos (Queda por soplar ");
Serial.print(diff);
Serial.println(" ms)");
}
else
{
digitalWrite(rele, LOW); // Esta parte del código necesitaré mejorarla para que no la ejecute cuando el pin ya esté en LOW,
// Pero es que actualmente ni así funciona :(
}
}
Cuando hago contacto entre los dos pines que uso a modo de sensor, si no dejo de hacer contacto, lo que recibo por el puerto de serie se asemeja mucho a lo que quiero:
Una cuenta atrás que se resetea constantemente
Contacto
Soplamos (Queda por soplar 5000 ms)
Contacto
Soplamos (Queda por soplar 5000 ms)
Contacto
Soplamos (Queda por soplar 4990 ms)
Contacto
Soplamos (Queda por soplar 4990 ms)
Contacto
Soplamos (Queda por soplar 4989 ms)
Contacto
Soplamos (Queda por soplar 4989 ms)
Contacto
Soplamos (Queda por soplar 4990 ms)
Contacto
Soplamos (Queda por soplar 4990 ms)
Contacto
Soplamos (Queda por soplar 4990 ms)
Contacto
Soplamos (Queda por soplar 4989 ms)
Contacto
Soplamos (Queda por soplar 4990 ms)
Contacto
Soplamos (Queda por soplar 4989 ms)
Contacto
Soplamos (Queda por soplar 4989 ms)
Contacto
Soplamos (Queda por soplar 4989 ms)
Contacto
Soplamos (Queda por soplar 4990 ms)
Contacto
Soplamos (Queda por soplar 4990 ms)
Pero si dejo de hacer contacto, la cuenta atrás va bajando y, aunque vuelva a hacer contacto cuando quedan 4000, 3000 o los ms que sean, la cuenta atrás sigue impasible hasta cero sin volver a ponerse a 5000ms:
Contacto
Soplamos (Queda por soplar 4989 ms)
Soplamos (Queda por soplar 4951 ms)
Soplamos (Queda por soplar 4912 ms)
Soplamos (Queda por soplar 4874 ms)
Soplamos (Queda por soplar 4835 ms)
Soplamos (Queda por soplar 4797 ms)
Soplamos (Queda por soplar 4758 ms)
Soplamos (Queda por soplar 4719 ms)
Soplamos (Queda por soplar 4681 ms)
Soplamos (Queda por soplar 4642 ms)
Soplamos (Queda por soplar 4605 ms)
Soplamos (Queda por soplar 4566 ms)
Soplamos (Queda por soplar 4527 ms)
Soplamos (Queda por soplar 4489 ms)
Soplamos (Queda por soplar 4450 ms)
Soplamos (Queda por soplar 4412 ms)
...Soplamos (Queda por soplar 238 ms)
Soplamos (Queda por soplar 200 ms)
Soplamos (Queda por soplar 164 ms)
Soplamos (Queda por soplar 126 ms)
Soplamos (Queda por soplar 89 ms)
Soplamos (Queda por soplar 52 ms)
Soplamos (Queda por soplar 16 ms)
Supongo que estoy haciendo algo mal, pero no se ver bien el qué.
Cualquier consejo o ayuda será muy apreciado.
Muchas gracias!