Hola.
No tiene mucha lógica la definición de esa estructura, ni ese array, pues no está utilizando prácticamente nada de los mismos. Tan sólo define un parámetro útil, que es el número de pulsos por vuelta (dos para tipo fan=1). Para eso, sencillamente con definir directamente ese número valdría:
static int NbTopsFan; // contador de impulsos.
const int fandiv = 2; // dos pulsos por vuelta
const int hallsensor = 2; // pin 2, que está unido a interrupción 0.
void rpm () // se llamará cada vez que se pruduce la interrupción
{
NbTopsFan++;
}
void setup()
{
pinMode(hallsensor, INPUT);
Serial.begin(9600);
attachInterrupt(0, rpm, RISING);
}
void loop ()
{
NbTopsFan = 0;
sei();
delay (1000);
cli();
int Calc = ((NbTopsFan * 60)/fandiv);
Serial.print (Calc, DEC);
Serial.print (" rpm\r\n");
}
En cuanto a sei y cli, lo que hacen respectivamente es activar / desactivar las interrupciones. Entonces, establecemos las interrupciones, hacemos un delay de un segundo y desactivamos las interrupciones. Es decir, mientras dura ese delay, cada vez que se produce una interrupción por un tick, se ejecuta rpm(), que suma un pulso. Cuando termina el delay se desactivan las interrupciones para que no siga contando, y se hace el cálculo con los impulsos que hemos contado.