Utilizar la función millis 1 vez

Cómo utilizar la función millis EN ARDUINO para trascurrido un tiempo se me ejecute una función una sola vez si se cumple x condición

Moderador:
Editadas todas las mayúsculas de título y cuerpo del mensaje.

He trasladado su tema de una categoría de idioma inglés del foro a la categoría International > Español @tecnicoscentroinf.

En adelante por favor usar la categoría apropiada a la lengua en que queráis publicar. Esto es importante para el uso responsable del foro, y esta explicado aquí la guía "How to get the best out of this forum".
Este guía contiene mucha información útil. Por favor leer.

De antemano, muchas gracias por cooperar.

En la sección Documentación hay excelentes tutoriales, te invito a leerlos.

Saludos

Moderador:
Por favor, lee las Normas del foro
Si posteas en el foro en inglés usa idioma inglés para expresarte, eso incluye los comentarios de tu código. Si un código tiene comentarios en español también moverán tu hilo a esta sección en Español.
Si escribes en español debes usar el foro Arduino en español

gracias, no doy con la verdad ademas soy casi bb en estos mundos, si lo he leído pero no me funciona,paso el fragmento del codigo que tengo para eso:

........
unsigned long TiempoI = 0;
unsigned long intervalo = 7000;
.....
......
......
//led3 es un interruptor 
if (led3 == true){
    if (millis() - TiempoI >= intervalo){
      digitalWrite(16,led3);
      Serial.println (TiempoI);
      Serial.println (millis());
      TiempoI = millis();
   }
  } else{
    digitalWrite(16, LOW);
    //TiempoI = 0;
    }

hola, puede usar una variable booleana "ejecutada" que se establece en false al principio, luego la primera vez que se ejecute su if (millis...[]) se establecerá en true, y cuando sea true, omitirá la ejecución del código dentro del if

por ejemplo:

bool ejecutada = false;
[...]
if (!ejecutada && (millis() - TiempoI >= intervalo)) {
    ejecutada = true;
    [...]
}

Warning: no he probado este código! :slight_smile:

No se estuve mirando y puede ser la placa me dicen aca dejo el codigo base desde donde voy hacer mas cosas pero si el millis no me funciona mal estoy para seguir

#include <DHT.h>
#include <DHT_U.h>



#define DHTPIN 14          //defininos el pin del sensor
#define DHTTYPE DHT22      //definimos el tipo de sensor
DHT dht(DHTPIN, DHTTYPE);

unsigned long TiempoI = 0; // Variable referencia para controlar el tiempo
bool Estado;
unsigned long intervalo = 22000;

/* 

  
  Arduino IoT Cloud Variables description

  The following variables are automatically generated and updated when changes are made to the Thing

  CloudTemperatureSensor sensorTM;
  CloudRelativeHumidity sensorHM;
  bool led3;

  Variables which are marked as READ/WRITE in the Cloud Thing will also have functions
  which are called when their values are changed from the Dashboard.
  These functions are generated with the Thing and added at the end of this sketch.
*/

#include "thingProperties.h"

void setup() {
  
  // Initialize serial and wait for port to open:
  Serial.begin(9600);

  //DEFINIR PIN Y SUS ESTADOS INICIALES
  pinMode(13,INPUT);  //PIN entrada sensor
  
  pinMode(12,OUTPUT);  //PIN relay de compresor
  digitalWrite(12,LOW);
  
  pinMode(16,OUTPUT);   //PIN Ventilador interno
  digitalWrite(16, LOW);
  
  pinMode(5,OUTPUT);   //PIN Ventilador externo
  digitalWrite(5, LOW);
  
  pinMode(4,OUTPUT);   //PIN Inversor
  digitalWrite(4, LOW);

  pinMode (DHTPIN, INPUT);  //PIN del sensor de t y h
  dht.begin();
  
  // This delay gives the chance to wait for a Serial Monitor without blocking if none is found
  delay(1500); 

  // Defined in thingProperties.h
  initProperties();

  // Connect to Arduino IoT Cloud
  ArduinoCloud.begin(ArduinoIoTPreferredConnection);
  
  /*
     The following function allows you to obtain more information
     related to the state of network and IoT Cloud connection and errors
     the higher number the more granular information you’ll get.
     The default is 0 (only errors).
     Maximum is 4
 */
  setDebugMessageLevel(2);
  ArduinoCloud.printDebugInfo();

  TiempoI = millis();

}

void loop() {
  ArduinoCloud.update();
  // Your code here 
  
  // Asignar las valor a las veriables de T y de H desde el sensor
  sensorTM = dht.readTemperature();
  sensorHM = dht.readHumidity();
  
  delay(2000);

  if (led3 == true){
    if (millis() - TiempoI >= intervalo){
      digitalWrite(16,led3);
      digitalWrite(5, led3);
      Serial.println (TiempoI);
      Serial.println (millis());
      Serial.println ("del loop");
      TiempoI = millis();
   }
   
  } else{
    digitalWrite(16, LOW);
    digitalWrite(5, LOW);
    //TiempoI = 0;
    }

  
}



/*
  Since Led3 is READ_WRITE variable, onLed3Change() is
  executed every time a new value is received from IoT Cloud.
*/
void onLed3Change()  {
digitalWrite(12,led3);
      //encendido del ventilador externo    
  
  //digitalWrite(12,led3);
  //digitalWrite(16,led3);
 // 
//  digitalWrite(4, led3);
  
  // Add your code here to act upon Led3 change
}





Que arduino usas?
Empiezo a ver tu código y mas allá de algunas sugerencias me encuentro con que cambias o pretendes cambiar el tiempo cuando el led esta en on, que tiene que ver eso como acción?
Si quieres prender apagar algo cada Intervalo de tiempo, solo usa el ejemplo BlinkWithoutDelay.ino que esta entre tus ejemplos del IDE y olvídate de Cloud por el momento.
No introduzcas tantas variables desconocidas.
Bajate el IDE, trabaja en físico o sino usa wokwi.com y hazlo simulado.

El Delay no me es funcional ya que se detiene todo el codigo, y quiero que siga midiendo temperatura y humedad, ya que si llega a x valores ejecute un apagado de todo, con la variable TiempoI la igualo a tiempo trascurido(millis) para saber cuanto tiempo lleva encendido el led, y a x tiempo se apague y luego a x tiempo se prenda denuevo siempre que la variable led3 == true), no se si me explique bien. gracias

YO hable de BlinkWithoutDelay.ino que usa millis() y no detiene el código. No vas a encontrar en un solo post mío desde 2014 que justifiqué usar delay() a menos que sea una prueba para ver si el arduino funciona.
Pero usar millis() requiere de al menos saber aprovecharlo. Entender que es una máquina de estados. Todo esta explicado en Documentación. Asi que te aconsejo que vayas y leas.

Hola @tecnicoscentroinf

Parece una redundancia ese "delay" y el "millis"

Ademas,... no es demasiado tiempo "intervalo 22000" ???

Revisa conceptos.!!

Un saludo !! ... :cocktail:... :cocktail:

con ese millis lo que quiero es que el codigo siga ejecutándose, y que solo se ejecute esa parte cuando led3 == true y el tiempo trascurido sea x

Pero no hay modo que el código se siga ejecutando si tienes un delay antes que frena todo.
tu código en el loop lee los DHT. pausa 2 seg, y bueno hará 11 ciclos hasta que ejecute lo que tienes con millis(). No es la idea. Si no pones millis() haría lo mismo. Pongo un contador de 11 tal que 11 x 2= 22seg y tenemos lo mismo.
Luego ya te lo han dicho, led3 es un pin no una variable no puedes preguntar por su estado
en lugar de esto

if (led3 == true){

debes usar esto

if (digitalRead(led3) == true){

Hi,
Adjunto una routina que te permite hacer el delay mientras sigue corriendo el programa. Esto lo hice para iir aprendiendo la programacion. Si es lo que entiendo es que no quires dejar de correr el programa cuando estas haciendo el delay. Tratalo para ver si es lo que busca si no ignoralo.




unsigned long TiempoI = millis();
unsigned long intervalo = 7000;
byte led3 = 2;
byte flag_no_actualizar = 0;
//************************************************
void setup() {
  Serial.begin(115200);
}
//************************************************
void loop() {
  //led3 es un interruptor
  intervalo_delay();
  delay(2000);
}
//***********************************************
void intervalo_delay() {
  
  //Empieza delay
  if (flag_no_actualizar == 0) {
    TiempoI = millis() + intervalo;
    digitalWrite(16, led3);
    flag_no_actualizar = 1;
  }
  //delay determinado por la variable intervalo = 7000
  Serial.print("millis  = ");
  Serial.println(millis());
  if (millis() > TiempoI + intervalo) {
    flag_no_actualizar = 0;
    digitalWrite(16, LOW);
    Serial.println("termino delay ");
  }
  //delay determinado por la variable intervalo = 7000
  Serial.print("TiempoI = ");
  Serial.println(TiempoI + intervalo);
}
//***************** Termina Programacion ***********

En serio @tauro0221 ?
Cuando se encuentre con delay(2000) que hace el código?

Hi,
surbyte ese delay es para poder leer los prints ya que si no lo pone los numeros no pueden leerse. Lo importante es la funcion del delay. Yo queria ver si hacia el delay si o no.

Pero eso es una contradicción porque pones un Intervalo = 7000 pero demora 14000 mseg en terminar el delay, entonces?

Si intervalo es 7000 a los 7000 debe mostrar terminé el delay no a los 14000.

Asi es como lo haría yo, falta como se enciende el led, que por cierto esta mal
No puede encenderse con este comando

digitalWrite(16, led3);

Mi código, este es un código no bloqueante sin delay()

unsigned long TiempoI = millis();
unsigned long intervalo = 7000;
unsigned long muestroTiempo;
byte led3 = 2;
byte flag_no_actualizar = 0;
//************************************************
void setup() {
  Serial.begin(115200);
}
//************************************************
void loop() {
  if (millis() - TiempoI >= intervalo) {
    digitalWrite(16, LOW);
    Serial.println("termino delay ");
    TiempoI = millis();
  }
  if (millis()- muestroTiempo >= 2000UL) {
    //delay determinado por la variable intervalo = 7000
    Serial.print("millis  = ");
    Serial.println(millis());
    Serial.print("TiempoI = ");
    Serial.println(TiempoI + intervalo);
    muestroTiempo = millis();
  }
}

Que se desactiva a los 7000 mseg, si quieres que lo haga a 14000 mseg pues le pones ese tiempo.

Hi,
Surbyte gracias por tu evaluacion del program. Tambien encontre un error en la linea donde comparo el miili() con la variable para parar el delay use ```
TiempoI + intervalo y debe ser TiempoI. El tiempo de 14000 se debe al delay 1000 en looop.
Pido disculpa a @tecnicoscentroinf por usar su consulta para ir aprendiendo programacion mientras trato de ayudar aquellos que pide ayuda. Yo me canse de la electronica.

Yo me alegro que aportes @tauro0221, recuerda que siempre he alentado tus aportes.
También yo me equivoco y me lo hacen saber y reconozco el error.
Ahora es mi mirada. SI algo no debe tener bloqueos, pues que no los tenga. Usar un delay(100) bloquea 100mseg y si tengo un adc pues eso puede significar un problema.

ya me perdi que bruto soy aaaaaaa, te explico

void loop() {
   sensorTM = dht.readTemperature();
  sensorHM = dht.readHumidity();
if (entrada3 == true){
    if (millis() - TiempoI >= intervalo){
      digitalWrite(16,entrada3); ////si se cumple que la entra  es verdadra el pin 16 HIGH 
      Serial.println (TiempoI);
      TiempoI = millis();
   }
   ///////// sin o se cuple eso que lo ponga en bajo 
  } else{
    digitalWrite(16, LOW);
    digitalWrite(5, LOW);
    //TiempoI = 0;
    }
}

la cosa es que este midiendo temperatura constantemente (eso funciona ) y que la entrada3 cambie se ponga en alto el pin 16 solo si han pasado x tiempo y sino que se mantenga en bajo asta que se cumpla el tiempo. disculpa mi brutalidad estoy aprendiendo. gracias