[solucionado]Alguien podría ayudarme?

mi duda básicamente es que quiero hacer que un led titile con una frecuencia y el otro led titile con otra al mismo tiempo,
me explico quiero que el led del pin 9 encienda cada 1 segundo y que mientras trascurre ese segundo el led el pin 10 halla encendido unas 5 veces

void setup() {
pinMode(9,OUTPUT);
pinMode(10,OUTPUT);
}

void loop()
{
  // put your main code here, to run repeatedly:
 digitalWrite(9,1);
   delay(1000);
   digitalWrite(9,0);
   delay(1000); 
   digitalWrite(10,1);
   delay(200);
   digitalWrite(10,0);
   delay(200); 
}

se que arduino recorrerá linea por linea en forma descendente y es por eso que estoy pidiendo ayuda lamentablemente no se mucho de programar en arduino les agradecería mucho la ayuda

No se puede hacer 2 cosas a la vez. Mas puede ser que esto te solucione lo que quieres.

int led_1 = 12;
int led_2 = 13;

void setup() {                
  pinMode(led_1, OUTPUT);     
  pinMode(led_2, OUTPUT);     
}

void loop() {
  digitalWrite(led_1, HIGH);
  delay(100);
  digitalWrite(led_1, LOW);
  delay(100);
  digitalWrite(led_1, HIGH);
  delay(100);
  digitalWrite(led_1, LOW);
  delay(100);
  digitalWrite(led_1, HIGH);
  delay(100);
  digitalWrite(led_1, LOW);
  delay(100);
  digitalWrite(led_1, HIGH);
  delay(100);
  digitalWrite(led_1, LOW);
  delay(100);
  digitalWrite(led_1, HIGH);
  delay(100);
  digitalWrite(led_1, LOW);
  delay(100);
  digitalWrite(led_2, HIGH);
  delay(100);
  digitalWrite(led_2, LOW);
  delay(100);
}

Hay varias formas de hacerlo. Con delay y sin delay. Lo que hay que tener en cuenta, es que, para que el led rápido, se encienda 5 veces por cada vez que lo hace el lento, no tienes que dividir su tiempo en 5, si no en 10, porque realmente son 5 veces encendido y 5 veces apagado, de forma que el delay del led rápido será de 100, no de 200.

Para hacerlo con delay, puedes hacer un bucle for para el led rápido, y un cambio de estado del led lento, una vez trancurrido el bucle for. Algo así:

for (int i = 0; i < 6; i++) {
    digitalWrite(ledRapido, HIGH);
    delay (100);
    digitalWrite(ledRapido, LOW);
    delay(100);}

En principio, este bucle for, dura un segundo, de forma que después del bucle for, se puede hacer un cambio de estado, como en el que se hace para encender y apagar el led del ejemplo BlinkWithoutDelay.

El problema está en que realmente, el bucle for, no dura 1000 milisegundos, si no que dura unos 1200 milisegundos, ya que el tiempo de procesado del bucle for, necesita su tiempo, de forma que el led lento, es inpreciso.

Creo que la mejor forma de hacerlo, es modificando el ejemplo del BlinkWithoutDelay. Duplicando el código (poniendo un poco de atención en lo que se hace) para que dos leds parpadeen a diferente tiempo. Uno con un intervalo de 1000 milisegundos (tal y como viene en el ejemplo) y otro con un intervalo de 100 milisegundos.

para hacer cosas que simulen comportamiento simultáneo no se puede usar DELAY. Es ridículo encarar un programa en el que algo debe hacer esto y lo mientras tanto debe hacer otra cosa porque su posible solución si la encuentras es única para ese caso y en cuanto quieres modificar algo te rompes la cabeza buscando los tiempos de los delays.

La solución es el ejemplo BLINKWithoutDelay que encuentra en el IDE.
usan millis() el programa fluye dentro del loop y cuando se cumple un lapso de tiempo hará algo y reponen el tiempo de arranque de ese timer, y cuando se cumple otro, haran otra cosa y asi.

con delay(mseg) uds definen el tiempo que estará detenido elprograma.

con millis() que es el contador en milisegundos del tiempo que lleva encendido tu arduino, uds deben hacer un paso previo que es cargar el valor de este contador de milisegundos cuando quieren que empiece la cuenta como si ahi empezara el delay
luego usan un if

if(millis()-t_arranque > 1000)
dijimos que millis() es el tiempo que lleva encendido el arduino en mseg
t_arranque previamente lo cargue con el valor que tenia millis() como si fuera un cronometro y lo presionan, lo mismo.
Entonces este if que hace, hace la diferencia entre el nuevo valor de millis() y el que tenia cuando presionaron y si esa diferencia es menor a 1000 mseg o sea 1 segundo pasa de largo y puede hacer mas cosas
y si no ejecuta por ejemplo prender un led
Dentro del if voy a prender el led apagar otro por ejemplo y al final voy a cargar t_arranque = millis(); con el nuevo valor del contador del arduino de mseg desde que lo encendí.
y de nuevo ejecutaré 1000 pasadas si cada pasada me llevara 1 mseg (es una suposición) y a la 1001 la diferencia me da 1001 y supero a 1000 y por lo tanto vuelvo a ejecutar lo que tengo dentro del if

SI quiero hacer otra cosa, hago otro if con otra variable que tome el tiempo de arranque 2 y asi.

Yo dí la posibilidad de hacerlo con delay porque, si solo tiene que hacer lo de los leds, sería viable de no ser por el descuadre de 200 ms del "led lento".

Si solo tiene que hacer eso, y no es importante la poca precisión del tiempo de ese led, puede hacerse así, aunque para mi, no es viable ese desfase de tiempo.

carmeloco:
Yo dí la posibilidad de hacerlo con delay porque, si solo tiene que hacer lo de los leds, sería viable de no ser por el descuadre de 200 ms del "led lento".

Si solo tiene que hacer eso, y no es importante la poca precisión del tiempo de ese led, puede hacerse así, aunque para mi, no es viable ese desfase de tiempo.

Digo lo mismo.. Fue por eso que le di la opción de los delays. Mas no aconsejo tantos delays.

godoy_br, ¿has probado tu código?

carmeloco:
godoy_br, ¿has probado tu código?

Lo probre em Proteus y funciona. No exactamente como HDJP lo quiere. Mas creo que le servirá para lo que quiere :slight_smile:

Yo lo he probado en un Uno, y según mi interpretación, no lo hace :slight_smile:

Yo interpreto que quiere un led parpadeando cada segundo (como el ejemplo blink) y otro, 5 veces por segundo.

Recien lo hice en un arduino y en un mega. use el led del arduino y agregue un segundo.. funciona!!!! :stuck_out_tongue:

Creo que lo hemos interpretado de forma distinta. Tu código da este resultado:

Blink Godoy

Y yo lo he hecho sin delays y lo he interpretado así:

Blink Carmeloco

que cosa cinematografica!!! Parece Hollywood :slight_smile: :slight_smile: :slight_smile:

El codigo que le hice, es simples y lleno de delays cosa que no se puede usar a tonta y a loca, mas la aplicación no requiere nada complejo, son solamente 2 led's. Mas tu opción es mejor en funcionamento, seria bueno explicarle a HDJP cada parte del codigo. Para que sepa como funciona!

No, no digo que un codigo sea mejor que otro, digo que hacen cosas diferentes. :slight_smile:

Si HDJP se pasa y pregunta las dudas, no tendré ningún problema en responderselas.

muchas gracias amigos tome ambas ideas y me funcionaron :smiley:

Recuerda modificar el titulo del primer mensaje del post y añadirle [Solucionado]