Hacer dos cosas simultaneas

Hola a todos! No sé si esta duda que tengo es demasiado básica pero no logré encontrar nada en internet. Espero que me puedan ayudar :slight_smile:

Necesito hacer una programación simultánea. Es decir que no sea lineal, sino que se realicen cosas independientes al mismo tiempo. El principal problema con esto es el tema de los delays.

Por ejemplo si quiero que SIEMPRE un led se apague y prenda cada 2 segundos y aparte hacer cualquier otra cosa que involucre tiempo, como leer un sensor y en base a eso prender/apagar un segundo led.(después de un determinado tiempo) No sé si me explico de buena manera.

Saludos.

Para hacer eso tienes que usar una técnica denominada TIMESLICE
La tecnica es muy simple. Como no se puede hacer lo que tu pretendes se engaña al CPU haciendo que atienda muchas tareas pero en intervalos de tiempo cortos.
Supongamos que tienes tres tareas, pero la ejecución de ellas se realiza en forma secuencial a intervalos de 1mseg.
de modo que como dije T1, T1 T3 son las tareas.
Para ellos usas un timer que generará una interrupción cada 1 mseg. También un TaskCounter o ContadorDeTareas que llevará el control de la tarea a ejecutar. Cada 1 mseg se genera una interrupción, se incrementa el contador de Tareas y se salta a la tarea correspondiente indicada x TaskCounter. Asi puedes realizar 3 tareas aparentemente simultáneas pero en realidad ya viste que no lo son.
Yo sugerí 1 mseg porque es lo que usaba con los AVR de ATMEL pero el tiempo hay que balancearlo para que sea el correcto.
Eso implica reescribir algunas cosas como los delays (No puede usarse porque ), y otras cuestiones mas complejas que el simple ejemplo anterior.

Disiento ahora contigo en que no hayas podido encontrar tu problema en internet.
mira Timeslice shell for the Arduino - Exhibition - Arduino Forum
Busca siempre en inglés, si no encuentras prueba alemán o italiano. Yo no se ninguno de los ultimos pero para eso uso los traductores. Incluso en ruso hay cosas excelentes. No hablo de tu problema sino en líneas generales.

Mirar TODOS los ejemplos que vienen con el Arduino es muy instructivo.

Archivos-ejemplos-digital-BlinkWithoutDelay

Jopapa
www.jopapa.me

Hola dssp,

El siguiente ejemplo hace dos cosas simultaneas usando la función millis().

1 - led 12 parpadea cada 5 segundos
2 -led 13 parpadea cada segundo.

// Parametros del pin 12 
const int pinLed12 = 12;
long intervalo1 = 5000;
long timer1 = millis();
int estadoPin12 = LOW;

// Parametros del pin 13  
const int pinLed13 = 13;
long intervalo2 = 1000;
long timer2 = millis();
int estadoPin13 = LOW;

void setup() {
  pinMode(pinLed12, OUTPUT); //pin 12 como salida
  pinMode(pinLed13, OUTPUT); //pin 13 como salida
}

void loop() {
  
  if ( (millis() - timer1) > intervalo1){
    parpadeo_12(); //invoca rutina de parpadeo pin 12
  }
  if ( (millis() - timer2) > intervalo2){
    parpadeo_13(); //invoca rutina de parpadeo pin 13
  }
}

void parpadeo_12(){ //rutina de parpadeo pin 12
  if (estadoPin12 == LOW)
      estadoPin12 = HIGH;
    else
      estadoPin12 = LOW;
    digitalWrite(pinLed12, estadoPin12);
    timer1 = millis();
}

void parpadeo_13(){ //rutina de parpadeo pin 13
  if (estadoPin13 == LOW)
      estadoPin13 = HIGH;
    else
      estadoPin13 = LOW;
    digitalWrite(pinLed13, estadoPin13);
    timer2 = millis();
}

Si deseas puedes cambiar los tiempos de intervalos y/o colocar lo que necesites en las rutinas de parpadeo. Saludos.

p

Gracias a todos por sus respuestas.