Iniciar y finalizar programa pulsando un botón

Hola buenas y como siempre perdón por las molestias.
Estoy intentado hacer un programa que guarda una serie de valores de tensión en una tarjeta sd. Este proceso lo quiero automatizar al máximo y para ello el nombre de cada nuevo archivo .txt se guarda con el nombre(numero). Ahora bien estoy intentando que el programa arranque y pare pulsando un botón y para ello he hecho lo que se ve en el código adjunto. Mi problema es que la función micros() sigue sumando tiempo y me gustaría que esto no ocurriese. Por si no me explico he explicado con claridad me gustaría que el código hiciese lo mismo que cuando lo subes a la placa, es decir iniciarlo desde cero, pero pulsando un botón. ¿Alguna solución?
Estoy utilizando un arduino UNO

#include <SD.h>

File logFile1;

int analogPin= A0;
float Vout=0;
int raw= 0;
unsigned long myTime;
unsigned long delta=0;
unsigned long anterior =0;

int i = 0;
String a ="Boton";
String b = String(i);
String c = ".TXT";
String nombre = a+b+c;


const int LED =3;
const int BOTON = 2;
int val = 0; //val se emplea para almacenar el estado del boton
int state = 0; // 0 LED apagado, mientras que 1 encendido
int old_val = 0; // almacena el antiguo valor de val
int aux = 0;
void setup()
{
  Serial.begin(115200);
  pinMode(LED,OUTPUT); // establecer que el pin digital es una señal de salida
  pinMode(BOTON,INPUT_PULLUP); // y BOTON como señal de entrada
  
}

void loop()
{
  //abrir();
  //programa();
  //cerrar();
  Serial.println("1");
  val= digitalRead(BOTON); // lee el estado del Boton
  if ((val == HIGH) && (old_val == LOW))
  {
    state=1-state;
    //delay(10);
    aux =0;
  }
  else
  {
    aux=1;
  }
  old_val = val; // valor del antiguo estado
  
  if (state==1)
  {
    if(aux==0)
    {
      Serial.println("entra if");
      abrir();
    }
    else
    {
      Serial.println("entra else");
    }
    programa();
    digitalWrite(LED, HIGH); // enciende el LED
    Serial.println("2");
  }
  else
  {
    cerrar();
    digitalWrite(LED,LOW); // apagar el LED
    Serial.println("3");
  }
  //delay(1000);
}

String nombre1()
{
  if(SD.exists(nombre)==1)
  {
    Serial.println("Nombre ocupado");
    i++;
    b=String(i);
    nombre=a+b+c;
  } 
  return nombre;
}
void programa()
{
  myTime =micros();
  delta = myTime-anterior;
  // Serial.println(delta);
  raw= analogRead(analogPin);
  Vout= (raw * 5)/1024.0;
  // Serial.println(Vout);
  if (logFile1) 
  { 
    logFile1.print(myTime);
    logFile1.print(";");
    logFile1.println(Vout);
  } 
  else 
  {
    Serial.println("Error al abrir el archivo 2");
  }

  anterior=myTime;
}
void cerrar()
{
    logFile1.close();
    Serial.println(F("Cerrando SD"));
}
void abrir()
{
  Serial.print(F("Iniciando SD ..."));
  if (!SD.begin(9))
  {
    Serial.println(F("Error al iniciar"));
    return;
  }
  while(SD.exists(nombre)==1)
  {
     nombre=nombre1();
  }
  Serial.println(F("Iniciado correctamente"));
  logFile1 = SD.open(nombre, FILE_WRITE);
}

Guarda el valor de micros() en una variable (supongamos tiempo_0) cada vez que "reinicias" el programa.
Luego en programa()

myTime = micros() - tiempo_0;

Creo que es lo que quieres lograr...

Saludos

Utiliza interrupciones al BOTON y pon a dormir al micro algo parecido a esto:

#include <LowPower.h>

void loop() {
  attachInterrupt(digitalPinToInterrupt(BOTON), ServicioBoton, FALLING);//Asocio interrupcion al pin del boton
  LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);// Duerme el MCU inmediatamente
  // espera dormido sin contar hasta que se pulse el boton
  detachInterrupt(digitalPinToInterrupt(BOTON));//desactivo la interrupcion por si quiero usar el boton para otra cosa
  abrir();
  programa();
  cerrar();
  //al reiniciar el loop se dormira de inmediato sin contar.
}

void ServicioBoton (){
 // no hace nada, o lo hace tu veras
}

Saludos.

A ver como funciona esto, sin tantas variables auxiliares aux que no tienen sentido.

#include <SD.h>

File logFile1;

int analogPin= A0;
float Vout=0;
int raw= 0;
unsigned long myTime;
unsigned long delta=0;
unsigned long anterior =0;

int i = 0;
String a ="Boton";
String b = String(i);
String c = ".TXT";
String nombre = a+b+c;


const int LED =3;
const int BOTON = 2;
int val = 0; //val se emplea para almacenar el estado del boton
int state = 0; // 0 LED apagado, mientras que 1 encendido
int old_val = 0; // almacena el antiguo valor de val

void setup() {
  Serial.begin(115200);
  pinMode(LED,OUTPUT); // establecer que el pin digital es una señal de salida
  pinMode(BOTON,INPUT_PULLUP); // y BOTON como señal de entrada
}

void loop() {
  //abrir();
  //programa();
  //cerrar();
  Serial.println("1");

  val= digitalRead(BOTON); // lee el estado del Boton
  if ((val == HIGH) && (old_val == LOW))   {
      state = 1-state;
      if (state) {
          abrir();
          tiempo_0 = micros();
      }
        
      else { 
        cerrar();
        digitalWrite(LED,LOW); // apagar el LED
        Serial.println("3");
      }
  }
  old_val = val; // valor del antiguo estado
  
  if (state == 1)   {
      programa();
      digitalWrite(LED, HIGH); // enciende el LED
      Serial.println("2");
  }
}

String nombre1() {
  if(SD.exists(nombre) == 1)   {
    Serial.println("Nombre ocupado");
    i++;
    b = String(i);
    nombre=a+b+c;
  } 
  return nombre;
}

void programa() {
  myTime = micros() - tiempo_0;
  delta = myTime-anterior;
  // Serial.println(delta);
  raw= analogRead(analogPin);
  Vout= (raw * 5)/1024.0;
  // Serial.println(Vout);
  if (logFile1)  { 
    logFile1.print(myTime);
    logFile1.print(";");
    logFile1.println(Vout);
  } 
  else  {
    Serial.println("Error al abrir el archivo 2");
  }
  anterior=myTime;
}

void cerrar() {
    logFile1.close();
    Serial.println(F("Cerrando SD"));
}

void abrir() {
  Serial.print(F("Iniciando SD ..."));
  if (!SD.begin(9))   {
    Serial.println(F("Error al iniciar"));
    return;
  }
  while(SD.exists(nombre) == 1)   {
     nombre=nombre1();
  }
  Serial.println(F("Iniciado correctamente"));
  logFile1 = SD.open(nombre, FILE_WRITE);
}

No le he prestado atención a tus impresiones "1", "2", "3"

@Surbyte Te faltó definir tiempo_0

Saludos

Esperaba que trabajara un poco tmb, ya no será posible.

Jajaja. Una definición?
Ok.

Saludos

Acaso no has visto gente que dice... varible not found o not defined?
EDITO: porque no es así, el mensaje de error es

nombre_variable was not declared in this scope

le escribes 50 lineas, te tomas 30 min y te respoden por este error. Por eso decía... un poco de esfuerzo.

Un apunte: estás definiendo la variable "state" a cero inicialmente y cuando óperas con ella haces

  state=1-state;

Que el resultado será también y siempre cero...

Error.

La primera vez

1 - 0 = 1

la siguiente

1 - 1 = 0

y etc..

Sería equivalente a

state = !state;

si state en lugar de ser int (que para mi es un desperdicio de memoria) fuese del tipo bool.

Saludos

correcto @anon90500195 se me fue la olla. eso de que siempre usemos el "not" me chirria verlo así.
Saludos.

Como siempre muchas gracias por tu respuesta. Voy a implementarlo

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.