Boa Noite!

Estou programando um cronômetro no arduino, só que ele está dando erro quando o milissegundo vai passar para segundo e segundo para minuto.
O que devo fazer para corrigir esse erro?

if (status == MI_OK){

  Serial.println();
  tpV = ( millis () - tAntig- ttV); //tempo parcial recebe a diferença entre a função milis e tempo antigo                                                menos o tempo total
  ttV = ttV + tpV; // tempo total acumula tempo total mais tempo parcial

  //calculo do tempo total----------------------
  ttVmil = (ttV % 100);
  ttVseg = (ttV-ttVmil)/1000; // tempo total é convertido para segundos

   if ((ttV / 100) >= 100) {a=1;}

  ttVsec = (ttVseg % 60)+a; //variavel recebe o resto da divisão para gerar os segundos da variavel                                                 ttV1min

   if ((ttVseg / 60) >= 60) {b=1;}

  ttVmin = ((ttVseg-ttVsec) / 60)+b; //tempo total é recebido e convertido para minutos
  ttVhora= ttVmin / 60;

//mostrar numero do cartao

Serial.print("Tempo Total: ");
Serial.print(ttVhora, DEC);
Serial.print("\",");
Serial.print(ttVmin, DEC); //exibir com formatação o tempo total
Serial.print("\",");
Serial.print(ttVsec, DEC);
Serial.print("\",");
Serial.print(ttVmil, DEC);
Serial.print("\"""");
Serial.println();

//calculo do tempo parcial----------------------
 

 tpVmil = (tpV % 100);
 tpVseg = (tpV-tpVmil)/1000; // tempo parcial é convertido para segundos

if ((tpV / 100) >= 100) {c=1;}

tpVsec = (tpVseg % 60)+c; //variavel recebe o resto da divisão para gerar os segundos da variavel                                                  tpV1min

if ((tpVseg / 60) >= 60) {d=1;}

tpVmin = ((tpVseg-tpVsec) / 60)+d; //tempo parcial é recebido e convertido para minutos

tpVhora= tpVmin / 60;

Serial.print("Tempo Parcial: ");
Serial.print(tpVhora, DEC);
Serial.print("\",");
Serial.print(tpVmin, DEC); //exibir com formatação o tempo total
Serial.print("\",");
Serial.print(tpVsec, DEC);
Serial.print("\",");
Serial.print(tpVmil, DEC);
Serial.print("\"""");
Serial.println();
   }
  delay(1000);

 }

Exibições: 1206

Responder esta

Respostas a este tópico

Bom dia,

Modifiquei o programa do  Edson Melo " https://www.youtube.com/watch?v=Okjm364EcQo" veja se te ajuda.

 


#include <MsTimer2.h>

#define BOTAO 2

unsigned int milissegundos =0, segundos=0, minutos=0, hora=0;
boolean setaCrono = true;
boolean cronoLigado = false;

void ajustaCronometro () {
  milissegundos++; 
  if ( milissegundos == 1000) {
    milissegundos = 0;
    segundos++; 

    if (segundos == 60) {
      segundos = 0;
      minutos ++; 

      if (minutos == 60){
        minutos = 0;
        hora ++;
      }
      if (hora == 2){
        hora = 0;
        minutos = 0;
        segundos = 0;
        milissegundos = 0;
      }

    }
  } 

  setaCrono = true;
}

void setup () {

  Serial.begin(9600);
  pinMode (BOTAO, INPUT);
  digitalWrite(BOTAO,1);
  MsTimer2::set (10, ajustaCronometro); 
}

void loop () {

  if ( (digitalRead (BOTAO)== LOW) && (cronoLigado == false) )
  { 
    cronoLigado = true;
    MsTimer2::start();
  } 
  else if ( (digitalRead (BOTAO)== HIGH) && (cronoLigado == true) )
  { 
    cronoLigado = false;
    MsTimer2::stop();
  } 
  if (setaCrono) {

    Serial.print (hora,DEC);
    Serial.print (':');
    Serial.print (minutos,DEC);
    Serial.print (':');
    Serial.print (segundos,DEC);
    Serial.print (':');
    Serial.println (milissegundos,DEC);

    setaCrono = false;
  }
}

Obrigada pela ajuda.

Sugestão para facilitar para quem deseja ajudá-la.

Coloque um programa executável, incluindo as variáveis, o setup e o loop.

Fica difícil para entender todo o programa, por exemplo para mim  que estou aprendendo ainda Sketch.

E ao executar o programa, fica mais fácil entender onde esta o problema.

Não entendi porque dividir ttV por 100. (décimos de segundos?)

Millis = milisegundos

 ttVmil = (ttV % 100);
  ttVseg = (ttV-ttVmil)/1000; // tempo total é convertido para segundos 

Tinha dividido por 100 para ter os centésimos de segundos, obrigada pela ajuda.

A unidade de ttV é de milisegundos.

Se dividir milisegundos por 100 vai ter décimos de segundos...

ex: 550 ms (0,55 seg) / 100 = 5,5  décimos de segundos

Para encontrar centésimos de segundos, divida por 10.

ex : 550 ms / 10 = 55 centésimos de segundos

Acho que é isso.

http://www.matematicadidatica.com.br/MedidaTempo.aspx

Frações de segundo

Em algumas situações mesmo o segundo é uma unidade de tempo muito grande. É comum em alguns esportes trabalharmos com décimos, centésimos e até mesmo milésimos de segundo.

Um décimo de segundo pode ser expresso por 0,1 s ou ainda 1/10 s.

Expressamos um centésimo de segundo por 0,01 s ou ainda 1/100 s.

Um milésimo de segundo pode ser expresso por 0,001 s ou ainda 1/1000 s.

Para convertermos de segundos para décimos, centésimos ou milésimos de segundos, dividimos o valor por 10, 100 ou 1000 respectivamente. No cálculo inverso realizamos a multiplicação por estes valores.

Obrigada pela ajuda, já consegui fazer com que ele calculasse certo, deixei em milissegundos mesmo.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço