Perdida de tiempo en cronometro sin RTC

Buenos dias, espero estar siguiendo las reglas del foro para esta consulta

Estoy teniendo un problema con un cronometro que hice con mega 2560 ch340, consta de 2 led de 7 segmentos con 4 digitos y dos pulsadores (uno para incio y parada y el otro para tiempo de vuelta y reset)

El funcionamiento del mismo es el siguiente:
Boton de inicio: inicia cronometro y se muestra en el primer led
Boton de tiempo de vuelta: reinicia el tiempo del primer led, pero imprime el tiempo donde se presiono en el segundo, a la vez que agrega una unidad al led de 2 digitos para representar la vuelta

El problema en si es que estoy perdiendo mucho tiempo, haciendo el control, por cada minuto pierdo 500 milesiegundos de segundo, por ejemplo:

Conometro real: 01:00.00
Conometro arduino: 00:59.500

Es el primer proyecto que realizo, e tenido ayuda externa, pero no sabemos porque tenemos tanta diferencia (estuve leyendo en el foro que podria haber usado un rtc, pero no pense que fuera necesario ya que no es un cronometro para usar por horas, sino para marcar como maximo 20 minutos, pero justamente en este caso, pierdo como 10 seg)

Les comparto el codigo

void loop() {
  // put your main code here, to run repeatedly:
  time = millis();
  milis = time / 100 % 10;
  segs = time / 1000 % 10;
  segsDec = time / 10000 % 6;
  mins = time / 60000 % 10;

  int num = mins * 1000 + segsDec * 100 + segs * 10 + milis;
  int numStop = (savedMillis / 60000 % 10) * 1000 + (savedMillis / 10000 % 6) * 100 + (savedMillis / 1000 % 10) * 10 + (savedMillis / 100 % 10);
  //Serial.println(mins * 1000 + segsDec * 100 + segs * 10 + milis);

Quiero ver si es posible bajar ese valor, sin agregar rtc

Si tengo algun error en la confección del post, disculpen, y tratare de editarlo.

muchas gracias!

El código se ve bien, y aunque refreshDisplay() contiene algunos delayMicroseconds() que dependen del valor de brightness eso no parece afectar.

Seguramente el retraso (<1%) es inherente a la imprecision de millis().

Te puedo sugerir que apliques un factor de corrección, una vez que ya has identificado de cuánto es el retraso:


void loop() {
  // put your main code here, to run repeatedly:

  // calculo de factor de calibracion basado en cronometraje externo durante un minuto
  const float miliSegundosCronometrados = 59500.0;
  const float MINUTO = 60.0 * 1000;
  const float calibracion = MINUTO / miliSegundosCronometrados;
  time = calibracion * millis();

  milis = time / 100 % 10;
  segs = time / 1000 % 10;
  segsDec = time / 10000 % 6;
  mins = time / 60000 % 10;
1 Like

Muchas gracias, voy a hacer la prueba

Solucionado, muchas gracias!!!!!

Moderador:
Para la próxima no postees solo una parte del código, siempre postea completo.
El resto bien.

Hola @jonicora. Me extraña muchísimos que el cristal del oscilador del Arduino tenga semejante retraso. Estoy seguro de que el problema está en tu programa y en la forma de contar el tiempo. No le encuentro sentido alguno al trozo de código que has puesto. No veo que ese código calcule tiempo alguno. Deberías de poner todo el programa o un ejemplo funcional. O por lo menos, las partes en donde se usan las variables que utilizas para calcular el tiempo.

Ya te digo yo que es imposible que en sesenta segundos el oscilador del Arduino se retrase medio segundo. Así que olvida lo del factor de correción y postea el código completo. Porque me temo que si le sigues añadiendo cosas al programa, se irá retrasando más tiempo. Y eso sería prueba de que no es el oscilador, sino el programa.

No, millis() es muy precisa, lo que no sería preciso en este caso sería el cristal. :wink:

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