El código ahora lo tengo así:
#include <SD.h>
#define TOT_LAP_POS 13
#define TOT_TIME_POS 33
#define BEST_LAP_POS 60
#define AVERAGE_POS 83
// Las siguientes se usan en caso de leer el tiempo de una vuelta (número de un dígito)
#define FIRST_LAP_OFFS_T 96
#define LAP_ONE_DIGIT_SIZE 21 // Se deduce desde la 'L' hasta el segundo cambio de línea (segundo "\r\n")
// Las siguientes se usan en caso de leer el tiempo de una vuelta (número de dos dígitos).
// Así se podrían leer hasta 100 vueltas registradas.
#define LAP_TEN_OFFS_T 285
#define LAP_TWO_DIGITS_SIZE 22 // Se deduce desde la 'L' hasta el segundo cambio de línea (segundo "\r\n")
File myFile;
char SES[13];
unsigned long mejor_vuelta = 4294967295UL;
unsigned long tiempo_actual;
unsigned long tiempo_anterior;
unsigned long tiempo_inicial;
unsigned int lap = 1;
void setup() {
Serial.begin(9600);
if (!SD.begin(4)) {
Serial.println("SD fail");
while (1);
}
sd_card_create();
tiempo_anterior = millis();
tiempo_inicial = tiempo_anterior;
}
void loop() {
if (Serial.available()) {
switch (Serial.read()) {
case 'w':
tiempo_actual = millis();
sd_w();
total();
best();
average();
lap_w();
tiempo_anterior = tiempo_actual;
break;
case 'n':
mejor_vuelta = 4294967295UL;
lap = 1;
Serial.println("Crear nuevo archivo.");
sd_card_create();
tiempo_anterior = millis();
tiempo_inicial = tiempo_anterior;
break;
default:
Serial.println("Comando desconocido");
}
Serial.flush();
}
}
void sd_card_create() {
unsigned int num = 1;
Serial.println("Preparando...");
sprintf(SES, "ses%d.txt", num);
while (SD.exists(SES)) {
Serial.print(SES);
Serial.println(" ya existe");
num++;
sprintf(SES, "ses%d.txt", num);
}
Serial.print(SES);
Serial.println(" creado");
myFile = SD.open(SES, FILE_WRITE);
//myFile = SD.open("orenes1.txt", FILE_WRITE);
if (myFile) {
myFile.print(F("Total laps:\r\n000\r\n\r\nTotal time:\r\n00:00:00:000\r\n\r\nBest lap:\r\n00:00:000\r\n\r\nAverage:\r\n00:00:000\r\n\r\n"));
Serial.println("Listo. Introduce comando.");
myFile.close();
}
else {
Serial.println("Error");
}
}
//********************************************************** SD WRITING
void sd_w() {
myFile = SD.open(SES, FILE_WRITE);
myFile.seek(TOT_LAP_POS);
if (lap < 10) {
myFile.print("00");
myFile.print(lap);
}
if (lap > 9 && lap < 100) {
myFile.print("0");
myFile.print(lap);
}
if (lap > 99) {
myFile.print(lap);
}
}
//******************************************************
void total() {
unsigned long m, mu, md, s, su, sd, l, lu, ld, lc, tot;
tot = tiempo_actual - tiempo_inicial;
m = tot / 60000;
mu = m % 10;
md = (m - mu) / 10;
s = (tot / 1000) - (m * 60);
su = s % 10;
sd = (s - su) / 10;
l = tot - (s * 1000) - (m * 60000);
lu = l % 10;
ld = ((l - lu) / 10) % 10;
lc = (l - (ld * 10) - lu) / 100;
myFile.seek(TOT_TIME_POS);
myFile.print(md);
myFile.print(mu);
myFile.print(":");
myFile.print(sd);
myFile.print(su);
myFile.print(":");
myFile.print(lc);
myFile.print(ld);
myFile.print(lu);
}
//******************************************************
void best() {
unsigned long tiempo_vuelta = tiempo_actual - tiempo_anterior;
if (tiempo_vuelta < mejor_vuelta) {
mejor_vuelta = tiempo_vuelta;
unsigned long m, mu, md, s, su, sd, l, lu, ld, lc;
m = mejor_vuelta / 60000;
mu = m % 10;
md = (m - mu) / 10;
s = (mejor_vuelta / 1000) - (m * 60);
su = s % 10;
sd = (s - su) / 10;
l = mejor_vuelta - (s * 1000) - (m * 60000);
lu = l % 10;
ld = ((l - lu) / 10) % 10;
lc = (l - (ld * 10) - lu) / 100;
myFile.seek(BEST_LAP_POS);
myFile.print(md);
myFile.print(mu);
myFile.print(":");
myFile.print(sd);
myFile.print(su);
myFile.print(":");
myFile.print(lc);
myFile.print(ld);
myFile.print(lu);
}
}
//************************************************************
void average() {
unsigned long m, mu, md, s, su, sd, l, lu, ld, lc, media;
media = tiempo_actual - tiempo_inicial / lap;
m = media / 60000;
mu = m % 10;
md = (m - mu) / 10;
s = (media / 1000) - (m * 60);
su = s % 10;
sd = (s - su) / 10;
l = media - (s * 1000) - (m * 60000);
lu = l % 10;
ld = ((l - lu) / 10) % 10;
lc = (l - (ld * 10) - lu) / 100;
myFile.seek(AVERAGE_POS);
myFile.print(md);
myFile.print(mu);
myFile.print(":");
myFile.print(sd);
myFile.print(su);
myFile.print(":");
myFile.print(lc);
myFile.print(ld);
myFile.print(lu);
myFile.close();
}
//***********************************************
void lap_w() {
myFile = SD.open(SES, FILE_WRITE);
if (myFile) {
unsigned long m, mu, md, s, su, sd, l, lu, ld, lc, tiempo_vuelta;
tiempo_vuelta = tiempo_actual - tiempo_anterior;
Serial.print("Tiempo de la vuelta (ms): ");
Serial.println(tiempo_vuelta);
m = tiempo_vuelta / 60000;
mu = m % 10;
md = (m - mu) / 10;
s = (tiempo_vuelta / 1000) - (m * 60);
su = s % 10;
sd = (s - su) / 10;
l = tiempo_vuelta - (s * 1000) - (m * 60000);
lu = l % 10;
ld = ((l - lu) / 10) % 10;
lc = (l - (ld * 10) - lu) / 100;
/*if (lap < 10)
myFile.seek(FIRST_LAP_OFFS_T + (LAP_ONE_DIGIT_SIZE * (lap - 1)));
else if (lap < 100)
myFile.seek(LAP_TEN_OFFS_T + (LAP_TWO_DIGIT_SIZE * (lap - 1)));
else
Serial.println("No se ha programado para leer más de 100 vueltas");*/
myFile.print("Lap ");
myFile.print(lap);
myFile.println(':');
myFile.print(md);
myFile.print(mu);
myFile.print(":");
myFile.print(sd);
myFile.print(su);
myFile.print(":");
myFile.print(lc);
myFile.print(ld);
myFile.println(lu);
myFile.println();
Serial.println("Lap written");
myFile.close();
lap++;
}
}
Y los resultados son los siguientes:
Monitor serie:
Preparando...
ses1.txt ya existe
ses2.txt ya existe
ses3.txt ya existe
ses4.txt creado
Listo. Introduce comando.
Tiempo de la vuelta (ms): 3059
Lap written
Tiempo de la vuelta (ms): 3979
Lap written
Tiempo de la vuelta (ms): 4072
Lap written
Tiempo de la vuelta (ms): 1699
Lap written
Tiempo de la vuelta (ms): 7279
Lap written
Crear nuevo archivo.
Preparando...
ses1.txt ya existe
ses2.txt ya existe
ses3.txt ya existe
ses4.txt ya existe
ses5.txt creado
Listo. Introduce comando.
Tiempo de la vuelta (ms): 2172
Lap written
Tiempo de la vuelta (ms): 4416
Lap written
Tiempo de la vuelta (ms): 2884
Lap written
Tiempo de la vuelta (ms): 3314
Lap written
Tiempo de la vuelta (ms): 2902
Lap written
SES4.TXT
Total laps:
005
Total time:
00:20:088000
Best lap:
00:01:699
Average:
00:21:476
Lap 1:
00:03:059
Lap 2:
00:03:979
Lap 3:
00:04:072
Lap 4:
00:01:699
Lap 5:
00:07:279
SES5.TXT
Total laps:
005
Total time:
00:15:688000
Best lap:
00:02:172
Average:
00:36:236
Lap 1:
00:02:172
Lap 2:
00:04:416
Lap 3:
00:02:884
Lap 4:
00:03:314
Lap 5:
00:02:902
En conclusión: por qué dices que no se escribe bien?
Seguro que la protección contra escritura no te está fastidiando la vida?
PD: por qué en el tiempo total se me están escribiendo más ceros de la cuenta? ![]()