Se pueden utilizar 2 delay de distintos tiempos? cuentas de cruce por cero

Hola chic@s, es mi primera vez utilizando Arduino, trabajo en un proyecto donde me interesa obtener cuantos cruces por cero hay en un segundo, mi entrada es una señal analógica con frecuencia variable.

Utilicé un detector de cruce por cero (4n25) para poder utilizar el pin 2 de Arduino UNO. De momento estoy probando con un pulsador y si me detecta cuando esta en alto y cuando esta en bajo.

El código que he estado implementando ya tiene un contador que me lleva la cuenta de cuantos cruces por cero hay, pero no sé como implementar que me tire cuantos hay en un segundo, se reinicie el contador y así sucesivamente.

Ejemplo

minuto cruces por cero
1------------20
2------------20
3------------20
4------------25
5------------25
6------------30
7------------30

Esto es importante para mi, porque con esto puedo calcular la velocidad angular de mi dispositivo de entrada, ya que 2 cruces por cero = 1 giro en el dispositivo que estoy utilizando.

Lo que en mi cabeza esta es la existencia de que cada delay (1000) me muestre el dato de cuantos cruces por cero hay en el Monitor serial, pero que la toma de datos por el pin 2 sea con un delay (100) para que tenga un mejor muestreo de la señal, pero por lo que he visto no se pueden utilizar 2 delay o si?

 const int inputPin = 2;
 
int value = 0;
int cont = 0;
int cont2= 0;
 
void setup() {
  Serial.begin(9600);
  pinMode(inputPin, INPUT_PULLUP);
}
 
void loop(){
  value = digitalRead(inputPin);  //lectura digital de pin (ej. off off on on on off off on on)
 
  //mandar mensaje a puerto serie en función del valor leido
  if (value == HIGH) {
      Serial.print("on");
      Serial.println(cont++);// contador de cuanto dura en positivo (0 0 1 2 3 0 0 1 2)

       if (cont == 1) {
    Serial.println(cont2++);// cuando veces comienza positivo ( 1    2  )
    }
  }
  else {
      Serial.println ("off");
      cont = 0;
  }
 
  delay(100);

Espero alguien tenga un idea de como solucionar esto o alguna otra opción.

2.JPG

Vos podés usar tantos delays como quieras. El problema es que cada vez que ponés delay el microprocesador se detiene durante los milisegundos que pusiste. O sea, NO hace nada. Por lo general es conveniente no usar esa instrucción, a menos que tengas en claro por qué. Te recomiendo busques millis() y aprendas a implementarla, hay muchos ejemplos al respecto.

Usar delays para contar cruces por cero no creo que sea el camino tal como lo has hecho.

Si estas en un país con frecuencia 50 hz. Un circuito con rectificación onda completa hará que tengas un cruce por cero cada 10 mseg
1 pulso ------------ 10 mseg
X pulsos ---------- 1000 mseg

Deberías tener 100 pulsos.

Ahora si solo tienes una rectificación de media onda, tendras uno cada 20 mseg en concordancia con los 50 hz
pero como debes activar tu interrupción por flanco solo tendras un pulso cada 20 mseg.

o sea 50 pulsos por cada segundo (1000 mseg).

Espero que protegas el diodo led del 4N25.

Lo que habitualmente se hace, es conectar la salida del opto a una interrupción y un simple contador con alguna peculiaridad llevará la cuenta de los cruces por cero sin perderse ni uno solo.

Para ello tu salida del 4N25 debe ir al Pin 2 INT0 (tal como has hecho) o pin 3 INT1 en el arduino UNO o NANO.

Si haces eso te garantizo precisión en la lectura de los cruces por cero. Suponiendo claro que tu esquema asociado al optoacoplador funcione perfectamente.

En mi explicación supuse que estabas conectado a la red y luego recordé que hablas de medir la velocidad angular.
Mira los ejemplos que usan interrupciones externas INT0 o INT1.