tengo problemas para usar la función millis();

Hola espero esten bien, otra vez yo, avanzo y encuentro mas complicaciones,les platico. Tengo un interruptor que al estar apagado me imprime en el monitor serial "Esta apagado" y tiene un led apagado( muy obvio xD) y cuando activo el interruptor quiero que encienda el led al minuto de haberlo activado, se me ocurria con millis(); guardar el tiempo que lleva el arduino en una variable y en otra sumarle 60000(1 min) para que en un if checara si ya habia llegado al minuto y encendiera el led y me imprimiera que habia pasado un minuto. El problema es que nunca enciende el led, solamente al estar apagado me imprime lo de "Esta apagado", tambien queria sacar el tiempo total que habia estado activado el interruptor, asi que al apagar el interruptor tambien guardaba en otra variable lo que tenia millis(); para sacar una diferencia y tener el tiempo total, eso tampoco me lo imprime, para hacer pruebas quise imprimir las variables donde guardo los tiempos en millis y tampoco me imprime nada, solo el texto. adjunto el codigo y una foto del monitor serial si sirve de algo. Disculpen las molestias, les agradeceria muchisimo cualquier ayuda.

const int pinLed=13;  //Pin del led
const int pinBoton=8;    //Pin del interruptor

 // variables para guardar los valores de los actuadores
           int estadoBoton = 0;    // variable para guardar el estado del interruptor
           int estadoLed   = 0;    // variable para guardar el estado del led 
           
           unsigned long tiempo_inicio=0;    //Variable para guardar el tiempo cuando se enciende el interruptor
           unsigned long tiempo_fin=0;       //Variable para guardar el tiempo cuando se apaga el interruptor
           unsigned long tiempo_encendido=0;       //Variable para la referencia de 1 minuto
           float tiempo_total=0;                   //Variable para el tiempo total que duro encendido el led
           int habilitador=0;                      //habilitador para imprimir el tiempo que estuvo encendido(tiempo_total)
           
void setup() {
// inicializa el pin del led como de salida
             pinMode(pinLed, OUTPUT);
             // inicializa el pin del boton como de entrada    
             pinMode(pinBoton, INPUT);
             Serial.begin(9600);

}

void loop() {
// lee el valor del estado del boton
             estadoBoton = digitalRead(pinBoton); // lee el estado del boton en pinBoton
             // checa si el estado del boton es HIGH 
             if (estadoBoton == HIGH){
              habilitador=1;               //Cuando el interruptor se pone en 1 la primera vez pasa a uno para poder imprimir el tiempo total con un if
              digitalWrite(pinLed, HIGH); // prende el led
             tiempo_inicio= millis();       //guardo el tiempo que lleva al activar el interruptor
             tiempo_encendido=tiempo_inicio+60000;     //sumo el tiempo de inicio y 60000 para tener el equivalente a un minuto
             if(tiempo_inicio>=tiempo_encendido)       //checo si ya paso el minuto
             {
              Serial.println("Pasaron 1 minuto");
             }
             }

 else {
               digitalWrite(pinLed, LOW);  // apaga el led
               Serial.println("Boton apagado no esta contando");
               if(habilitador==1){             //Este es el habilitador para que al activar y desactivar el interruptor realice lo siguiente
                tiempo_fin=millis();           //Guardo el tiempo que llevaba al cerrar el interruptor
                tiempo_total=(((tiempo_fin-tiempo_inicio)/1000)/60.0);        //Hago el calculo de cuanto duro encendido el led 
                Serial.print("tiempo que estuvo encendido:");
                Serial.println(tiempo_total);
                Serial.println(tiempo_inicio);
                Serial.println(tiempo_fin);
                
                }
               
               }            
}

Ivan_Agraz:
Hola espero esten bien, otra vez yo, avanzo y encuentro mas complicaciones,les platico. Tengo un interruptor que al estar apagado me imprime en el monitor serial "Esta apagado" y tiene un led apagado( muy obvio xD) y cuando activo el interruptor quiero que encienda el led al minuto de haberlo activado, se me ocurria con millis(); guardar el tiempo que lleva el arduino en una variable y en otra sumarle 60000(1 min) para que en un if checara si ya habia llegado al minuto y encendiera el led y me imprimiera que habia pasado un minuto. El problema es que nunca enciende el led, solamente al estar apagado me imprime lo de "Esta apagado", tambien queria sacar el tiempo total que habia estado activado el interruptor, asi que al apagar el interruptor tambien guardaba en otra variable lo que tenia millis(); para sacar una diferencia y tener el tiempo total, eso tampoco me lo imprime, para hacer pruebas quise imprimir las variables donde guardo los tiempos en millis y tampoco me imprime nada, solo el texto. adjunto el codigo y una foto del monitor serial si sirve de algo. Disculpen las molestias, les agradeceria muchisimo cualquier ayuda.

const int pinLed=13;  //Pin del led

const int pinBoton=8;    //Pin del interruptor

// variables para guardar los valores de los actuadores
          int estadoBoton = 0;    // variable para guardar el estado del interruptor
          int estadoLed   = 0;    // variable para guardar el estado del led
         
          unsigned long tiempo_inicio=0;    //Variable para guardar el tiempo cuando se enciende el interruptor
          unsigned long tiempo_fin=0;       //Variable para guardar el tiempo cuando se apaga el interruptor
          unsigned long tiempo_encendido=0;       //Variable para la referencia de 1 minuto
          float tiempo_total=0;                   //Variable para el tiempo total que duro encendido el led
          int habilitador=0;                      //habilitador para imprimir el tiempo que estuvo encendido(tiempo_total)
         
void setup() {
// inicializa el pin del led como de salida
            pinMode(pinLed, OUTPUT);
            // inicializa el pin del boton como de entrada    
            pinMode(pinBoton, INPUT);
            Serial.begin(9600);

}

void loop() {
// lee el valor del estado del boton
            estadoBoton = digitalRead(pinBoton); // lee el estado del boton en pinBoton
            // checa si el estado del boton es HIGH
            if (estadoBoton == HIGH){
             habilitador=1;               //Cuando el interruptor se pone en 1 la primera vez pasa a uno para poder imprimir el tiempo total con un if
             digitalWrite(pinLed, HIGH); // prende el led
            tiempo_inicio= millis();       //guardo el tiempo que lleva al activar el interruptor
            tiempo_encendido=tiempo_inicio+60000;     //sumo el tiempo de inicio y 60000 para tener el equivalente a un minuto
            if(tiempo_inicio>=tiempo_encendido)       //checo si ya paso el minuto
            {
             Serial.println("Pasaron 1 minuto");
            }
            }

else {
              digitalWrite(pinLed, LOW);  // apaga el led
              Serial.println("Boton apagado no esta contando");
              if(habilitador==1){             //Este es el habilitador para que al activar y desactivar el interruptor realice lo siguiente
               tiempo_fin=millis();           //Guardo el tiempo que llevaba al cerrar el interruptor
               tiempo_total=(((tiempo_fin-tiempo_inicio)/1000)/60.0);        //Hago el calculo de cuanto duro encendido el led
               Serial.print("tiempo que estuvo encendido:");
               Serial.println(tiempo_total);
               Serial.println(tiempo_inicio);
               Serial.println(tiempo_fin);
               
               }
             
              }            
}

Actualización:
Me di cuenta que la condicion de (tiempo_inicio>=tiempo_encendido) nunca se va a cumplir porque la variable tiempo_inicio en cada loop se actualiza y con ella se actualiza tiempo_encendido(tiempo_encendido=tiempo_inicio+60000;) por lo tanto nunca va a ser mayor porque los dos incrementan a la par, solo que ahora no se donde tenga que leer el tiempo de inicio cuando activo el interruptor o que condición usar para que solo lo guarde la primera vez y no se este sobrescribiendo.

// lee el valor del estado del boton
             estadoBoton = digitalRead(pinBoton); // lee el estado del boton en pinBoton
             // checa si el estado del boton es HIGH 
             if (estadoBoton == HIGH){
              habilitador=1;               //Cuando el interruptor se pone en 1 la primera vez pasa a uno para poder imprimir el tiempo total con un if
              digitalWrite(pinLed, HIGH); // prende el led
             tiempo_inicio= millis();       //guardo el tiempo que lleva al activar el interruptor
             tiempo_encendido=tiempo_inicio+60000;     //sumo el tiempo de inicio y 60000 para tener el equivalente a un minuto
             if(tiempo_inicio>=tiempo_encendido)       //checo si ya paso el minuto

Esta es una posible solución. Dices que quieres que el led se encienda 60 segundos despues pero lo enciendes en cuanto se activa el pulsador. Eso no esta bien.
Luego tu problema está en detectar bien los momentos en que ocurren los eventos.
Eso es falta de práctica, asi que continúa probando estas cosas que ayudan mucho a programar y entender situaciones que deben cumplirse para que otras se den.

const byte pinLed   = 13;    //Pin del led
const byte pinBoton =  8;    //Pin del interruptor

 // variables para guardar los valores de los actuadores
bool estadoBoton     = false;    // variable para guardar el estado del interruptor
bool estadoBotonAnt  = false;    // variable para guardar el estado Anterior del interruptor
bool estadoLed       = false;    // variable para guardar el estado del led 
 
unsigned long tiempo_inicio     = 0;    //Variable para guardar el tiempo cuando se enciende el interruptor
unsigned long tiempo_fin        = 0;    //Variable para guardar el tiempo cuando se apaga el interruptor
unsigned long tiempo_encendido  = 0;    //Variable para la referencia de 1 minuto
float tiempo_total              = 0;    //Variable para el tiempo total que duro encendido el led
bool habilitador                = false;    //habilitador para imprimir el tiempo que estuvo encendido(tiempo_total)
   
void setup() {
    // inicializa el pin del led como de salida
    pinMode(pinLed, OUTPUT);
    // inicializa el pin del boton como de entrada    
    pinMode(pinBoton, INPUT);
    Serial.begin(9600);
}

void loop() {
  // lee el valor del estado del boton
  estadoBoton = digitalRead(pinBoton); // lee el estado del boton en pinBoton
  
  // checa si el estado del boton es HIGH 
  if (estadoBoton && !estadoBotonAnt){ // Interruptor pasa de 0 a 1
      habilitador = 1;                //Cuando el interruptor se pone en 1 la primera vez pasa a uno para poder imprimir el tiempo total con un if
      tiempo_inicio= millis();        //guardo el tiempo que lleva al activar el interruptor
      tiempo_encendido = tiempo_inicio+60000UL;     //sumo el tiempo de inicio y 60000 para tener el equivalente a un minuto
      
  }
  
  if (habilitador) {
      if (millis() >= tiempo_encendido) {        //checo si ya paso el minuto
          Serial.println("Pasaron 1 minuto");
          digitalWrite(pinLed, HIGH);     // prende el led
          habilitador = false;
      }
  }
  
  if (!estadoBoton && estadoBotonAnt) { // interruptor pasa de 1 a 0
      digitalWrite(pinLed, LOW);  // apaga el led
      Serial.println("Boton apagado no esta contando");
      tiempo_fin = millis();           //Guardo el tiempo que llevaba al cerrar el interruptor
      tiempo_total = (((tiempo_fin-tiempo_encendido)/1000)/60.0);        //Hago el calculo de cuanto duro encendido el led 
      Serial.print("tiempo que estuvo encendido:");
      Serial.println(tiempo_total);
      Serial.println(tiempo_inicio);
      Serial.println(tiempo_fin);      
  }            
  estadoBotonAnt = estadoBoton;
}

Yo he hecho varios cambios.
Primer cambio: siempre uso const byte varPin = PIN; para definir piness
No uses ni int ni const int, porque asignas un byte de mas que no tiene sentido.
Ningún arduino tiene mas de 256 pines asi que byte alcanza y como no se modifica, va const o solo #define varPin

Tu setup bien.
En el loop cuando detectas estados del pulsador.
en lo personal funciona muy bien ver los cambios de los pulsadores.
Como el loop se ejecuta muy rápido, tu puedes jugar con situaciones presentes y pasadas por eso uso estadoBoton y estadoBotonAnt
Este ultimo se carga con el valor de estadoBoton pero al final del loop y como lo primero que haces es ver el estado del boton si hay un cambio tendras dos variables con diferentes valores.
Las cambie también a bool porque no hay mas que TRUE y FALSE, no hay 65556 valores posibles como definiéndola como int como hace la mayoría.
Ahora cuando tenemos un cambio como por ejemplo. Accionas el interruptor de modo que pasas de 0 o LOW a 1 o HIGH
Ese cambio inicia todo. Carga la variable timer_encendido con millis mas 60 seg. Pone en 1 habilitador que la redefini como bool tambien pero ahora será mi variable para detectar esos 60 seg posterior y ahi si encender el led.
Finalmente cuando cambies de 1 a 0 el interruptor detienes todo y muestras los resultados.

surbyte:
Esta es una posible solución. Dices que quieres que el led se encienda 60 segundos despues pero lo enciendes en cuanto se activa el pulsador. Eso no esta bien.
Luego tu problema está en detectar bien los momentos en que ocurren los eventos.
Eso es falta de práctica, asi que continúa probando estas cosas que ayudan mucho a programar y entender situaciones que deben cumplirse para que otras se den.

const byte pinLed   = 13;    //Pin del led

const byte pinBoton =  8;    //Pin del interruptor

// variables para guardar los valores de los actuadores
bool estadoBoton     = false;    // variable para guardar el estado del interruptor
bool estadoBotonAnt  = false;    // variable para guardar el estado Anterior del interruptor
bool estadoLed       = false;    // variable para guardar el estado del led

unsigned long tiempo_inicio     = 0;    //Variable para guardar el tiempo cuando se enciende el interruptor
unsigned long tiempo_fin        = 0;    //Variable para guardar el tiempo cuando se apaga el interruptor
unsigned long tiempo_encendido  = 0;    //Variable para la referencia de 1 minuto
float tiempo_total              = 0;    //Variable para el tiempo total que duro encendido el led
bool habilitador                = false;    //habilitador para imprimir el tiempo que estuvo encendido(tiempo_total)
 
void setup() {
   // inicializa el pin del led como de salida
   pinMode(pinLed, OUTPUT);
   // inicializa el pin del boton como de entrada    
   pinMode(pinBoton, INPUT);
   Serial.begin(9600);
}

void loop() {
 // lee el valor del estado del boton
 estadoBoton = digitalRead(pinBoton); // lee el estado del boton en pinBoton
 
 // checa si el estado del boton es HIGH
 if (estadoBoton && !estadoBotonAnt){ // Interruptor pasa de 0 a 1
     habilitador = 1;                //Cuando el interruptor se pone en 1 la primera vez pasa a uno para poder imprimir el tiempo total con un if
     tiempo_inicio= millis();        //guardo el tiempo que lleva al activar el interruptor
     tiempo_encendido = tiempo_inicio+60000UL;     //sumo el tiempo de inicio y 60000 para tener el equivalente a un minuto
     
 }
 
 if (habilitador) {
     if (millis() >= tiempo_encendido) {        //checo si ya paso el minuto
         Serial.println("Pasaron 1 minuto");
         digitalWrite(pinLed, HIGH);     // prende el led
         habilitador = false;
     }
 }
 
 if (!estadoBoton && estadoBotonAnt) { // interruptor pasa de 1 a 0
     digitalWrite(pinLed, LOW);  // apaga el led
     Serial.println("Boton apagado no esta contando");
     tiempo_fin = millis();           //Guardo el tiempo que llevaba al cerrar el interruptor
     tiempo_total = (((tiempo_fin-tiempo_encendido)/1000)/60.0);        //Hago el calculo de cuanto duro encendido el led
     Serial.print("tiempo que estuvo encendido:");
     Serial.println(tiempo_total);
     Serial.println(tiempo_inicio);
     Serial.println(tiempo_fin);      
 }            
 estadoBotonAnt = estadoBoton;
}




Yo he hecho varios cambios.
Primer cambio: siempre uso const byte varPin = PIN; para definir piness
No uses ni int ni const int, porque asignas un byte de mas que no tiene sentido. 
Ningún arduino tiene mas de 256 pines asi que byte alcanza y como no se modifica, va const o solo #define varPin

Tu setup bien.
En el loop cuando detectas estados del pulsador.
en lo personal funciona muy bien ver los cambios de los pulsadores.
Como el loop se ejecuta muy rápido, tu puedes jugar con situaciones presentes y pasadas por eso uso estadoBoton y estadoBotonAnt 
Este ultimo se carga con el valor de estadoBoton pero al final del loop y como lo primero que haces es ver el estado del boton si hay un cambio tendras dos variables con diferentes valores. 
Las cambie también a bool porque no hay mas que TRUE y FALSE, no hay 65556 valores posibles como definiéndola como int como hace la mayoría.
Ahora cuando tenemos un cambio como por ejemplo. Accionas el interruptor de modo que pasas de 0 o LOW a 1 o HIGH
Ese cambio inicia todo. Carga la variable timer_encendido con millis mas 60 seg. Pone en 1 habilitador que la redefini como bool tambien pero ahora será mi variable para detectar esos 60 seg posterior y ahi si encender el led.
Finalmente cuando cambies de 1 a 0 el interruptor detienes todo y muestras los resultados.

Primero que nada gracias por tomarte el tiempo de revisarlo :), lo del led que prendia en cuanto se presionaba el interruptor en realidad no tenia mucha importancia jeje lo puse para ver si estaba en ese ciclo del interruptor activado, me daba cuenta si pasaban los 60 seg por el mensaje que imprimia, el cual nunca pude ver por cierto, estuve haciendole modificaciones veo que mi error si es el que mencionaba antes. El problema es que la variable del tiempo_inicio se sobreescribe cada que da la vuelta el loop por lo tanto la condición nunca se va a cumplir, lo mismo me pasa con el interruptor apagado, la variable tiempo_fin se sobreescribe y el tiempo total se modifica, no se si con las modificaciones que le hiciste pueda funcionar, la verdad me revuelvo mucho con eso de los estados de los pulsadores, por eso hago incapie en que es un interruptor y el estado te lo mantiene hasta que vuelvas a presionarlo, como un on/off tal cual, probare tu programa y te comento que tal me va, de nuevo muchas gracias.

surbyte:
Esta es una posible solución. Dices que quieres que el led se encienda 60 segundos despues pero lo enciendes en cuanto se activa el pulsador. Eso no esta bien.
Luego tu problema está en detectar bien los momentos en que ocurren los eventos.
Eso es falta de práctica, asi que continúa probando estas cosas que ayudan mucho a programar y entender situaciones que deben cumplirse para que otras se den.

const byte pinLed   = 13;    //Pin del led

const byte pinBoton =  8;    //Pin del interruptor

// variables para guardar los valores de los actuadores
bool estadoBoton     = false;    // variable para guardar el estado del interruptor
bool estadoBotonAnt  = false;    // variable para guardar el estado Anterior del interruptor
bool estadoLed       = false;    // variable para guardar el estado del led

unsigned long tiempo_inicio     = 0;    //Variable para guardar el tiempo cuando se enciende el interruptor
unsigned long tiempo_fin        = 0;    //Variable para guardar el tiempo cuando se apaga el interruptor
unsigned long tiempo_encendido  = 0;    //Variable para la referencia de 1 minuto
float tiempo_total              = 0;    //Variable para el tiempo total que duro encendido el led
bool habilitador                = false;    //habilitador para imprimir el tiempo que estuvo encendido(tiempo_total)
 
void setup() {
   // inicializa el pin del led como de salida
   pinMode(pinLed, OUTPUT);
   // inicializa el pin del boton como de entrada    
   pinMode(pinBoton, INPUT);
   Serial.begin(9600);
}

void loop() {
 // lee el valor del estado del boton
 estadoBoton = digitalRead(pinBoton); // lee el estado del boton en pinBoton
 
 // checa si el estado del boton es HIGH
 if (estadoBoton && !estadoBotonAnt){ // Interruptor pasa de 0 a 1
     habilitador = 1;                //Cuando el interruptor se pone en 1 la primera vez pasa a uno para poder imprimir el tiempo total con un if
     tiempo_inicio= millis();        //guardo el tiempo que lleva al activar el interruptor
     tiempo_encendido = tiempo_inicio+60000UL;     //sumo el tiempo de inicio y 60000 para tener el equivalente a un minuto
     
 }
 
 if (habilitador) {
     if (millis() >= tiempo_encendido) {        //checo si ya paso el minuto
         Serial.println("Pasaron 1 minuto");
         digitalWrite(pinLed, HIGH);     // prende el led
         habilitador = false;
     }
 }
 
 if (!estadoBoton && estadoBotonAnt) { // interruptor pasa de 1 a 0
     digitalWrite(pinLed, LOW);  // apaga el led
     Serial.println("Boton apagado no esta contando");
     tiempo_fin = millis();           //Guardo el tiempo que llevaba al cerrar el interruptor
     tiempo_total = (((tiempo_fin-tiempo_encendido)/1000)/60.0);        //Hago el calculo de cuanto duro encendido el led
     Serial.print("tiempo que estuvo encendido:");
     Serial.println(tiempo_total);
     Serial.println(tiempo_inicio);
     Serial.println(tiempo_fin);      
 }            
 estadoBotonAnt = estadoBoton;
}




Yo he hecho varios cambios.
Primer cambio: siempre uso const byte varPin = PIN; para definir piness
No uses ni int ni const int, porque asignas un byte de mas que no tiene sentido. 
Ningún arduino tiene mas de 256 pines asi que byte alcanza y como no se modifica, va const o solo #define varPin

Tu setup bien.
En el loop cuando detectas estados del pulsador.
en lo personal funciona muy bien ver los cambios de los pulsadores.
Como el loop se ejecuta muy rápido, tu puedes jugar con situaciones presentes y pasadas por eso uso estadoBoton y estadoBotonAnt 
Este ultimo se carga con el valor de estadoBoton pero al final del loop y como lo primero que haces es ver el estado del boton si hay un cambio tendras dos variables con diferentes valores. 
Las cambie también a bool porque no hay mas que TRUE y FALSE, no hay 65556 valores posibles como definiéndola como int como hace la mayoría.
Ahora cuando tenemos un cambio como por ejemplo. Accionas el interruptor de modo que pasas de 0 o LOW a 1 o HIGH
Ese cambio inicia todo. Carga la variable timer_encendido con millis mas 60 seg. Pone en 1 habilitador que la redefini como bool tambien pero ahora será mi variable para detectar esos 60 seg posterior y ahi si encender el led.
Finalmente cuando cambies de 1 a 0 el interruptor detienes todo y muestras los resultados.

Ivan_Agraz:
Primero que nada gracias por tomarte el tiempo de revisarlo :), lo del led que prendia en cuanto se presionaba el interruptor en realidad no tenia mucha importancia jeje lo puse para ver si estaba en ese ciclo del interruptor activado, me daba cuenta si pasaban los 60 seg por el mensaje que imprimia, el cual nunca pude ver por cierto, estuve haciendole modificaciones veo que mi error si es el que mencionaba antes. El problema es que la variable del tiempo_inicio se sobreescribe cada que da la vuelta el loop por lo tanto la condición nunca se va a cumplir, lo mismo me pasa con el interruptor apagado, la variable tiempo_fin se sobreescribe y el tiempo total se modifica, no se si con las modificaciones que le hiciste pueda funcionar, la verdad me revuelvo mucho con eso de los estados de los pulsadores, por eso hago incapie en que es un interruptor y el estado te lo mantiene hasta que vuelvas a presionarlo, como un on/off tal cual, probare tu programa y te comento que tal me va, de nuevo muchas gracias.

ACTUALIZACION:
Ya cheque el programa y me funciona de maravilla, solo tengo un problema, necesito que cada minuto me imprima el mensaje de paso un minuto, porque la realidad de este codigo es que lo necesito para presionar el interruptor y que el arduino cada 10 minutos mida con los sensores y guarde los valores en una micro sd hasta que vuelvas a presionar el interruptor, yo para las pruebas use el led y la impresion cada minuto, con tu programa quedo de lujo el problema es que lo hace una sola vez, ¿Hay manera de que lo haga cada 10 minutos al activar el interruptor? Saludos.

tiempo_encendido = tiempo_inicio + 600000UL;   //sumo el tiempo de inicio y 600000 para tener el equivalente a 10 minutos

Solo agregué un cero más y listo :smiley:

Lucario448:

tiempo_encendido = tiempo_inicio + 600000UL;   //sumo el tiempo de inicio y 600000 para tener el equivalente a 10 minutos

Solo agregué un cero más y listo :smiley:

Si eso lo tengo claro :slight_smile: lo que me falta es que al presionar el botón cada 10 minutos me imprima, no solo una vez hasta que vuelva a presionarlo, necesito que sea ciclico,estuve intentando con una variable que sirviera de habilitador, la tenia en false y en un if preguntaba si era false para agregarle el valor de millis(); a tiempo_inicio y despues de eso ponia la variable habilitador en true para que no pudiera volver a entrar a ese if y entrara al if de cuando el interruptor esta apagado y me agregara millis(); en tiempo_fin y posteriormente de nuevo poner en false el habilitador, esto lo hago para que en los ciclos solo haga una vez la inicializacion de tiempo_inicio y tiempo_fin, no se si me explique pero adjunto codigo con comentarios para que sea un poco mas sencillo.

const byte pinLed=13;  //Pin del led
const byte pinBoton=8;    //Pin del interruptor

 // variables para guardar los valores de los actuadores
           bool estadoBoton = false;    // variable para guardar el estado del interruptor
           bool estadoLed   = false;    // variable para guardar el estado del led 
           
           unsigned long tiempo_inicio=0;    //Variable para guardar el tiempo cuando se enciende el interruptor
           unsigned long tiempo_fin=0;       //Variable para guardar el tiempo cuando se apaga el interruptor
           unsigned long tiempo_encendido=0;       //Variable para la referencia de 5 minutos
           float tiempo_total=0;                   //Variable para el tiempo total que duro encendido el led
           bool habilitador=false;                      //habilitador para imprimir el tiempo que estuvo encendido(tiempo_total)
           bool bit_inicio=false;
           bool bit_fin=true;
           
void setup() {
// inicializa el pin del led como de salida
             pinMode(pinLed, OUTPUT);
             // inicializa el pin del boton como de entrada    
             pinMode(pinBoton, INPUT);
             Serial.begin(9600);

}

void loop() {
// lee el valor del estado del boton
             estadoBoton = digitalRead(pinBoton); // lee el estado del boton en pinBoton
             // checa si el estado del boton es HIGH 
             if (estadoBoton == HIGH){
              habilitador=1;               //Cuando el interruptor se pone en 1 la primera vez pasa a uno para poder imprimir el tiempo total con un if
             
              digitalWrite(pinLed, HIGH); // prende el led
              if(bit_inicio==false){           //Este es para que la primera vuelta del loop que estuvo activado el interruptor si me inicialice tiempo_inicio=millis(); 
             tiempo_inicio= millis();       //guardo el tiempo que lleva al activar el interruptor
             
             bit_inicio==true;                      //Las siguientes vueltas que de el loop con el interruptor activado 
                                                    //no inicializara otra vez tiempo_inicio hasta que hayan desabilitado el interruptor
              }
              
             tiempo_encendido=tiempo_inicio+60000;     //sumo el tiempo de inicio y 60000 para tener el equivalente a un minuto
             if(tiempo_inicio>=tiempo_encendido)       //checo si ya paso el minuto
             {
              Serial.println("Paso 1 minuto");
             }
             }

 else {        
  
               digitalWrite(pinLed, LOW);  // apaga el led
               Serial.println("Boton apagado no esta contando");
               if(habilitador==1){             //Este es el habilitador para que al activar y desactivar el interruptor realice lo siguiente
               if(bit_inicio==true){           //Aqui es para el caso de que ya entro al if del interruptor activado y bit_inicio quedo con true
                tiempo_fin=millis();           //Guardo el tiempo que llevaba al cerrar el interruptor
                bit_inicio=false;              //Aqui lo vuelvo a hacer false para que solo la primera vuelta con el interruptor apagado me inicialice tiempo_fin
               }
                tiempo_total=(((tiempo_fin-tiempo_inicio)/1000)/60.0);        //Hago el calculo de cuanto duro encendido el led 
                Serial.print("tiempo que estuvo encendido:");
                Serial.println(tiempo_total);
                Serial.println(tiempo_inicio);
                Serial.println(tiempo_fin);
                
                }
  }
                          
}

si el proyecto va a estar encendido muchos dias ,millis() puede desbordar ,para evitar un mal funcionamiento siempre es mejor usar millis() asi:

if(TIEMPO_ANTERIOR - millis() > INTERVALO)
bit_inicio==true // Compara la variable
bit_inicio=true // Asigna true a la variable

Ahí encontré este error.

Ahora mismo no estoy en casa, entonces más tarde revisaré el código completo a ver si algo más está mal.

Revisar código en un teléfono celular es muy difícil... :confused:

Bueno ya le diste el dato Lucario, deja que trabaje un poco el interesado.

jose:
si el proyecto va a estar encendido muchos dias ,millis() puede desbordar ,para evitar un mal funcionamiento siempre es mejor usar millis() asi:

if(TIEMPO_ANTERIOR - millis() > INTERVALO)

gracias por la info, aunque en este caso no es problema, es para un dispositivo de una bicicleta, no creo que esten sin parar 50 dias en la bicicleta xD

surbyte:
Bueno ya le diste el dato Lucario, deja que trabaje un poco el interesado.

Lo siento por preguntar tanto, no es que se interesado, pasa que tengo que entregar mi proyecto este viernes y nunca he usado arduino estoy perdido, lo siento

Ivan_Agraz:
Lo siento por preguntar tanto, no es que se interesado, pasa que tengo que entregar mi proyecto este viernes y nunca he usado arduino estoy perdido, lo siento

Bueno pues en ese caso... prueba esto:

const byte pinLed = 13; //Pin del led
const byte pinBoton = 8;  //Pin del interruptor

// variables para guardar los valores de los actuadores
// bool estadoBoton = false;    // variable para guardar el estado del interruptor (en desuso)
// bool estadoLed   = false;    // variable para guardar el estado del led (en desuso)

unsigned long tiempo_inicio = 0;  // Variable para guardar el tiempo cuando se enciende el interruptor
unsigned long tiempo_fin = 0;     // Variable para guardar el tiempo cuando se apaga el interruptor
unsigned long tiempo_encendido = 0;     // Variable para la referencia de 10 minutos
const unsigned long intervalo = 600000UL; // Intervalo del temporizador. 10 * 60 * 1000 (minutos * segundos/minuto * milisegundos/segundo)
// El sufijo UL se utiliza para que el compilador entienda que este valor es de un "unsigned long" y no de un "int".

float tiempo_total = 0;                 //Variable para el tiempo total que duro encendido el led
bool habilitador = false;               //habilitador para imprimir el tiempo que estuvo encendido(tiempo_total)
bool bit_inicio = false;                // "Bandera" para evitar que los bloques de código se repitan si el interruptor no ha cambiado de estado
// bool bit_fin = true; // (en desuso)

void setup() {
  // inicializa el pin del led como de salida
  pinMode(pinLed, OUTPUT);
  // inicializa el pin del boton como de entrada
  pinMode(pinBoton, INPUT);
  Serial.begin(9600);

}

void loop() {
  // ESTE BLOQUE IF APLICA SOLO PARA PULSADORES.
  // SI LO TIENES EN UN INTERRUPTOR QUE NO RETORNA AL SOLTARLO; ENTONCES LA CONDICIÓN DE ESTE IF TENDRÁ QUE IR EN EL SEGUNDO, COMENTAR LA
  // DECLARACIÓN DE LA VARIABLE "habilitador", Y ELIMINAR ESTE BLOQUE.
  if (digitalRead(pinBoton) == HIGH) { // lee el valor del estado del boton y checa si el estado del boton es HIGH
    habilitador = !habilitador;
    // Invierte el estado de esta "bandera" cada vez que el botón sea presionado
  }

  if (habilitador) { // Si el habilitador está activado, empieza la cuenta
    if (!bit_inicio) {       //Este es para que la primera vuelta del loop que estuvo activado el interruptor si me inicialice tiempo_inicio=millis();
      digitalWrite(pinLed, HIGH); // prende el led
      tiempo_inicio = millis();      //guardo el tiempo que lleva al activar el interruptor
      tiempo_encendido = tiempo_inicio;
      bit_inicio = true;  // Antes decía "bit_inicio == true;", por eso seguro que no funcionaba.
      //Las siguientes vueltas que de el loop con el interruptor activado no inicializara otra vez tiempo_inicio hasta que hayan desabilitado el interruptor
    }

    if (millis() - tiempo_encendido >= intervalo)    //checo si ya pasaron los 10 minutos
    {
      Serial.println("Pasaron 10 minutos");
      tiempo_encendido = millis();
    }
  } else {
    Si el habilitador NO está activado, termina la cuenta
    if (bit_inicio) {
      tiempo_fin = millis();         //Guardo el tiempo que llevaba al cerrar el interruptor
      digitalWrite(pinLed, LOW);  // apaga el led
      Serial.println("Boton apagado no esta contando");
      tiempo_total = (((tiempo_fin - tiempo_inicio) / 1000) / 60.0); //Hago el calculo de cuanto duro encendido el led
      Serial.print("Tiempo que estuvo encendido (en minutos):");
      Serial.println(tiempo_total);
      Serial.println(tiempo_inicio); // tiempo en que se inició la cuenta (en milisegundos)
      Serial.println(tiempo_fin); // tiempo en que se terminó la cuenta (en milisegundos)
      bit_inicio = false; // Evitar repetir este bloque en caso de el interruptor siga en este estado
    }
  }
}

Le he hecho unas cuantas modificaciones, en los comentarios te darás cuenta... :smiley:

Lucario448:

bit_inicio==true // Compara la variable

bit_inicio=true // Asigna true a la variable



Ahí encontré este error.

Ahora mismo no estoy en casa, entonces más tarde revisaré el código completo a ver si algo más está mal.

Revisar código en un teléfono celular es muy difícil... :confused:

Muchas gracias por tu ayuda Lucario en verdad :slight_smile:

Lucario448:
Bueno pues en ese caso... prueba esto:

const byte pinLed = 13; //Pin del led

const byte pinBoton = 8;  //Pin del interruptor

// variables para guardar los valores de los actuadores
// bool estadoBoton = false;    // variable para guardar el estado del interruptor (en desuso)
// bool estadoLed   = false;    // variable para guardar el estado del led (en desuso)

unsigned long tiempo_inicio = 0;  // Variable para guardar el tiempo cuando se enciende el interruptor
unsigned long tiempo_fin = 0;     // Variable para guardar el tiempo cuando se apaga el interruptor
unsigned long tiempo_encendido = 0;     // Variable para la referencia de 10 minutos
const unsigned long intervalo = 600000UL; // Intervalo del temporizador. 10 * 60 * 1000 (minutos * segundos/minuto * milisegundos/segundo)
// El sufijo UL se utiliza para que el compilador entienda que este valor es de un "unsigned long" y no de un "int".

float tiempo_total = 0;                 //Variable para el tiempo total que duro encendido el led
bool habilitador = false;               //habilitador para imprimir el tiempo que estuvo encendido(tiempo_total)
bool bit_inicio = false;                // "Bandera" para evitar que los bloques de código se repitan si el interruptor no ha cambiado de estado
// bool bit_fin = true; // (en desuso)

void setup() {
 // inicializa el pin del led como de salida
 pinMode(pinLed, OUTPUT);
 // inicializa el pin del boton como de entrada
 pinMode(pinBoton, INPUT);
 Serial.begin(9600);

}

void loop() {
 // ESTE BLOQUE IF APLICA SOLO PARA PULSADORES.
 // SI LO TIENES EN UN INTERRUPTOR QUE NO RETORNA AL SOLTARLO; ENTONCES LA CONDICIÓN DE ESTE IF TENDRÁ QUE IR EN EL SEGUNDO, COMENTAR LA
 // DECLARACIÓN DE LA VARIABLE "habilitador", Y ELIMINAR ESTE BLOQUE.
 if (digitalRead(pinBoton) == HIGH) { // lee el valor del estado del boton y checa si el estado del boton es HIGH
   habilitador = !habilitador;
   // Invierte el estado de esta "bandera" cada vez que el botón sea presionado
 }

if (habilitador) { // Si el habilitador está activado, empieza la cuenta
   if (!bit_inicio) {       //Este es para que la primera vuelta del loop que estuvo activado el interruptor si me inicialice tiempo_inicio=millis();
     digitalWrite(pinLed, HIGH); // prende el led
     tiempo_inicio = millis();      //guardo el tiempo que lleva al activar el interruptor
     tiempo_encendido = tiempo_inicio;
     bit_inicio = true;  // Antes decía "bit_inicio == true;", por eso seguro que no funcionaba.
     //Las siguientes vueltas que de el loop con el interruptor activado no inicializara otra vez tiempo_inicio hasta que hayan desabilitado el interruptor
   }

if (millis() - tiempo_encendido >= intervalo)    //checo si ya pasaron los 10 minutos
   {
     Serial.println("Pasaron 10 minutos");
     tiempo_encendido = millis();
   }
 } else {
   Si el habilitador NO está activado, termina la cuenta
   if (bit_inicio) {
     tiempo_fin = millis();         //Guardo el tiempo que llevaba al cerrar el interruptor
     digitalWrite(pinLed, LOW);  // apaga el led
     Serial.println("Boton apagado no esta contando");
     tiempo_total = (((tiempo_fin - tiempo_inicio) / 1000) / 60.0); //Hago el calculo de cuanto duro encendido el led
     Serial.print("Tiempo que estuvo encendido (en minutos):");
     Serial.println(tiempo_total);
     Serial.println(tiempo_inicio); // tiempo en que se inició la cuenta (en milisegundos)
     Serial.println(tiempo_fin); // tiempo en que se terminó la cuenta (en milisegundos)
     bit_inicio = false; // Evitar repetir este bloque en caso de el interruptor siga en este estado
   }
 }
}



Le he hecho unas cuantas modificaciones, en los comentarios te darás cuenta... :D

Wow y yo que creo que ya lo habia solucionado, checare tu codigo y te aviso cuando este funcionando perfecto, ahorita solo tengo un error de que solo a la primera vez que habilito el interruptor mide cada minuto, si lo apago y vuelvo a encender me sigue contando el tiempo bien pero ya no me imprime cada minuto, muchisimas gracias por toda tu ayuda :smiley: te confirmo cuando funcione.

} else {
    // Si el habilitador NO está activado, termina la cuenta
    if (bit_inicio) {

En esta parte del código, la segunda línea del cuadro no está comentada. Si no se comenta, no hay compilación...

Mi error... :sweat_smile:

Lucario448:

} else {

// Si el habilitador NO está activado, termina la cuenta
    if (bit_inicio) {



En esta parte del código, la segunda línea del cuadro no está comentada. Si no se comenta, no hay compilación...

Mi error... :sweat_smile:

Jaja ya veo, no hay problema :smiley: