#define led4 23
#define led5 22
#define entradaproducto 32
#define salidaproducto 33
int tiempoproducto[100];
int productos=0;
int imprimir=0;
int j=0;
hw_timer_t *timer = NULL;
void IRAM_ATTR fintimer()
{
tiempoproducto[j]=1; //indica que el producto ha estado al menos 5 segundos en la cinta
j++;
imprimir=1; //Variable para que se imprima la información por el puerto serie cada 5 segundos
}
void IRAM_ATTR entrada()
{
detachInterrupt(digitalPinToInterrupt(entradaproducto)); //Elimino rebotes al presionar
if(productos==0)
j=1;
productos++;
}
void IRAM_ATTR salida()
{
detachInterrupt(digitalPinToInterrupt(salidaproducto)); //Elimino rebotes al presionar
if(tiempoproducto[1]==1)
{
if(productos>0)
productos--;
for (int i = 1; i < 100; i++)
{
tiempoproducto[i - 1] = tiempoproducto[i]; //Desplazo los elementos del vector 1 posición hacia la izquierda
}
if(j>0)
j--; //Al desplazar elementos vector hacia la izquierda, elimino una posición del vector
}
}
void setup()
{
Serial.begin(115200);
pinMode(led4, OUTPUT);
pinMode(led5, OUTPUT);
pinMode(entradaproducto, INPUT);
pinMode(salidaproducto, INPUT);
// Configuración del temporizador
timer = timerBegin(10e5);
timerAttachInterrupt(timer, &fintimer);
timerAlarm(timer,50e5, true, 0); //interrupción cada 5 segundos
}
void loop()
{
if(digitalRead(entradaproducto)==0)
attachInterrupt(digitalPinToInterrupt(entradaproducto),entrada,HIGH);
if(digitalRead(salidaproducto)==0)
attachInterrupt(digitalPinToInterrupt(salidaproducto),salida,HIGH);
if(imprimir==1)
{
Serial.printf("Productos %d \n", productos);
}
imprimir=0;
delay(10); //Se pone este delay para hacer que el programa vaya mejor
}