Go Down

Topic: Problema com Millis() (Read 760 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
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy