Go Down

Topic: Multitarea en arduino (Read 1 time) previous topic - next topic

juancdrg5

Soy nuevo en los foros de arduino, pero me gustaría que me ayudaran con unas duditas.

1. como hacer que dos leds destellen en tiempos diferentes sin depender uno del otro y sin usar la función delay sino con la funcion millis

         led 1 : encendido 80ms
                   apagado 80ms
                   encendido 1200ms

         led 2 : encendido 90ms
                    apagado 1200ms

agradezco su colaboración y explicaciones sencillas gracias

surbyte

Usando millis().
No existe la multitarea en Arduino.
Si puedes usar millis() y te recomiendo que leas en documentación Máquina de Estados.
milllis() qué es?
Es una función que devuelve cuando es llamada el tiempo desde que esta encendido el Arduino.
Asi que imagina un cronómetro que arranca cuando activas el arduino.
Como haces lo que quieres hacer con un cronómetro en marcha?
Fácil.
Tomas el tiempo en un momento X0 y será TLED1 mientras el cronómetro avanza.
Luego consultas usando if si ese tiempo actual restado del que tomaste como referencia supera un valor, cuando se cumpla la condición accionas tu LED y actualizas el tiempo TLED1
Lo mismo con TLED2.



gepd

Fíjate en este video para que puedas entender como funciona delay y millis: https://www.youtube.com/watch?v=3V2j5p4B4sg&t=1s
Deviot el plugin IoT para Sublime Text. Si quieres probarlo y ayudarme con tu feedback, visita: https://github.com/gepd/Deviot

PeterKantTropus

#3
Sep 11, 2017, 06:15 pm Last Edit: Sep 11, 2017, 06:20 pm by PeterKantTropus
 Fijate si este Tutorial ,que escribí hace algún tiempo, te sirve.
Saludos
//-----------------------******------------------------
if (Codigo_con_delay==True) {
Proyecto=Fracaso;
 } 
//-----------------------******-----------------------

juancdrg5

Entiendo que sea con la funcion millis, pero no se usarla correctamente la ultima respuesta me ayudo mas pero sigo con la misma duda como hacer la secuencia la cual tienen diferentes tiempos de estado corregire la secuencia.

led 1 :           encendido 80ms
                    apagado 80ms
                    encendido 80ms
                    apagado 1200ms

 led 2 :         encendido 90ms
                   apagado 1200ms

seguiré leyendo el tutorial que esta muy interesante gracias por sus contribuciones.

surbyte

#5
Sep 13, 2017, 10:37 pm Last Edit: Sep 13, 2017, 10:42 pm by surbyte
En documentos Maquinas de estados hay un post mio en la respuesta #14 donde le resuelvo un problema similar a un forero. comportamiento no esperado de delay().

En dicho post respuesta #10 esta el código que menciono usando una máquina de estados


Observa tu caso
led 1 :           encendido 80ms
                   apagado 80ms
                   encendido 80ms
                   apagado 1200ms

led 2 :         encendido 90ms
                  apagado 1200ms

Tienes un LED1 y un LED2.
Para led1 tienes 4 estados
para el led2 tienes 2 estados.


Code: [Select]

// en las definiciones globales
byte estado       = 0 ; //indica si toca ON u OFF
unsigned long time1; //variable final tarea


// en el loop...

switch (estado) {  // maquina de estados LED2
      case 0: time2 = millis(); //inicio tarea
                  digitalWrite(pinLed2, HIGH);
                  estado = 1;
                  break;
      case 1: if (millis() - time2 > 90) {
                     digitalWrite(pinLed2, LOW);
                     time2 = millis();
                     estado = 2;
                 }
                 break;
      case 2: if (millis() - time2 > 1200) {
                      estado = 0;
                 }
                 break;
  }


Tu código arranca con estado = 0
Con 0, enciendes el led2 y tomas el valor de millis() en time2
pasas al estado 1.
En 1 no haces nada hasta superar 90 milisegundos
millis() - time2 no sera mayor hasta 90 mseg despues del estado 0
al completar cambio estado a 1 y apago LED2
ajusto time2 con el valor de millis();
para pasar al estado 2, al llegar a 2 solo cambio estado a 0 y eso garantiza que todo vuelve a repetirse.
Eso es una máquina de estados.

Has lo mismo para LED1, con otros nombres


Go Up