Mandar dos post en distinto tiempo

Hola, amigo!! gracias por entrar

Estoy intentando programar un prototipo con un sensor de temperatura, para distintos web services...
Mis variables son las siguientes:

Cayenne.run(); //Es la primera función para un primer post
ToPostWStemp(); //Es la segunda función para un segundo post

Lo que deseo hacer es mandar la función al primer post cada minuto. Seguido de lo anterior, después de las diez lecturas del primer post, se mande la segunda temperatura al segundo post... (Quiero que el segundo post a los diez minutos mande una lectura)

Tengo un código con millis, primero lo hice con delay, pero me he informado & honestamente es peor hacerlo con delays...
Pero bueno, mi problema consiste en que la primer lectura (Cayenne.run()) manda la temperatura cada N segundos & el segundo post lo manda cada 45 minutos o 30 minutos (por ejemplo ahorita no lo ha mandado.

void loop()
{
unsigned long t_cayenne = 0;
unsigned long t_post = 0;

    if (millis() - t_cayenne >= 60000)
    {
        // hacer esto cada 60 segundos
        Cayenne.run();

        // Toma el tiempo de la última lectura
        // Cuando corra la próxima vez
        t_cayenne = millis();
    }

    if (millis() - t_post >= 600000)
    {
        ToPostWStemp();

        t_post = millis();
    }
}

Las variables han de declararse fuera del loop:

unsigned long t_cayenne = 0;
unsigned long t_post = 0;

void loop() {
[...]
}

Respuesta simple:
Si tu ejemplo funciona entonces no entiendo para que lo posteaste.
Si no funciona? Entonces pon lo fuera del loop, como te sugieren.

Maclos:
Por qué fuera del loop()

Sencillo:

Tú lo que quieres es que esas variables mantengan al valor cada vez que pasa por el loop, que se mantengan entre ejecuciones. Ese es el comportamiento cuando las pones fuera, son globales que se mantienen siempre y puedes usarlas dentro.

Sin embargo, si las pones dentro se crean cada vez que pasan por el loop y se destruyen al salir, es decir, son variables locales a la ejecución de esa función y existen solo cuando se ejecuta, y sólo ese tiempo. Cada vez que entras al loop se vuelven a crear. Este comportamiento no es el que deseas, y menos cuando se crean siempre con valor 0.

No funciona, he intentado hacer esto...

unsigned long t_cayenne = 0 - 30000;
unsigned long t_post = 0 - 600000;
unsigned long t_transcurrido = millis();

void loop()
{
 if (t_transcurrido - t_cayenne >= 30000) //each one minute on milliseconds
    {  
        Cayenne.run();        
        t_transcurrido = 0;
    }
 if(t_transcurrido - t_post >= 600000) //each ten minute on milliseconds
   {
     ToPostWStemp(); //Function that sends temperature data to my webservice
      t_transcurrido = 0;
   }
}

:frowning:

surbyte:
Respuesta simple:
Si tu ejemplo funciona entonces no entiendo para que lo posteaste.
Si no funciona? Entonces pon lo fuera del loop, como te sugieren.

No funciona Surbyte, saludos!

No puedes usar “unsigned” y luego poner valores negativos, ‘da la vuelta’ y se convierte en un positivo altísimo:

Además, el tiempo transcurrido ha de variar en cada ejecución, con lo que ha de estar dentro del loop

unsigned long t_cayenne = 0 - 30000;
unsigned long t_post = 0 - 600000;
unsigned long t_transcurrido = millis();

void loop()
{
 if (t_transcurrido - t_cayenne >= 30000) //each one minute on milliseconds
    { 
        Cayenne.run();       
        t_transcurrido = 0;
    }
 if(t_transcurrido - t_post >= 600000) //each ten minute on milliseconds
   {
     ToPostWStemp(); //Function that sends temperature data to my webservice
      t_transcurrido = 0;
   }
}

Prueba ésto:

unsigned long t_cayenne = 0;
unsigned long t_post = 0;

void loop()
{
 unsigned long t_transcurrido = millis();
 if (t_transcurrido - t_cayenne >= 30000) //each one minute on milliseconds
    { 
        Cayenne.run();       
        t_cayenne = t_transcurrido;
    }
 if(t_transcurrido - t_post >= 600000) //each ten minute on milliseconds
   {
     ToPostWStemp(); //Function that sends temperature data to my webservice
      t_post = t_transcurrido;
   }

// Fix time variable overflow:
 if (t_transcurrido - t_cayenne > 100000) {
  t_cayenne = t_post = 0;
 }

}

El fix del overflow es debido a que llega un momento que el tiempo no cabe en la variable y se resetea; creo que era pasados un mes o mes y medio. No suele hacer falta, pero como es tan sencillo…

Por cierto, he puesto 100000, pero ha de ser un número que sea algo mayor que el mayor de los tiempos que usas (en este caso, algo mayor que 60000).

Por cierto:

 if (t_transcurrido - t_cayenne >= 30000) //each one minute on milliseconds

El tiempo marcado son 5 minutos, pero en el comentario pone 1 minuto…

Gracias Naguissa, he probado el código & he reajustado un poco el contador... ha quedado de la siguiente manera, & funciona de maravilla, sólo que a veces manda parámetros al post (NO Cayenne) cada dos minutos, otras veces cinco... Pero eso lo arreglo yo. :slight_smile: :slight_smile:

Mi código es el siguiente, quisiera que me den el punto de vista..

unsigned long t_cayenne = 0;
unsigned long t_post = 0;

void loop()
{
  
 unsigned long t_transcurrido = millis();
 
   Cayenne.run();       
 
 if(t_transcurrido - t_post >= 600000) //each ten minute on milliseconds
   {
     ToPostWStemp(); //Function that sends temperature data to my webservice
      t_post = t_transcurrido;
   }

// Fix time variable overflow:
 if (t_transcurrido - t_post > 100000) {
  t_cayenne = t_post = 0;
 }

}