Una duda con millis

Buenas, estoy metiendome en el millis y me gustaria saber como hacer la funcion de esperar un tiempo antes de ejecutar una accion aqui os lo muestro:

void act1(){
    digitalWrite(rele2, LOW);
    //aqui iria un delay pero pausa el arduino, entoces que pongo
    digitalWrite(rele2, HIGH);
    digitalWrite(rele3, LOW);
    //aqui iria un delay pero pausa el arduino, entoces que pongo
    digitalWrite(rele3, HIGH);
}

Hola Shadoaru, las cosas no funcionan del mismo modo que con delay() sencillamente porque cuando tu llamas act1() esta ejecuta todo y cuando encuentra un delay se detiene.

Ahora debes imaginar esto de un nuevo modo. act1 debe ser llamado en cada ciclo del loop y no debe haber delays en ninguna parte o millis() no hará lo que quieres.

Entonces debes crear una máquina de estados. Te recomiendo vayas a Documentación y en Indice de temas tutoriales veas el apartado correspondiente a Maquinas de estado y millis()

En el post#23 yo hago un aporte a un caso parecido al tuyo que usaba delay() y lo cambio usando millis() a ver si te sirve.

1

Gracias Surbyte pero donde dijistes

Entonces debes crear una máquina de estados. Te recomiendo vayas a Documentación y en Indice de temas tutoriales veas el apartado correspondiente a Maquinas de estado y millis()

No lo encuentro y tu post #23 tampoco, ¿me lo podrias explicar ?

surbyte: Entonces debes crear una máquina de estados.

Surbyte otra persona que me explique como lo puedo hacer, pero se me ocurrio usar los delays, pero sumarle las pausas de los delays, quiero decir:

digitalWrite(rele1, LOW);
      delay(1000);
      digitalWrite(rele1, HIGH);
      delay(10000);
      digitalWrite(rele2, LOW);
      delay(1000);
      digitalWrite(rele2, HIGH);
      delay(10000);
      digitalWrite(rele3, LOW);
      delay(1000);
      digitalWrite(rele3, HIGH);
      delay(10000);

si aqui sumo los delays que son en microsegundos, queda 33000 microsegundos, y quiero que esos pulsos de los delays se haga en una hora indicada como al medio dia, entoces cuando termine le sumo la hora anterior a la hora ¿no?

Te pongo un ejemplo para encender un relé durante 10 segundos y luego apagarlo 1 segundo antes de volver a encenderlo.

int Rele1 = x;                          //El pin correspondiente al relé 1
int Intervalo = 1000;                         //Un intervalo de 1 segundo

void setup()
{
    pinMode(Rele1, OUTPUT);                  //Declara el pin como salida     
    digitalWrite(Rele1, HIGH);                  //El pin está en alta (5 voltios) y el relé se enciende
    unsigned long MillisPrevias = millis();   //guarda el valor de tiempo inicial
}

void loop()
{
   unsigned long MillisAhora = millis();
   CambiaIntervalo();                          //Función que cambia el intervalo entre 1 y 10 segundos  
   if ((MillisAhora - MillisPrevias) >= (Intervalo)
      {
          MillisPrevias = MillisAhora; 
          if (Intervalo = 10000)
            {digitalWrite(Rele1, LOW);}    //Apaga el relé si Intervalo=10 segundos
          else 
            {digitalWrite(Rele1, HIGH);}   //Enciende el relé si Intervalo=1 segundo
      }
}

void CambiaIntervalo()            //Función que cambia el valor del intervalo entre 1 y 10 segundos
{
      if (Intervalo == 1000)
        {Intervalo = 10000;}
      else
            {Intervalo = 1000;}
}

Esto te permite ejecutar al principio del loop() otras acciones que no se interrumpen. Los delay() producen un tiempo de espera durante el cual no se ejecuta ninguna otra actividad. Son útiles siempre y cuando no ejecutes otros códigos simultáneamente, si lo único que vas a hacer es encender y apagar relés, pues no sé si la función millis es muy útil. Última consideración: si los relés son esos módulos chinos, suelen tener lógica inversa, o sea que cuando pones el pin en HIGH se apaga el relé.

albertoG1: Última consideración: si los relés son esos módulos chinos, suelen tener lógica inversa, o sea que cuando pones el pin en HIGH se apaga el relé.

Lo se, lo tengo invertido en mi codigo, pero la diferencia entre poner aqui

if(Interval == 1000)
//y
if(Interval = 1000)

Pues si pones "x = 0" estás diciendo "x es cero" o sea que le estás asignando el valor cero (lo mismo esa variable antes tenía otro valor), si pones dobles iguales estás comparando, o sea estás diciendo "si x es igual a cero", esto se utiliza en general en todas las situaciones en que se comprueba el valor de una variable (en los if, en los while, etc..), si le pones un solo igual le dices al programa que le asigne ese valor a la variable.