Código para llamar el ultimo valor

Hola, que tal, aquí con otra duda.

Lo que pasa es que tengo un proyecto, en el que tengo un contador de segundos de uso de una maquinaria, pero solo le puse que me apareciera los minutos y horas para guardar en un memoria SD, pero me aparecen todos los minutos consecutivos y lo que yo quiero es que el ultimo valor que guarde al desconectar el arduino o quite la SD, sea lo unico que me guarde en la SD.

que tengo que poner para que me guarde el ultimo registro de tiempo.

#include <SD.h>
int sec=00;
int min=00;
int hr=00;
File myFile;

void setup(){
  Serial.begin(9600);
  //run to
  if(!SD.begin()){
    //Serial.print("No se pudo inicializar");
    return;
  }
}

void loop(){  
  myFile = SD.open("TEST.txt",FILE_WRITE); //se abré el archivo 
  if (myFile){
    Serial.print(min);
    myFile.print(min);
    Serial.print("hr");
    myFile.print("hr");
    Serial.print(":");
    myFile.print(":");
    Serial.print(sec);
    myFile.print(sec);
    Serial.print("min,");
    myFile.print("min,");
    Serial.println();
  
    myFile.println();
    myFile.close(); //se cierra el archivo

  }else{
    //Serial.print("Error");
  }
  sec = sec+1;
  delay(60000);

  if(sec==60){
    sec=00;
    min=min+1;
  }
  else;
  if(min==60){
    min=0;
    hr=hr+1;
  }
  else;
  
}

lo que yo quiero es que el ultimo valor que guarde al desconectar el arduino o quite la SD, sea lo unico que me guarde en la SD.

  1. Guardar el momento en el que desconectaste Arduino implica reconocer dicho momento.
    Como pretendes hacerlo?
    Hay que detectar que el Arduino se queda sin enegía, y darle tiempo para que pueda almacenar la info en la SD.
    Eso implica armar un battery backup para que arduino siga funcionando unos milisegundos, guardar el datos y entonces listo.

  2. Guardar el momento en que quitas la SD como dije arriba también requiere detectarlo.
    Para ello el adaptador SD dispone de un switch pero no siempre esta disponible su lectura.

Qué módulo estas usando?

1.- El modulo que utilizo ahorita es el Uno, pero lo cambiare a un Nano, pero mientras lo que quiero es que me corra bien el programa en el Uno.

Pero como hago para reconocer el momento en que se apague ?
por que ya hice que me imprimiera los minutos.
digamos que de...
"1hr:39min"
"1hr:40min"
"1hr:41min"
"1hr:42min"

solo quiero el de "1hr:42min".....

2.- El switch lo utilizo cuando energizo el equipo y al apagarse se apagar el arduino. eso me serviria para guardar o finalizar la lectura.

Por lo visto no entendiste lo que te escribí.
Para saber cuando se apaga el arduino tienes que detectar que se cortó la energía!!
Como lo detectas?
Tienes algo que mira la salida de la fuente pero tambien tiene que tener algo que SOSTENGA al arduino con una fuente alterna para que pueda seguir funcionando sino es el huevo o la gallina.

Una forma simple es tener un capacitor de gran valor, prueba con 4700uF 16V conectado entre VCC y GND.
Cuando se corte la energía detectas el momento (ya veremos cómo?) y el capacitor te devuelve carga por algunos milisegundos suficienes para hacer lo que quires.

La forma de detectar si hay o no energía es fácil, depende de como alimentes arduino. Olvida el USB eso no es válida como opción
Se supone que lo alimentas sea por VIN o por conector externo.
Asi que deberías tener un divisor resistivo conectado en paralelo con el positivo/negativo que entra al conector o a VIN y entonces te darás cuenta que la tensión cae por debajo de digamos 4.7V. Cuando eso ocurra automáticamente guardas el dato en tu SD y luego dejas que se agote la carga.

El switch lo utilizo cuando energizo el equipo y al apagarse se apagar el arduino. eso me serviria para guardar o finalizar la lectura.

Hasta ahora leo esto.. olvida lo anterior.

y para que le quitas energia al Arduino, si se puede saber?

ah ok ok, ya entendi, perfecto. gracias

ahora tengo otra duda.

1.- Como puedo hacer que del ultimo valor guardado en la memoria de SD, continúe su curso???
digamos que se quedo en "1hr:28min"

como puedo hacer que de ese valor guardado continue su curso aun cuando se desenergice y se vuelva a energizar para que siga contando.??

2.- es que trato de hacer un horometro de un equipo, que me marque el tiempo de uso.

Para ello tendras que leer lo que guardaste en la SD y seguir desde ahi. cargando ese tiempo en tu timer y continuar a partir de ese valor inicial.

es lo que eh intentado, pero con este código que tengo no puedo llamar al ultimo valor

me podrías ayudar en que estoy mal dentro del código??
por que trato de llamar al ultimo pero no me lo hace...

 #include <SD.h>
int sec=00;
int min=00;
int hr=00;
int ultimo;
int tc=0;
char caracter;
File myFile;


void setup(){
  Serial.begin(9600);
  //run to
  if(!SD.begin()){
    Serial.print("No se pudo inicializar");
    return;
  }
  myFile = SD.open("TEST.txt");
  int totalbytes=myFile.size();
  String Cadena="";
  
  if (myFile){
    
    if(ultimo>=totalbytes) ultimo=myFile;//ultimo>=totalbytes   ultimo=0;
    myFile.seek(ultimo);
    
    while(myFile.available()){
      caracter=myFile.read();
      Cadena=Cadena+caracter;
      //ultimo=myFile.position();
      tc=5;//=totalbytes-10;
      if(caracter==10)//if((caracter>tc) && (caracter<=totalbytes))
      {
        break;
      }
    }
    myFile.close();
    Serial.print("Total:");
    Serial.print(ultimo);
    //Serial.print("TC:");
    //Serial.print(tc);
  }else{
    Serial.print("Error");
  }
}

void loop(){  
  
  myFile = SD.open("TEST.txt",FILE_WRITE); //se abré el archivo 
  if (myFile){
    Serial.print(min);
    myFile.print(min);
    Serial.print("hr");
    Serial.print(":");
    myFile.print(":");
    Serial.print(sec);
    myFile.print(sec);
    Serial.print("min,");
    Serial.println();
  
    myFile.println();
    myFile.close(); //se cierra el archivo

  }else{
    Serial.print("Error");
  }
  sec = sec+1;
  delay(60000);

  if(sec==60){
    sec=00;
    min=min+1;
  }
  else;
  if(min==60){
    min=0;
    hr=hr+1;
  }
  else;
  
}

Bien, ya que tu arduino se energiza y se apaga con la máquina me parece mas oportuno usar millis() para llevar la cuenta. Ya veremos donde lo guardamos pero millis() es un reloj interno que te da el tiempo en milisegndos desde que arranca el Arduino y cuando se apaga bueno, obvio no lleva mas la cuenta.

Ahora bien, cada vez que arranques arduino leeríamos ese dato, lo sumamos al arranque de millis() o no nos preocupamos hasta el momento de que se vaya a apagar la maquina entonces en lugar de guardar el dato actual sumamos el anterior acumulado mas el nuevo y tenemos el total.

Eso resuelve tu contador de tiempo de marcha.
Para mi lo mas simple es que uses un switch conectado al Arduino y que éste comande un RELE que encienda la máquina (esperando que esto no genere ruido que dispare el arduino) y entonces cuando lo vayas a apagar, simplemente lo haces desde el switch que le dara la orden de guardar el dato primero tal como lo explique antes y luego apagaras el rele y por consiguiente la máquina

Mas simple imposible.

El unico detalle es este: millis() presesta un overflow a los 49 dias 17hs. Si la cuenta de tu maquina supera ese valor entonces debemos usar un sumador de 64 bits, sino no hariamos cambios.

Te escucho a ver que opinas.

ya tengo el sistema con la llave principal que al prenderse, energiza el arduino y al apagarse lo des-energiza.

Internamente en el programa, almacena la información en una micro SD cada minuto (lo puedo hacer cada 10 min o mas).

Lo que no eh podido conseguir es que a la hora de energizarlo de nuevo, no me resetee el contador, si no lo que quiero es que de la hora guardada en el que se quedo energizado y fue apagado y se guardo en la micro SD, al energizarlo nuevamente, continué con ese valor guardado y no comience desde "0hrs:00min"

Bueno pero no te cuesta nada hacer lo que yo te digo.
El arduino simplemente mira el switch, y controla la máquiina, asi no tienes que agregar nada para detectar el corte de energia.

Mejor imposible.

Buen día Blackhorsettc quisiera saber si lograste hacer que funcionara correctamente.

Tienes el mismo problema?