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);
}
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
}
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"