COMO HACER UN BUCLE DURANTE X TIEMPO

Hola buenas estoy acabando mi proyecto de carrera con Arduino y quería hacer un bucle que dure 60 segundos exactamente pero no se como hacerlo.

Lo que quiero es que dentro del bucle un interruptor magnetico si se activa realice una cuenta acumulando las veces que se active y que tras 60 segundos deje de hacerlo y se acabe el bucle.

Estoy buscando por todos los lados y no se como hacerlo si alguien lo supiera se lo agradeceria enormemente
Saludos

Entonces busca cómo se usa la función millis. También puedes echar un ojo al ejemplo BlinkWithoutDelay.

Cuando lo tengas, intenta tú crear el código y luego nos cuentas :wink:

Hola no soy experto en el tema pero he visto que hacen un contador int i=0; dentro del while esta la condicion si while(i=60) sale del bucle, espero te sirva.

bucle de 60 segundos.
Debes crear un par de variables

unsigned long start = millis()+60000UL; // cargo a start con el valor +60mil milisegundos
while (millis() > start) {
   // lo que este aqui dentro tiene 60 segundos para ejecutarse
   // o puedes salir con break
}

Muchas gracias surbyte me ha ayudado muchisimo ya me entra en el bucle perfecto y dura el tiempo que necesito, pero tengo un problemilla mas.

Necesito volver a entrar en el bucle indefinidamente debe repetirse durante 60 segundos, pero en este caso solo entra una vez...... ya que millis cada vez vale mas,
¿Seria posible resetear el valor de millis todas las veces antes de entrar en el bucle?

Gracias de antemano

Es decir que valga 0 millis pero que siga contando hasta 60 nuevamente

Haber si me explico

for() { // debe durar 60 segundos

//aqui pasan cosas

} // end for

serial.Println("HOLA");

//y luego quiero volver a for de antes

El bucle se controla asignando el valor inicial de millis() mas el intervalo que te interesa.
Lo puedes hacer donde gustes.
No entiendo que quieres hacer y entonces me resulta dificil aconsejarte.

Como no muestras tu código, no explicas bien donde debes usarlo.
Si miras este es un foro de ayuda, pero cuando vemos que el interesado resulta dificil seguir con la ayuda, porque pasa a ser otra cosa que en general cuestiono.

Suponiendo que me este equivocando y eso pasa seguido, te invito a que postees debidamente todo tu código, digas bien que quieres hacer y no seas tan ambiguo.

NOTA: No uses quote o cita para pegar tu código si no el tag de códigos que es éste </>, de paso lee las normas del foro.

Vale surbyte tee adjunto mi codigo como me comentaste a ver si me puedes ayudar

#include <dht.h>
#include <Time.h>
#define dht_apin A0  //DEFINIMOS QUE EL PIN A0 SERA LA ENTRADA DE DATOS ANALOGICOS DE NUESTRO SENSOR DE HUMEDAD
dht DHT;
double Tmax=0.00; //inicializamos una variable
double Tmin=100.00; //inicializamos la variable
double Tmedia=0.00;// inicializamos la variable
double KT=0.162; //VALOR CONSTANTE PARA REGIONES DE INTERIOR
double Rs;
double ETo;
double EToMes=0.00;
double Kc=0.00;
//PLUVIOMETRO//
const byte pinPluviometro       = 3;    // Definición del pin donde conectarás el Pluviómetro
bool Pluviometro;               // Estado actual del switch del pluviometro
bool PluviometroAnt  = LOW;             // Estado anterior del switch del pluviometro
unsigned int cuentaPrecipitacion  = 0;    // Contador de precipitaciones
unsigned int cuentaPrecipitacionAnt = 0;    // Valor anterior del contador de precipitaciones 
                        // solo para presentar cuando haya cambios
float Precipitacion;              // variable que lleva los mm de agua caídos

//ESTO SON VARIABLES QUE ESTOY PROBANDO PARA EL BUCLE//
unsigned long start = millis()+60000UL; // cargo a start con el valor +60mil milisegundos
extern volatile unsigned long timer0_millis;
unsigned long valor = millis();
unsigned long time = 0;
int CycleTime = 0;
int eltiempo=0;

///////////////////////////////////////////VALORES QUE DEBEMOS MODIFICAR MENSUALMENTE////////////////////////////////////////////////

double Ro=34.7; //ESTE VALOR SE LO TENDREMOS QUE VARIAR MENSUALMENTE

////////////////////////////////////////////SETUP//////////////////////////////////////////////////
void setup() {
  pinMode(13, OUTPUT);
  pinMode(pinPluviometro, INPUT);      //el pin pluviometro será una entrada  
    Serial.begin(9600);
    setTime(00,00,00,01,07,2016);//INICIALIZAMOS LA HORA
    delay(500);//Delay to let system boot
    Serial.println("SENSOR DE HUMEDAD Y TEMPERATURA DHT11\n\n");
    delay(1000);//Wait before accessing Sensor
 
}//end "setup()"
 
void loop(){


//////////////////////////////////////////PROGRAMA TOTAL//////////////////////////////////////////////
for (int k=1; k<=8; k++){

  if(k==1){
    Serial.println("                     MARZO                ");
    Ro=27.5;
    Kc=0.3;
  }else if(k==2){
    Serial.println("                     ABRIL                ");
    Ro=34.7;
    Kc=0.3;
  }else if(k==3){
    Serial.println("                     MAYO              ");
    Ro=39.6;
    Kc=0.5;
  }

///.................... el resto de meses


    
/////////////////////////////////////////CÁLCULO DE VALORES POR MES//////////////////////////////////////////
for(int j=1; j<31;  j++){ 
    
  Serial.print(" DIA  ");
  Serial.println(j);
  EToMes=EToMes+ETo;     //acumulamos los valores de Evapotranspiración para calcular su valor mensual
  Serial.println(EToMes);//acumulando la ETo

  
for(int i=0; i<24; i++){   //DIARIAMENTE CALCULAREMOS VALORES DE HUMEDAD Y TEMPERATURA CADA HORA (CADA 3.600.000 ms)
DHT.read11(dht_apin);

time_t t = now();

      Serial.print("Fecha :  ");
      Serial.print(day(t));
      Serial.print(+ "/") ;
      Serial.print(month(t));
      Serial.print(+ "/") ;
      Serial.print(year(t)); 
      Serial.print( "       ") ;
      Serial.print("Hora :  ");
      Serial.print(hour(t));  
      Serial.print(+ ":") ;
      Serial.print(minute(t));
      Serial.print(":") ;
      Serial.println(second(t));

    
    Serial.print("HUMEDAD RELATIVA DEL INVERNADERO = ");
    Serial.print(DHT.humidity);
    Serial.print("%  ");
    Serial.print("TEMPERATURA = ");
    Serial.print(DHT.temperature); 
    Serial.println("C  ");
    Tmedia=DHT.temperature+Tmedia;
//    Serial.println("SUMA DE TEMPERATURAS");
//   Serial.println(Tmedia);
    Serial.println("");

//ESTO ES LO QUE NECESITO AYUDA QUE NO ME SALE///
//QUIERO HACER UN BUCLE QUE DURE 60 segundos mas o menos en los que el pluviometro pueda //contar la llluvia al acabar el bucle el programa seguiría funcionando tal cual calcularia valor de //temperatura y humedad para posteriormente otra vez calcular la lluvia durante otros 60 segundos y //así todas las veces


while (time < CycleTime) {
   
    Pluviometro = digitalRead(pinPluviometro);  // Leeremos de la entrada digital el valor de pluviómetro

    if (Pluviometro == HIGH && PluviometroAnt == LOW){ // solo voy a considera un cambio 0->1 en el Pluviometro
      cuentaPrecipitacion =cuentaPrecipitacion + 1; //Contamos pulsos
    }      

    PluviometroAnt = Pluviometro;     // esto actualiza el estado anterior de Pluviometro
    if (cuentaPrecipitacion != cuentaPrecipitacionAnt) {
      Precipitacion = cuentaPrecipitacion * 0.1;    // CADA PULSO QUE SE LEA EQUIVALE A 0.1 mm, MULTIPLICO PARA OBTENER EL VALOR REAL
      Serial.print("LLUVIA REGISTRADA = ");
      Serial.print(Precipitacion);
      Serial.println(" mm");

      
    }


}

///////////////////////////////////////////////////////////



 //////////////////////CALCULO DE LAS TEMPERATURAS MAXIMAS Y MINIMAS/////////////////////////
    if(DHT.temperature>=Tmax){
        Tmax=DHT.temperature;
    }
    if(DHT.temperature<=Tmin){
        Tmin=DHT.temperature;
    }
    delay(100);  //ESTE DELAY SERÁ DE 60 MINUTOS (ES DECIR 3.600.000 ms) para monitorizar los valores de HUMEDAD y DE TEMPERATURA CADA HORA
    
}//end for i

  /*  if(DHT.temperature >= 29.00){
      digitalWrite(13, HIGH);
    }else{
      digitalWrite(13, LOW);
      }
*/
    

//RESULTADOS POR PANTALLA//
  Tmedia=Tmedia/24;
  Serial.print("La temperatura media diaria fue de :    ");
  Serial.println(Tmedia);

  Serial.print("TMAX DIARIA = ");
  Serial.print(Tmax); 
  Serial.print(" TMIN DIARIA = ");2
  Serial.print(Tmin);
  Serial.print("\n") ;
  Serial.print("RADIACION SOLAR EXTRATERRESTRE DE :  ");
  Serial.print(Ro*0.408);
  Serial.println("/n mm/dia  ");
  Serial.print("RADIACION SOLAR INCIDENTE DE :   ");
  Rs=Ro*KT*sqrt(Tmax-Tmin);
  Serial.print(Rs);
  Serial.println("/n mm/dia  ");
  Serial.print("LA EVAPOTRANSPIRACION DE ESTE ´DIA ES DE :  ");
  ETo=0.0135*(Tmedia+17.78)*Rs;
  Serial.print(ETo);
  Serial.println("/n mm/dia  ");
  delay(100);
  Tmedia=0;
  Tmax=0;
  Tmin=100;
  Serial.println("");
  ///////////////////////////////////////////////////////////
} //end for j
  Serial.print("LA EVAPOTRANSPIRACION DEL MES FUE DE :   ");
  Serial.print(EToMes);
  Serial.println(" mm/mes ");
  EToMes=0;
  Serial.println("");
}// end for k
}// end loop()

Es decir lo que necesito y no logro arreglar es que este programa en teoría lo que realiza es cada hora calcular la temepratura y humedad de un sensor tras 24 horas lo acumula y caclula la temepratura media, del mismo durante todo ese tiempo un sensor de pluviómetro calcula la lluvia que cae. Como no existen varios hilos en Arduino lo que habia pensado hacer es cada minuto los primeros segundos calcular humedad temepratura y los 58 segundos restantes dejar al programa que vaya calculando constantemente la lluvia que cae ya que no se pueden hacer las dos cosas a la vez, pero claro necesitaría ese bucle durante 60 segundos
Por favor si alguien me lo puede solucionar le estaria muy agradecido

Saludos