Rpm de una señal cuadrada

Hola, estoy usando un codigo para calcular el periodo de una señal cuadrada para luego transformarlo en RPM. Funciona bien solamente que cuando no mando mas pulsos (o sea cuando no hay RPM) me muestra el ultimo valor que tuvo hasta que vuelve a tener, no vuelve a cero. Cual seria la solucion? Gracias

volatile long RPMN1count=0;
volatile long RPMN1=0;
volatile boolean flag=0;
long RPMN1period;

void N1()
{
  
  RPMN1period=micros()-RPMN1count;
  RPMN1count=micros();
  flag=1;
 
}
void setup() {

Serial.begin(115200);
attachInterrupt(0, N1, FALLING);




}

void loop(){
if(flag == 1)
  {
    noInterrupts();
    RPMN1=(30000000UL/RPMN1period);   //Two signals per rotation.
    interrupts();   
    Serial.println(RPMN1);
    flag=0;
  }
}

Podrías poner un tiempo de timeout para indicar 0. Por ejemplo:

unsigned long timeout = 1000000; // 1 segundo.
void loop {
  if ( micros()-RPMN1period > timeout ) RPMN1 = 0;
}

Así, cuando no hay pulsos, el periodo no se mueve, si el micros actual es mayor del timeout se pone a rpm 0.

Muchas gracias por la rapidez de la ayuda, luego lo pruebo y te comento. Gracias

Mas alla del consejo de victorjam, la variable RPMN1 nunca la pones a cero antes de reactivar las interrupciones.
Esa simple práctica podría funcionar.

void loop(){
if(flag == 1)
 {
   noInterrupts();
   RPMN1=(30000000UL/RPMN1period);   //Two signals per rotation.
   Serial.println(RPMN1);
   RPMN1 = 0;
   interrupts();   
   flag=0;
 }
}

Hola surbyte!, muchas gracias! mande a imprimir un gabinete para este proyecto ni bien tenga las cosas les comento como me fue. Saludos

surbyte:
Mas alla del consejo de victorjam, la variable RPMN1 nunca la pones a cero antes de reactivar las interrupciones.
Esa simple práctica podría funcionar.

void loop(){

if(flag == 1)
{
  noInterrupts();
  RPMN1=(30000000UL/RPMN1period);  //Two signals per rotation.
  Serial.println(RPMN1);
  RPMN1 = 0;
  interrupts(); 
  flag=0;
}
}

El problema con esta solución es que ya no puedes utilizar los rpm en el resto del sketch. Mejor con timeout.

Por favor @ElEspanol basta con copiar a otra variable y operas como gustes.
El código esta limitado a presentar. Y yo lo plantee en ese contexto, si fuera parte de un PID consideraría otra alternativa. No descarto que el timeout sea mejor pero esto tambien puede funcionar.

Hola chicos, sigo con el tema de poner las RPM a cero. Esto funciona despues de las 2500rpm.

unsigned long timeout = 1000000; // 1 segundo.
void loop {
  if ( micros()-RPMN1period > timeout ) RPMN1 = 0;
}

Antes de las 2500rpm me las pone a 0 cada 1 segundo. Estoy tratando de ver la manera de mejorarlo

Acabo de darme cuenta de una cosa de tu código que posteaste primero:

volatile long RPMN1count=0;
volatile long RPMN1=0;

Por favor, cambialo a UNSIGNED LONG!!! es un error que no nos habiamos percatado.

Por eso funcionaba mal?

No estoy del todo seguro, pero ten en cuenta que si el periodo es grande, hablando en términos de microsegundos, un long se puede desbordar y te dará valores negativos.
Eso te puede alterar el valor sobre todo a bajas revoluciones, donde el periodo es mayor.

Sigue sin funcionar, ahora cuando le pongo ese if para volver a cero deja de marcar rpm. Alguna otra sugerencia? Marca exacto las RPM pero no puedo hacer que se vuelva a cero cuando no hay pulsos.

No habrás quitado el timeout?

Funciona pero hasta las 3200RPM, de 3200 para abajo me resetea a 0 cada un segundo

Prueba este trozo de código a ver que resultado te da para medir RPM:

unsigned long tactual, tanterior;
unsinged long periodo;
int rpm;
float f;

void isr() {
  tactual = micros();
  periodo = tactual-tanterior;
  tanterior = tactual;
}

void setup() {
  Serial.begin(115200);
  tactual=0;
  tanterior=0;
  attachInterrupt(0, isr, FALLING);
}

void loop() {
  if ( periodo==0 ) f=0;
  if ( micros() - tactual > 1000000 ) f=0;
  else f= 1000000.0/periodo;
  rpm = f*60;
  Serial.println(rpm);
}

Como ves, basicamente mido el periodo en la interrupción y no hago nada en ella. En el loop simplemente lo utilizo.
No habilito/deshabilito las interrupciones, ni utilizo una bandera flag.

Ok, mañana lo pruebo. Gracias