Go Down

Topic: Problema com Millis() (Read 725 times) previous topic - next topic

renke

Olá amigos, estou fazendo um sistema de cronometragem que usa o millis() como base para obter o tempo. O problema é que quando o tempo é enviado para o receptor que irá guardar o tempo (e demonstra-lo), parece que o tempo trava, ou seja, apos a primeira medicao de tempo, todas em diante serão iguais, como se a variavel tempo (millis()) parasse na primeira comparação para pausar. Segue o codigo.

Code: [Select]

#include <VirtualWire.h>  
#undef int
#undef abs
#undef double
#undef float
#undef round

long tempo;
long tempoparado;
char memoria[10];
char TempoParado[8];
int botao = 9;
int fotocelula = 11;
int verde = 12;
int vermelho = 10;
int tempocorrendo = false;
int usuariorecebido = false;


void setup()
{
   pinMode(vermelho, OUTPUT);
   pinMode(verde, OUTPUT);
   pinMode(fotocelula, INPUT);
   pinMode(botao, INPUT);
   Serial.begin(9600);
   vw_setup(2000);                
   vw_set_tx_pin(3);  
   vw_set_rx_pin(4);    
}

void loop()
{
      int val;
      val = digitalRead(botao);  //botao para iniciar o sistema
      if (val == HIGH)
      {
        tempo = millis(); // atribui a tempo os milisegundos
        digitalWrite(verde, HIGH);
        delay(2000);
        digitalWrite(verde, LOW);
        delay(2000);
       
        tempocorrendo = true;
       
        while ( tempocorrendo == true){  
       
        vw_rx_start();  //pega ID do usuario(lcd) que irá receber o tempo
       
        uint8_t buf[VW_MAX_MESSAGE_LEN];
        uint8_t buflen = VW_MAX_MESSAGE_LEN;
       
        if (vw_get_message(buf, &buflen)) {
          switch (buf[0]){
            case 'X':
              usuariorecebido = true;
              digitalWrite(verde, HIGH);
              while (usuariorecebido == true  ) //usuario identificado
              {
                vw_rx_stop();
                int val1;
                val1 = digitalRead(fotocelula);
                if (val1 == HIGH)  // fotocelula para abrir o tempo
                {  
                  tempoparado = tempo; // aqui ele pega o tempo e copia pra tempoparado

                  digitalWrite(verde, LOW);

                  // envia as informaçoes

                  memset(memoria, '\0', sizeof(memoria));
                  memset(TempoParado, '\0', sizeof(TempoParado));
                  ltoa( tempoparado, TempoParado, 10 );
                  strcat(memoria,"A");     // Adiciona A que é a fotocelula da largada
                  strcat(memoria,"X");     // adiciona o ID do usuario X
                  strcat(memoria,TempoParado);  // adiciona o tempo
                  delay(200);
                  vw_send((uint8_t *)memoria, strlen(memoria));
                  vw_wait_tx();    
                  delay(500);
                  usuariorecebido = false;                          
            }}
        break;
       
        case 'Y': // o mesmo para um segundo usuario
          usuariorecebido = true;
          digitalWrite(verde, HIGH);
          while (usuariorecebido == true){
            int val1;
            val1 = digitalRead(fotocelula);
            if (val1 == HIGH)
            {  
                tempoparado = tempo;
                digitalWrite(verde, LOW);
                memset(memoria, '\0', sizeof(memoria));
                memset(TempoParado, '\0', sizeof(TempoParado));
                ltoa( tempoparado, TempoParado, 10 );
                strcat(memoria,"A");
                strcat(memoria,"Y");
                strcat(memoria,TempoParado);  
                delay(200);
                vw_send((uint8_t *)memoria, strlen(memoria));
                vw_wait_tx();    
                delay(500);
                usuariorecebido = false;
            }}
       break;  
      }}}}}


Se alguem puder me ajudar, já tentei criar uma funcao void tempo(){tempo = millis()} , tentando assim manter o tempo correndo, mas nao funcionou. Alguem?



Italo Lima

Acho que vc não está atualizando o tempo dentro do while, certo?

renke

Exatamente!
Acabei de refazer o code e testar, como o tempo tem que ser igual tanto na fotocelula da largada como na chegada eu nao podia botar o millis() dentro do while, caso contrario daria diferença de tempo na hora da subtração.

Vou postar o codigo aqui caso alguem tenha um duvida parecida no futuro.

Obrigado à todos!

Code: [Select]

#include <VirtualWire.h>  
#undef int
#undef abs
#undef double
#undef float
#undef round


long tempo;
long tempo1;
long tempoparado;
char memoria[10];
char TempoParado[8];
char usuariorecebido;
int botao = 9;
int fotocelula = 11;
int verde = 12;
int vermelho = 10;
int comeca = false;
int usuario = false;
int statususuariorecebido = false;
int iniciar = false;


void recebeusuario(){

 if(iniciar == true){
      usuario = true;
      while(usuario == true){
         
            vw_rx_start();
            uint8_t buf[VW_MAX_MESSAGE_LEN];
            uint8_t buflen = VW_MAX_MESSAGE_LEN;
           
            if (vw_get_message(buf, &buflen)) {
              usuariorecebido = buf[0];
              usuario = false;
              statususuariorecebido = true;
              vw_rx_stop();
            }}
}}

void setup()
{
   tempo = millis();
   pinMode(vermelho, OUTPUT);
   pinMode(verde, OUTPUT);
   pinMode(fotocelula, INPUT);
   pinMode(botao, INPUT);
   Serial.begin(9600);
   vw_setup(2000);                
   vw_set_tx_pin(3);  
   vw_set_rx_pin(4);    
}

void loop()
{
      int val;
      val = digitalRead(botao);
      if (val == HIGH)
      {
        comeca = true;
      }
      if(comeca == true){
     
      tempo = millis();
      digitalWrite(verde, HIGH);
      delay(1000);
      digitalWrite(verde, LOW);
      delay(500);
      iniciar = true;
      recebeusuario();
      switch (usuariorecebido){  
                case 'X':
                  digitalWrite(verde, HIGH);
                  while(statususuariorecebido == true  )
                  {
                    int val1;
                    val1 = digitalRead(fotocelula);
                    if (val1 == LOW)
                    {  
                      delay(1000);
                      tempoparado = tempo;
                      digitalWrite(verde, LOW);
                      memset(memoria, '\0', sizeof(memoria));
                      memset(TempoParado, '\0', sizeof(TempoParado));
                      ltoa( tempoparado, TempoParado, 10 );
                      strcat(memoria,"A");
                      strcat(memoria,"X");
                      strcat(memoria,TempoParado);
                      delay(200);
                      vw_send((uint8_t *)memoria, strlen(memoria));
                      vw_wait_tx();    
                      delay(500);
                      statususuariorecebido = false;                          
                }}
                break;
           
                case 'Y':
                  digitalWrite(verde, HIGH);
                  while(statususuariorecebido == true){
                    int val1;
                    val1 = digitalRead(fotocelula);
                    if (val1 == HIGH)
                    {  
                        tempoparado = tempo;
                        digitalWrite(verde, LOW);
                        memset(memoria, '\0', sizeof(memoria));
                        memset(TempoParado, '\0', sizeof(TempoParado));
                        ltoa( tempoparado, TempoParado, 10 );
                        strcat(memoria,"A");
                        strcat(memoria,"Y");
                        strcat(memoria,TempoParado);  
                        delay(200);
                        vw_send((uint8_t *)memoria, strlen(memoria));
                        vw_wait_tx();    
                        delay(500);
                        statususuariorecebido = false;
                    }}
                    break;  
      }}}

Go Up