Contador+finales de carrera+pulsador

Hola buenas noches gente, soy nuevo en el foro e inicio con una consulta.
me encuentro medio perdido, quise arrancar un proyecto pero no se como empezarlo bien.

La idea es la siguiente necesito contar la cantidad de veces que un motor gira, lo quiero hacer con un cny70 hasta ahí bien el contador puedo hacerlo si problemas.
necesito que al presionar una vez un pulsador(p1) contar X cantidad de vueltas, una vez contadas, necesito enviar una señal a un rele por x seg luego de ese tiempo volver a contar y repetir el ciclo, hasta que toque un pulsador(p2) y mande una señal a un rele y el mismo corte cuando toco otro pulsador(p3) y el programa quede frenado hasta que vuleva a pulsar (p1).

la pregunta en si es si pueden orientarme un poco ya que no se ni por donde empezar si hay algun ejemplo armado de algo similar como para ayudarme a empezar.

desde ya les agradezco muchísimo, espero haberme explicado bien, saludos.

Hola,
Por lo que dices parece que tienes controlado el tema de hardware. Por lo que tengo entendido el CNY70 te da una señal digital cada vez que tu motor pasa por un punto.

Por lo que he entendido la cuestión es contar el numero de veces que se producen cambios de estado de tu sensor. Cada cambio de estado una vuelta.

Yo utilizaría interrupciones para contar attachInterrupt(), pero has de tener en cuenta que mientras utilizas estas interrupciones tendras retardos, importantes si utilizas los timers, como es tu caso.

Por lo tanto las tienes que activar y desactivar cuando no sean necesarias.

Para contar el tiempo tienes la función milis(), no utilices delay o se te quedará colgado.

Es un poco lioso la secuencia que debe de hacer, o por lo menos a mi me ha liado un poco.

Supongo que tendria que quedar algo así.

void loop()
{

  tiempo = milis() - inicio_reloj;
  if ( (fase == 0) && (pulsador1 == 1) ) 
  {
    fase = 1  ;
    Xvueltas = 0;                                           //reiniciar contador
    attachInterrupt(pin del cny70,rutina,modo);             //activar interrupcion en pin conectado al cny70 para que empiece a contar
  }
  else if ( (fase == 1) && (contador == Xvueltas) ) 
  {
    detachInterrupt(pin del cny70);                         //desactivar la interrupcion, ya no hace falta contar
    activar rele;
    inicio_reloj = milis();                                        //iniciar temporizador
    fase = 2 ;
  }
  else if ( (fase == 2) && (tiempo >= Xseg) )
  {
    desactivar rele;
    fase = 3 ;
   }                                                   
  else if ( (fase == 3) && (pulsador2 == activado) ) fase 4;
  else if ( (fase == 4) && (pulsador3 == activado) ) fase = 0;
}

A partir de la fase 2 me he liado un poco, pero espero que te sirva de algo

Yo utilizaría interrupciones para contar attachInterrupt(), pero has de tener en cuenta que mientras utilizas estas interrupciones tendras retardos, importantes si utilizas los timers, como es tu caso.

Retardos importantes!!! que tomaste?
una interrupción por naturaleza es una rutina rápida, digamos de algunos microsegundos, de modo que no hay retardo importante.
Tardas mas en esperar a que un DS18B20 te de el valor de su temperatura 750mseg en 12 bits o lo que tarda cualquier dispositivos I2C sensor o un MPU6050 por ejemplo... y hablo de miilisegundos.

Entonces no confundas. Una interrupción es algo rápido.
Si quieres contar flancos de un sensor CNY con una interrupción externa solo pones un contador que se incrementará con dicho flanco. Algo normal paramedir RPM, velocidad, etc.

Luego en tu loop tienes que tener una ventana de tiempo de 1000 mseg por ejemplo y esa lectura de Revoluciones x segundo convertira a revoluciones / minuto.

Nada que preocupe a un microcontrolador.

Solo y estoy de acuerdo no hacer cosas raras dentro de una interrupción, como enviar datos al monitor serie, usar delays o poner un while que consuma mucho tiempo. Todo esto provocará fallos.

Pero con los cuidados señalados usar interrupciones es lo que nos permite medir cosas rápidas.

Buenas nuevamente, perdón por ahí me explique mal, no era intención pedir un código confeccionado, lo que pedí es un ejemplo (algo como lo que planteo Zerabla) de como arrancar no tengo idea de como empezar el proyecto desde cero. En cuanto a las interrupciones no entiendo como funcionan en algún momento buscare algún tutorial para entenderlo y si surge alguna duda que ya no este planteada en el foro preguntare.

En estos días estuve leyendo un poco y mas o menos me di una idea de como arrancar agradezco las respuestas si me surge alguna duda pregunto.

y no pediría que me hagan el código sin estar dispuesto a pagar la idea es hacerlo y aprender en el camino, mis disculpas nuevamente si se entendió otra cosa.

saludas y gracias por responder.

Te recomiendo que vayas a la sección Documentación y mires el Indice de temas tutoriales.
Hay links a temas importantes y sigue creciendo.

En particular hay unas clases de Youbube muy bien hechas, Clases de 0 a 7 y de 8 en adelante, mas o menos asi se llaman. Prestales atencion y te pondrán en camino.

surbyte:
Te recomiendo que vayas a la sección Documentación y mires el Indice de temas tutoriales.
Hay links a temas importantes y sigue creciendo.

muchas gracias ire viendo un poco.