Encender tiras led secuencialmente, excepto una tira.

Buenas a todo el foro.
Les comento que estoy iniciando en arduino, estoy haciendo un proyecto de encendido de tiras led y ya tengo el hardware.
Les comento el problema que no encuentro solución.
Quiero programar en el sketch 5 tiras led (linea_1, linea_2, linea_3 linea_4, linea_5) que se enciendan y apaguen secuencialmente cada 300 milisegundos (esto se repite 5 veces), excepto la linea_5 que quiero que esté encendido toda la secuencia (2400 ms), pero no logro hacer esto, no sé si se pueda hacer.

¿Alguien del foro que me pueda ayudar?

Muchas gracias a todos.

Les dejo parte de mi programación como lo estaba haciendo :
C++:
}



  for(byte contador=0; contador<5; contador++)

  {

  digitalWrite(linea_5, HIGH);             //Secuencial 300 milisegundo (5 veces) -------

  delay(2400);

 

  digitalWrite(linea_4, HIGH);           

  delay(300);

  digitalWrite(linea_4, LOW);

  delay(300);

 

  digitalWrite(linea_3, HIGH);

  delay(300);

  digitalWrite(linea_3, LOW);

  delay(300);

 

  digitalWrite(linea_2, HIGH);

  delay(300):

  digitalWrite(linea_2, LOW);

  delay(300);



  digitalWrite(linea_1, HIGH);

  delay(300);

  digitalWrite(linea_1, LOW);

  delay(300);

  }
 
Trilo, no le sale un bucle y queres complicarle la vida con la maquinaria del timer? cuando la aplicación es lineal y simple los delay() cumple perfectamente su misión y más durante el aprendizaje.
De echo para eso se implemento, para que la persona que se inicie no se trabe y vaya adquieriendo experiencia, cuando domina lo básico ampliamente y a medida que se va complicando allí si tiene sentido, porque de otra forma no aprende ni una ni otra.
Esa es la diferencia entre el que solo sabe y el que sabe y sabe enseñar
 
El programa hace exactamente lo que le has dicho que haga.
Le has dicho que encienda una cosa y espere dos segundos y medio y eso es lo que hace
Si quieres que haga algo a los 300ms no le digas que espere 2400ms
dibuja en cronograma y programa los pasos
Si no me equivoco va:
00000
10001
10010
10100
11000

y vuelve a empezar:
00000
...


¿Es eso o es otra cosa?
Indique que secuencia es la que quieres porque hay cosas que no me cuadran en la descripción

¿O es esta?
10000 1200ms
00001 300ms
00010 300ms
00100 300ms
01000 300ms
 
Discrepo; yo que fui autodidacta aprendí a usar timers primero y cuando me explicadon los delays no me cabían en la cabeza y eso que la tengo grande. Y a día de hoy siguen sin caberme.
Algunos mayores que yo decían que no se podía estudiar el transistor sin dar válvulas primero, pero se equivocan. La prueba es que yo nunca he estudiado válvulas ni he necesitado su conocimiento. Habrían miles de ejemplos similares.
No hay una secuencia lógica para explicar las cosas, algunas si que van despés que otras pero en muchas ocasiones se pueden invertir el orden de los temas o simplemente omitir algunos.


Retomando el tema qe nos ocupa, en este caso el problema no son los delays; en una aplicación de este nivel de simplicidad se pueden usar sin mayor problema. El problema es que el algoritmo está mal planteado. Con delays o con timers.
Que se haga un cronograma de la secuencia que quiera y verá que rápido le sale el programa.
Usar seis hilos de ejecución para encender seis leds, es posible pero me parece un enfoque un tanto forzado.
 
tu...
otros no .

¿ eres de los que creen que ni la tierra , ni el sol, solo uno es el centro de el universo??

ahora... en arduino no hay "timers" asi nomas.... a lo mucho , millis y micros...
asi que , si te quieres mandar un tutorial, aunque sea cortito, pero guiando a la inchada hacia timers, pues yo te aplaudiria de pie.

un saludo
 
Claro que hay timers en Arduino.
Flexitimer se llama la librería, habrán otras alternativas, supongo.
Aparte se puede bypasear la capa Arduino y usar directamente funciones del c avr.

Además están los tics del sistema a laos que se acceden con la función millis().

Hay que leer la documentación porque al apropiarnos de alguno de los timers se pierden algunas funciones del sistema que dependen de ellos.
 
Última edición:
Gracias a todos por sus repuestas, ayer no pude responder por motivos de trabajo. Les comento que no soy electrónico ni de sistemas, soy una persona autodidactica como muchos, que le gusta el mundo de la electrónica, mis pocos conocimientos los adquirí a través de tutoriales, viendo ejemplos de programación en arduino, buscando información por internet, etc
Respondiendo a sus respuestas:

- Recién estoy empezando en programación en arduino, lo que he visto que más usan para lo que quiero es delay. Voy a investigar sobre el uso del timer.
- Lo que quiero hacer es que en un bucle enciendan las 5 líneas, pero que en todo el intervalo de ese bucle solo la línea 5 quede encendida y que las demás líneas restantes empiecen a parpadear secuencialmente. Si quito el delay de la línea 5 y lo coloco fuera del bucle, antes del bucle, lo que haría es que primero se encienda la línea 5 y después de apagarse recién encienda las líneas restantes.
- La secuencia que quiero hacer es la siguiente (todo dentro de un mismo bucle, se puede?):

Línea_5 encendido 2400 ms (permanece encendido durante toda la secuencia de encendido y apagado de las demás lineas).

Línea_4 encendido 300 ms ( Enciende y se apaga 1°, luego continua con la otra línea )
apagado 300 ms

Línea_3 encendido 300 ms ( Enciende y se apaga 2°, luego continua con la otra línea )
apagado 300 ms

Línea_2 encendido 300 ms ( Enciende y se apaga 3°, luego continua con la otra línea )
apagado 300 ms

Línea_1 encendido 300 ms ( Enciende y se apaga 4°, luego al continua con la otra línea )
apagado 300 ms

tiempo total de encendido y apagado: L_1+L_2+L_3+L_4 = 2400 MS = L_5 (2400 MS)

- Con respecto al uso de vector y con lo de tipo estructurado es una nueva alternativa.


Pido disculpas si no uso los términos correspondientes al mundo de la electrónica y programación, pero como comente al inicio soy nuevo en ello.
 
Para que te resulte más fácil hace una linea de tiempo, no solo veas el efecto ve que pasa en la salida de cada línea
Hace una linea para cada salida empezando desde el arraque, cada line tiene una parte alta y otra baja que se corresponden a un 0 digital y a 1 digital
 
Pues:
Enciendes el 5 y enciendes el 4 esperas 300ms
Apagas el cuatro y enciendes el 3 esperas 300ms
Apagas el tres y enciendes el dos esperas 300ms
Apagas el dos y enciendes el uno esperas 300ms
Apagas el uno esperas 300ms
apagas el 5 fin de secuencia


Mas o menos así. Sigo sin entender lo que describes.

Si enciendes el 5 y esperas 2400ms obviamente no pasa nada hasta que pasen esos 2400ms porque es lo que tu le has dicho al micro que haga.
 
No entiendo mucho del tema
Pero Scooter te lo da en bandeja

Inicio

Puerto. 00011000
Retardo 300ms
Puerto. 00010100
Retardo 300ms
Puerto. 00010010
Retardo 300ms
Puerto. 00010001
Retardo 300ms
Puerto. 00010000
Retardo 300ms
Puerto. 00000000
End

EDITO
Me he dado cuenta que el tiempo debe ser mayor para que sea de 2400ms
 
Última edición:
Si quito el delay de la línea 5 y lo coloco fuera del bucle, antes del bucle, lo que haría es que primero se encienda la línea 5 y después de apagarse recién encienda las líneas restantes.
No! la línea 5 una vez encendida NO se apagará nunca más, ya que NO hay nada en el programa que le diga que se apague.
Haz lo que comentan los compañeros.
 
Última edición:
Si quito el delay de la línea 5 y lo coloco fuera del bucle, antes del bucle, lo que haría es que primero se encienda la línea 5 y después de apagarse recién encienda las líneas restantes.
Te vuelvo a poner lo que te decía en #3, porque parece que lo entendiste mal.
  1. Quitar el delay.
  2. Mover la línea de encendido antes del bucle.
 
Atrás
Arriba