Buenas, estoy haciendo un cronómetro para motos de circuito y no tengo claro el código para las horas, todo lo demás funciona bien ya que lo cogí de otro lado. ¿Podría alguien ayudarme?
tiempo = millis() - inicio;
h = tprueba/3600000;
hu = h % 10;
hd = (h - hu)/10;
m = (tprueba / 60000) - (h * 60);
mu = m % 10;
md = (m - mu) / 10;
s = (tprueba / 1000) - (m * 60);
su = s % 10;
sd = (s - su) / 10;
l = tprueba - (s * 1000) - (m * 60000);
lu = l % 10;
ld = ((l - lu) / 10) % 10;
lc = (l - (ld * 10) - lu) / 100;
Para poder analizar el código y comprobar si debe funcionar deberias:
Decirnos si has llegado a probar el código.
Poner el programa completo
Añadirle los comentarios suficientes como para entender el propósito
Porque, a modo de ejemplo, en el fragmento que posteas aparece "tiempo" ¿ para que lo usas ?, ¿ que es "tprueba" ?, ¿ que son el conjunto: "l", "lu", "ld" y "lc" ?
Enfin que así es complicado contestar a tu pregunta.
// La conversión de unidades se hace en cascada; de la unidad más pequeña hasta la más grande
unsigned long tiempo = (millis() - inicio) / 1000; // Pasamos a "nivel" de segundos porque no necesitamos los milisegundos.
byte segundos = tiempo % 60; // tiempo % unidades pequeñas que equivalen a una de la siguiente; en este caso, 60 segundos = 1 minuto
tiempo /= 60; // Subir el valor a "nivel" de minutos
byte minutos = tiempo % 60; // Aquí porque 60 minutos = 1 hora
byte horas = tiempo / 60; // No vamos a calcular días, por eso la última unidad a calcular, siempre acaba con una división.
Para poder analizar el código y comprobar si debe funcionar deberias:
Decirnos si has llegado a probar el código.
Poner el programa completo
Añadirle los comentarios suficientes como para entender el propósito
Porque, a modo de ejemplo, en el fragmento que posteas aparece "tiempo" ¿ para que lo usas ?, ¿ que es "tprueba" ?, ¿ que son el conjunto: "l", "lu", "ld" y "lc" ?
Enfin que así es complicado contestar a tu pregunta.
Saludos.
Tiempo es lo que viene del cronómetro real, tprueba es un número que yo puse para hacer comprobaciones para ver si escribía bien, el conjunto l, lu, ld y lc son los milisegundos y sus unidades en cada posición, lunidades, ldecenas y lcentenas.
En la versión original, las horas no las llevaba y yo se las puse pero no va bien ya que en segundos me pone de más, pero la original funciona bien, yo lo uso para guardar la información en la SD.
void total_s(){
tprueba=7251354;
myFile = SD.open(ses, FILE_WRITE);
if (myFile) {
Serial.println(tiempo_actual);
h = tprueba/3600000;
hu = h % 10;
hd = (h - hu)/10;
m = (tprueba / 60000) - (h * 60);
mu = m % 10;
md = (m - mu) / 10;
s = (tprueba / 1000) - (m * 60);
su = s % 10;
sd = (s - su) / 10;
l = tprueba - (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(hd);
myFile.print(hu);
myFile.print(":");
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.flush();
myFile.flush();
}
TOT_TIME_POS es la posición del txt que tiene que reescribir.
Bueno ya lo he solucionado, este es la parte original:
m = (tprueba / 60000) - (h * 60);
mu = m % 10;
md = (m - mu) / 10;
s = (tprueba / 1000) - (m * 60);
su = s % 10;
sd = (s - su) / 10;
l = tprueba - (s * 1000) - (m * 60000);
lu = l % 10;
ld = ((l - lu) / 10) % 10;
lc = (l - (ld * 10) - lu) / 100;
Pero al añadirle la horas y restárselas a los minutos, una vez usados los minutos para imprimirlos, vuelvo a sumárselo para que funcionen bien para los segundos.
Quedaría así:
h = tprueba/3600000;
hu = h % 10;
hd = (h - hu)/10;
m = (tprueba / 60000) - (h * 60);
mu = m % 10;
md = (m - mu) / 10;
m = m + (h * 60);
s = (tprueba / 1000) - (m * 60);
su = s % 10;
sd = (s - su) / 10;
l = tprueba - (s * 1000) - (m * 60000);
lu = l % 10;
ld = ((l - lu) / 10) % 10;
lc = (l - (ld * 10) - lu) / 100;
Dejo la solución así para quien quiera usarlo en un lcd o para imprimir en una SD:
tiempo = millis() - inicio;
h = tiempo/3600000;
hu = h % 10;
hd = (h - hu)/10;
m = tiempo / 60000;
mu = m % 10;
md = (m - mu) / 10;
m = m + (h * 60);
s = (tiempo / 1000) - (m * 60);
su = s % 10;
sd = (s - su) / 10;
l = tiempo - (s * 1000) - (m * 60000);
lu = l % 10;
ld = ((l - lu) / 10) % 10;
lc = (l - (ld * 10) - lu) / 100;
lcd.setCursor(0, 0);
lcd.print(hd);
lcd.print(hu);
lcd.print(":");
lcd.print(md);
lcd.print(mu);
lcd.print(":");
lcd.print(sd);
lcd.print(su);
lcd.print(":");
lcd.print(lc);
lcd.print(ld);
lcd.print(lu);
Lucario448:
Espera un momento... ¿no habías aclarado este asunto hace tiempo?
¿Recuerdas? Fui yo quién te había ayudado con ese "datalogger" de cronómetro... :
Claro que me acuerdo y te agradezco mucho tu ayuda.
En una parte si, pero tenía problemas con la SD y resultó que era problema del arduino nano, que se quedaba muy corto en prestaciones y producía reinicios y muchos fallos, y durante algún mes por ahí buscando un sustituto, encontré el ESP-8266 que cumple con mis exigencias, en febrero empecé a hacer la migración de un micro al otro hasta que ha quedado funcionando mejor.
Y si no pasa nada, este domingo voy a probarlo en una moto de un amigo a ver que tal funciona todo.
Hola disculpa que te moleste, tenes el código completo del programa o al menos del cronómetro? Donde defines las variables, el void setup y el loop. Porque necesito hacer un programa que realice acciones de acuerdo al tiempo que pasa el cuál demora unas horas y todavía no pude hacer andar bien ningún cronómetro de los que encontré al andar mal. Desde ya muchas gracias.
No revivas hilos viejos con mas de 120 sin movimiento tal como la advertencia en letras rojas dice. Lee las normas del foro y crea un hilo con tu consulta y si te interesa este hilo, pon una referencia al mismo.