Temporizador para rele

Hola amigos estoy realizando una proyecto en el cual necesito temporizar un motor mediante un rele que cuenta con un total de tres tiempos preestablecidos diferentes seleccionados mediante tres botones(uno para cada lapso de tiempo).
La verdad no se casi nada de arduino, apenas comienzo a adentrarme en el tema

Logre encontrar y adapta un programa para mis necesidades antes mencionadas pero tengo un inconveniente debido a que necesito que el programa me muestre el numero de vueltas que realiza el motor.

Cabe mencionar que el programa no es mio lo encontre en el siguente post:
https://forum.arduino.cc/index.php?topic=496998.0

El programa consiste en tres botones, cada uno con un lapso de tiempo diferente y al seleccionar cualquiera de los tres y presionar el boton de inicio, comienza una cuenta regresiva en una lcd 16x2 la cual muestra un texto que dice ""Contando"" y por debajo ""Tiempo y la cuenta regresiva""

Para lo cual yo tenia la idea sustituir la palabra contando por la palabra ""vuelta"" seguido de un contdor de vueltas (vuelta 00001) mediante la implementacion de una variable que suponiendo que el motor tarda 5 seg en dar una vuelta completa(360°), cada 5 seg que transcurran al iniciar la cuenta del programa se cuente una vuelta y aparezca en la lcd (vuelta 0001), por ejemplo supongamos que se selecciona el primer boton el cual otorga al relay un tiempo de activación de 20 seg y suponiendo que el motor tarda 5 seg en dar una vuelta completa(360°), por lo tanto el motor dara un total de 20seg%5seg de vuelta = total de 4 vueltas y el LCD de 16x2 mostrara Vuelta 00004 - tiempo 0:00:00(debido a que es cuenta regresiva)

se lo mucho que implica realizar un programa pero he intentado realizarlo por mi cuenta sin exito alguno y por eso acudo a ustedes, con la esperanza de que alguien pueda orientarme de como hacerlo
por su atención gracias

a continuación dejo una imagen para explicar un poco mejor lo que intento lograr, seguido del programa y un video del funcionamiento

Imagen:

Video del funcionamiento del proyecto:

foro_timer_lcd.ino (16.6 KB)

Bienvenido @Rodo13511 al foro Arduino, te has ganado un premio al comentario. Tu código perfectamente comentado como pocos he visto. Aplausos!!!
No se si has sido tu o el código original los tenía pero muy claro todo.

Hasta acá todo funciona bien pero esta claro que no es este el funcionamiento que quieres.

Si te comprendo, los pulsadores ahora seran vueltas de motor y cada giro del motor que ocurre cada 5 segundos quieres que se descuento 1 al contador.

Es asi?

Al principio no caí. Pero luego me di cuenta que el código lo había hecho yo. Es de hace más de un año, cuando tenía tiempo para ayudar con más detenimiento en este foro. Por desgracia llevo una temporada sin disponer de tiempo para dedicar al foro como me gustaría.

Ésta es la respuesta en donde lo publiqué: Re: Timer con LCD y salida de Rele

Rodo13511 únicamente ha cambiado cuatro constantes y dos mensajes del programa original. Me gustaría ayudarle, pero yo tampoco he entendido qué es lo que quiere hacer. Debería de dar muchos más detalles de qué es lo que quiere y cómo quiere que se comporte. A veces ayuda bastante que pongan lo que han hecho "de cosecha propia" porque se puede llegar a intuir qué es lo que quieren hacer (a veces, otras veces es peor el remedio que la enfermedad).

jaja bueno entonces los aplausos son para ti @IgnoranteAbsoluto!!

Primeramente una disculpa por tanta confusión, y cabe aclarar que el programa no es mio, lo encontre en un post de este mismo foro y cambien algunas cosas para adaptarlo a mis necesidades como ya lo habia mencionado ""Logre encontrar y adapta un programa para mis necesidades"" .
Me he dado cuenta que estuvo mal no haber puesto la fuente original donde obtuve el programa y no haber dado credito al autor, pero crei que habia quedado claro que el programa no era mio ni mucho menos que lo habia echo yo

como ya lo mencionaron el programa lo encontre en un post de este mismo foro en cual es el siguiente
http://forum.arduino.cc/index.php?topic=496998.msg3395867#msg3395867

Además le agradezco demasiado al usuario ""Sr. Member"" por que gracias a su codigo logre avanza una etapa de mi proyecto y lamento no haber dado credito por el:(

El programa estaba excelente mente explicado como ningún otro y a pesar de que to no entiendo mucho de arduino logre comprender su funcionamiento hasta cierto punto gracias a las anotaciones que le añadio el programador que lo creo

Modifique el post esperando resolver las dudas existentes ademas añadí mas material para darme a entender un poco mejor
muchas gracias por su atención=)

lee el privado que te envie y edita el post#6 y el inicial.
Tienes muchos enlaces sin etiquetas, tienes imagenes que deben verse.
En resumen lee las normas del foro y edita ambos post

Rodo13511, no me queda claro cómo quieres "detectar" que el motor da una vuelta completa. Parece que lo vas ha hacer "a ojo". Calculando empíricamente el tiempo que tarda en dar una vuelta y fijando posteriormente una constante con ese valor. ¿Es eso lo que piensas hacer? ¿Ese cálculo aproximado te valdría?

Lo normal, si no es un motor paso a paso, es tener algún tipo de sensor que detecte el movimiento y controle que la vuelta se completa realmente.

Lo que me extraña también es que quieras controlarlo por tiempo y contar las vueltas por tiempo. ¿No sería más práctico controlarlo diréctamente por vueltas? Fijas cuantas vueltas quieres que de en total y una vez completadas las vueltas se para, independientemente del tiempo que se lleve.

Creo que lo mejor serías que explicaras cual es el cometido final del montaje. Tal vez así tendríamos más claro qué es lo que quieres. A no ser que solo sea para experimentar y aprender sin más. Algo a lo que no se le va a dar un uso real.

Nota: fui yo quien hizo el código original que has adaptado. No me he tomado a mal lo que has hecho con él, ni que no mencionaras al principio de dónde lo sacaste. No buscaba reconocimiento alguno. Si te has fijado, de entre tanto comentario que puse en su día, no hay ninguno que reivindique que lo hice yo. Lo que me pasó es que primeramente vi "por encima" el código que habías puesto y pensé que quien lo había hecho se lo había currado. Posteriormente, al ver lo que habían comentado @surbyte y @ArduMyth, se me despertó más la curiosidad y lo volví a mirar más detenidamente. Fue entonces cuando me di cuenta que el código original era el mío :smiley: y me reí de mí mismo por no haberme dado cuenta la primera vez que lo miré.

""Parece que lo vas ha hacer "a ojo". Calculando empíricamente el tiempo que tarda en dar una vuelta y fijando posteriormente una constante con ese valor. ¿Es eso lo que piensas hacer? ¿Ese cálculo aproximado te valdría?""

Exactamente eso pretendo "hacer" amigo se que no seria muy preciso pero es lo mejor que se me ocurre.

intente utilizar un foto emisor y un foto receptor pero lo mejor que pude lograr fue solo un contador que solo servia para eso jajaja

""Lo que me extraña también es que quieras controlarlo por tiempo y contar las vueltas por tiempo. ¿No sería más práctico controlarlo diréctamente por vueltas? Fijas cuantas vueltas quieres que de en total y una vez completadas las vueltas se para, independientemente del tiempo que se lleve.""

estaría mas que excelente un contador por vueltas así como tu lo mencionas pero lamentablemente no tengo ni idea de como hacerlo y tu programa fue lo que mejor se me acomodaba para mi proyecto y pues tuve que adaptarme a el

Básicamente mi proyecto es un intrumento utilizado en la elaboracion de farmacos el cual consiste en una leva que va enpalmada a un motor y esta cada vez que da un giro de 360° transmite un pequeño golpe por gravedad a un pequeño tubo o varilla que roza con ella. El instrumento debe contar con tres cantidades selecionables diferentes las cuales son 100,500 y 1250 vueltas o golpes

La leva es controlada por el motor

Imagenes que explican mejor el propósito del proyecto:

Funcionamiento de la leva movida por el motor:

Porque no colocas un sensor de efecto Hall y cada vez que la leva alcance la posición máxima tienes un punto de sincronismo y no tendrás que adivinar nada.
El arte de este mundo es justamente hacer simples las cosas. Contar tiempo no será preciso y no hablo de la precisión del Arduino para hacerlo, sino que tu motor puede tener variaciones a menos que sea Stepper como dijo @IgnoranteAbsoluto.

Me parece una excelente idea eso que mencionas @surbyte.
Así sera un poco mas preciso el conteo de las vueltas del proyecto.

Me puse a investigar un poco sobre el funcionamiento de los sensores tipo hall y se me ocurre que se podria implementar de la siguiente manera

Imagen de posicionamiento del sensor:

y para la programación se podría hacer que cada que la leva de una vuelta completa y coincida el punto de sincronismo que seria el imán y el sensor alineados (como se muestra en la imagen) se reste o se sume una vuelta, según la cantidad seleccionada

Así sera un poco mas preciso el conteo de las vueltas del proyecto.

Un poco no, será preciso.
Eso es lo que todos te estaban diciendo.

Si es posible.
Otra alternativa es un sensor magnético. Cuando se encuentre con la muesca de la leva habrá un cambio, lo que no se si el sensor detectará dicho cambio como 0/1 pero con electrónica se podría.
Si te resulta cómodo usa la version con iman.
Lo puedes poner a un lado de la rueda para que no interfiera con la leva.

Con dicha detección, sabras el momento en que de una vuelta y de ahi en mas continuar.

Para mi no es proyecto.. es algo simple. Si fuera el caso todos son proyectos.
En todo caso va para hardware, pero es solo el uso de un sensor.. y si todo lo movemos que queda para software?

Creen que de alguna manera se pueda adaptar el programa original utilizando el sensor hall.?

No entiendo que tiene que ver el programa original con lo que quieres hacer. Solo quieres una cuenta descendente de vueltas, y eso es mucho mas simple que el programa con el que todos nos confundimos al comienzo.
ese programa maneja tiempos y ahora tus eventos son vueltas o eventos del sensor hall.

Para ensayar lo que quieres ni siquiera necesitas el sensor HALL, coloca un pulsador y simula con el pulsador lo que el sensor te dará que serán cambios HIGH/LOW
Cuentas dichos cambios en orden decreciente, lo presentas en el LCD y tienes lo que quieres.

No sabes hacerlo? Ese es otro tema.
Ve a documentación => Indice de temas tutoriales => Clases de Youtube o mira los libros ahi indicados y establece una base de conocimientos para hacerlo.
En las clases de Youtube te aseguro que hay mucho de lo que tienes que hacer para conseguir tu idea.

Programar algo que incremente es básicamente lo mismo que hacerlo decrementar. Le sumas o restas 1, Fácil no?

PResentar en el LCD ya lo sabes hacer de la copia anterior. Usas lo mismo

Agrega un pulsador.
Una variable que comience en un valor digamos 100 vueltas
Con cada pulsación decrementas 1 o sea a tu variable que podemos llamar vueltas le dices cuando detectas el cambio del pulsador.

vueltas = vueltas - 1;

Esta es la forma que conocemos

y esta es la forma simplificada que se usa en arduino.

vueltas -= 1;

Ambas hacen lo mismo y no hay cambio alguno entre usar una u otra

El pulsador lo conectas entre GND y el pin supongamos pin 2

lo defines en el setup asi

pinMode(pinPulsador, INPUT_PULLUP);

obviamente defines a pinPulsador para que se corresponda con la ubicacion 2.
Define variables bool como estado, estadoAnt que ademas debes fijarla a un valor p.ej = false

en el loop()

lees el estado asi

estado = digitalRead(pinPulsador);
if (!estado && estadoAnt)   // cada vez que se presione o sea vamos a LOW 
   vueltas -= 1;                  // desde HIGH decrementamos
estadoAnt = estado;

Como vueltas arrancará en un valor de 100 p. ejemplo
Con cada pulsacion pasamos en el pulsador de high a low, ese flanco lo vemos con

if (!estado && estadoAnt)

porque la variable estadoAnt guarda siempre el estado estable y estado tiene el valor pulsado

asi que ese flanco es el que determina que le quites una vuelta.

SI en lugar del pulsador fuera el sensor HALL y suponiendo que el sensor entregara un valor LOW cuando pase el iman trabajaría exactamente igual y si cuando pase el iman da un valor HIGH inviertes todo y funcionará igual. En este caso prestarás atención al flanco 0 a 1.
Funcionalmente es lo mismo.

Luego todo debe presentarse en el LCD y para eso usas lcd.print(BLA BLA BLA)

No digo que sea fácil, no lo es, si no ves las clases de Youtube y se por que te lo recomiendo, porque sin base no podras hacer nada.