Presionar un boton y activar 3 salidas a diferentes tiempos.

Amigos denme una ayudita por favor...

Mi hermana necesita un dispositivo que use un Boton De Arranque (push button) para empezar una secuencua que active 3 salidas independientes a diferentes tiempos de operacion y que ella pueda controlar con el computador (usando el serial monitor del Arduino). Cada salida requiere 3 operaciones (cierre y apertura) y ella necesita controlar los tiempos de cada una. Cuando ella presione el Boton De Arranque ese sera el tiempo 0 para todas las salidas. Por ejemplo, en el serial monitor ella escribira:

0,10,15,25,30,35 (presiona Enter)
10,15,20,22,23,28 (presiona Enter)
0,25,50,100,150,200 (presiona Enter)
Entonces presionar el Boton De Arranque para empezar la secuencia...

La primera linea es para la salida 1, la segunda para la salida 2 y la tercera para la salida 3. Cada linea tiene 6 numeros, tres operaciones de cierre y 3 de apertura. Por ejemplo, los 6 numeros de la primera linea representan:

0 - Cerrar salida 1 (en este caso justo cuando presionamos el Boton De Arranque)
10 - Abrir salida 1
15 - Cerrar salida 1
25 - Abrir salida 1
30 - Cerrar salida 1
35 - Abrir salida 1

Todos estos numeros estan en minutos.

Mi hermana trabaja en el Zoologico y ellos estan tratando de automatizar los comederos de tres "cuartos" en la seccion de recien nacidos. Ellos planean usar este dispositivo en las noches cuando todo el personal se ha ido. Por supuesto, quieren probar primero y si la idea funciona se implementara un LCD y un teclado.

Me podrian por favor guiarme con ideas en como empezar esto o como buscar en el foro o en algun otro lugar?

Mil gracias...

bueno, quizá lo más inteligente es ir haciendo secciones y pequeñas pruebas individuales.

Queda claro que posiblemente vas a usar 4 pines, uno para el pulsador, y 3 pines para las 3 salidas independientes.

Primeramente yo haría un buffer de recepción para Serial. Con ese buffer almacenar toda una trama en una variable tipo String o char*. Teniendo ya todo en una variable, desarrolla algún método tipo split para diseccionar esa variable teniendo en cuenta un delimitador, en este caso parece ser la coma ",". Es decir, una vez capturada la primera trama completa:
0,10,15,25,30,35

Usas el metodo implementado tipo split y la diseccionas teniendo la coma como delimitador. De esa manera, además sabiendo que siempre será un número fijo de 6 variables, puedes obtener algo del tipo.

l1t1=0 (int) [considerando l=linea, t=tiempo; linea 1, tiempo 1]
l1t2=10 (int)
...
l1t6=35 (int)

Que es mucho más sencillo de trabajar.

Una vez hayas llegado ahí, decide que te viene mejor, si usar la función millis() o un RTC como DS1307.

Usando millis() (el problema es que hay que considerar el desbordamiento), tendrías que comprobar en que momento llegas a l1t1 para cerrar la salida (pin a LOW), tras eso esperar a llegar a l1t2 y activar salida correspondiente (pin a HIGH). Como millis son milisegundos, deberías estar haciendo una transformación para poder comparar unidades, por ejemplo, l1t2601000 y ya tienes la variable l1t2 en formato millis.

Creo que das a entender que las 3 salidas son secuenciales y siguen el orden que has marcado. Entonces la segunda salida empezaría en:
l1t6+l2t1, es decir, el último valor de la primera secuencia más el primer valor de la segunda, y todas las operaciones de la segunda salida tendrán ese "desplazamiento temporal".

A estas horas no sé si me explico muy bien, espero que más que liarte pueda haberte ayudado a orientarte un poco.

Un saludo

Hola,

  • Primero habría que escribir una función para leer una cadena por puerto serie, leer caracteres hasta que llegue un carácter fin de línea.
  • Una vez que controles eso, haría falta otra función para parsear la cadena leída, y guardar los datos del programa en alguna estructura.
  • Finalmente necesitarías una función para ejecutar los tres programas, que según he entendido, se ejecutarían simultáneamente.

No sé en cual de los puntos necesitas ayuda, ya nos contarás