#define led4 23
#define led5 22
#define entradaproducto 32
#define salidaproducto 33
int tiempoproducto[10000];
int productos=0;
int imprimir=0;
int tic=0;
int tac=0;
int n=0;
int j=0;
hw_timer_t *timer = NULL;
void IRAM_ATTR fintimer()
{
n++;
tic = n; //Cuenta el tiempo que pasa (n=1 --> 100ms)
if(tic>50+tac)
{
tac=tic;
imprimir=1;
}
for(int x=0;x<productos;x++) //indica en cada posición del producto el tiempo que lleva en la cinta
tiempoproducto[x]++;
for (int i=0; i<productos; i++)
if(tiempoproducto[i]>50)
j++;
for (int i=0; i<productos; i++)
tiempoproducto[i]=tiempoproducto[i+j]; //Desplazo los productos "j" posiciones hacia la izquierda
//Pierdo la información de las posiciones que sustituyo (no la quiero)
}
void IRAM_ATTR entrada()
{
detachInterrupt(digitalPinToInterrupt(entradaproducto)); //Elimino rebotes al presionar
productos++;
}
void IRAM_ATTR salida()
{
detachInterrupt(digitalPinToInterrupt(salidaproducto)); //Elimino rebotes al presionar
productos=productos-j;
j=0;
}
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,10e4, 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
}