Galera!

O código à baixo, conta o tempo e imprime ele na serial do arduino.

Fiz alguns testes com isso para ver se da realmente certo isso e reparei que não da exatamente como deveria ser.

Deveria contar os milisegundos, os segundos e minutos, mas os milissegundos não fecha exatamente, testem o código e verão o que acontece.

A ideia seria usar isso para contar o tempo e em um determinado tempo vc executar uma determinada ação, mas o fato é que isso não é exato.

Gostaria de saber o comentário de vcs.

Abraços!

int seg =0, seg2 =0, min= 0;
void setup(){
Serial.begin(9600);
}

void loop(){
static unsigned long ult_tempo = 0;
int tempo = millis();
if((tempo - ult_tempo) >= 1000){
ult_tempo = tempo;
seg++; seg2++;

}
if(seg >= 60){
seg =0;
seg2 =0;
min++;
};
Serial.print("Tempo: ");
Serial.print(min);
Serial.print(" : ");
Serial.print(seg2);
Serial.print(" : ");
Serial.println(millis());

}

Exibições: 20272

Responder esta

Respostas a este tópico

Olá Márcio!

Na verdade, o seu programa está certo.

O que acontece é o seguinte: A função millis() é muito rápida. Enquanto você está processando outras coisas, como fazendo seus IFs e incrementando contadores, ela fica trabalhando e quando você exibe o seu valor, ela já está bem longe, mas está correta.

Por isso  que você precisou colocar nos seus IFs o sinal >=, caso contrário a condição não seria atingida.

Algumas observações sobre o código:

1) Todas as variáveis que trabalham com millis devem de ser do tipo unsigned long;

2) seg e seg2 estão redundandes;

3) A variável min vai explodir. Precisa zerá-la em algum momento;

4) Se o objetivo é só executar um função em determinado tempo, não seria necessário calcular minutos e segundos. Bastaria usar o millis

5) A opção através de millis nunca será exata. Outra alternativa para executar uma função de tempos em tempos com mais exatidão seria através de interrupções do TIMER, embora ela possua alguns inconvenientes.

Veja um exemplo aqui:

http://labdegaragem.com/profiles/blogs/tutorial-executando-fun-es-e...

Abraço,

José Cintra

Oi MAP, bom dia,

como bem disse o JAC, a função millis() tem alguns inconvenientes.

Ela não tem  muita precisão;

Retorna a zero em 49 dias, 17 horas, 2 minutos, 47 segundos,  295 milisegundos.  

   Reg = FFFFFFFFh.;

Isto pode afetar o funcionamento do seu projeto.

Segue anexo o seu code corrigido.

Para controle de tempo recomento um RTC, tal como por exemplo o DS3231

Rui

Anexos

Olá amigo, sou novo aqui e estou precisando fazer um projeto para a empresa em que trabaçho, para calcular o MTBF de uma maquina., eu quero que o Arduino ao receber um sinal que a maquina parou, ele começe a contabilizar o tempo, e quando a maquina voltar, ele registre esse tempo para que eu possa enviar para outro servidor meu de monitoramento, nessa parte do envio eu ja tenho mas a contabilização total eu nao sei ocmo fazer, , como eu poderia fazer isso com o RTC ? Obrigado.

Jessé Muniz 

Que máquina, fabricante e modelo ?
Se for uma máquina que requer tal cuidado é possível que a mesma já possua alguma interface e/ou protocolo de monitoramento, como um SNMP, por exemplo.

Tenho um modo relativamente simples de fazer isso, para o meu caso ele atende. 

Meu caso é o seguinte, tenho um tanque que será carregado de fluido por uma bomba de vácuo 7,5CV com motor siemens (Em torno de R$8.000,00) e uma bomba de transferência motor weg de 1/2 CV que fará a descarga deste tanque, no interior do tanque tenho dois sensores , um superior e um inferior. O sensor superior diz que o tanque esta cheio quando seu estado é 1, o sensor dois manda a bomba desligar quando o estado dele é 0. Como a bomba de vácuo é cara, e há risco de ter algum dano é ideal que ela trabalhe 1 hora e descanse por outra. Devo salientar que o sistema de  partida da bomba é constituído por contatora, relé térmico e relé de falta de fase e um módulo relé do arduino. A solução que cheguei segue o pseudo código.


int i=0;
bomba_de_vácuo_liga;
do{
delay(500);
estado_do_sensor1 = estado de uma porta genérica;
i++;

}while(estado_sensor1==1||i==7200);

bomba_de_vácuo_desliga; 

Daqui em diante seguem as diretrizes da bomba de transferência.

delay(3600000); // descanso da bomba de vácuo

O que esse trecho de código faz é contabilizar de modo temporal o contador, ou seja o contador só é incrementado após um dado intervalo de tempo, e o  || deixa aberto a ocorrência de um ou outro. A desvantagem é apenas retardar em 0,5s a leitura do sensor o que para o meu caso não influenciaria tanto, se eu avaliar pela equação de Bernoulli o volume que seria acrescido neste tempo ao tanque,facilmente perceberia que tal volume é irrisório.

No lugar de (estado_sensor1==1||i==7200) usar (estado_sensor1==1&&i<=7200)

Olá.

  Realmente está dando um grande erro pq quando vc compara ">=" caso seja maior os "ticks" excedentes são descartados.

  Se vc trabalhar nisso pode melhorar muuito mas o tipo de cristal que usamos é relativamente impreciso se comparado ao necessário para garantir erro menor que 1 minuto por ano.

  Recomendo usar um relogio em hardware. 

http://labdegaragem.com/profiles/blogs/projeto-rel-gio-rtc-com-arduino

  Para maior garantia vc pode ainda usar um servidor de hora.

  Atualmente uso ele e recomendo muito !!! 

  Vc usaria em vez do Arduino comum um ESP8266 ou ESP32. Nele usaria o codigo:

https://github.com/espressif/arduino-esp32/blob/master/libraries/ES...

  Pronto !!!

   Vc sabe que horas são sincronizado com o relógio da internet.

   Vc precisa ainda fazer sua rotina de relogio para não ficar perguntando a cada segundo. Vc faria e sincronizaria por ex 1x ao dia.

   Veja em:

https://playground.arduino.cc/Code/Timer1/

  com o timer1 vc pode fazer direto uma interrupção a cada meio segundo por ex. Mudando, 1 segundo ou 1 centésimo.

   Enfim, sei que compliquei um pouco sua vida com esses exemplos que são mais avançados, mas a ideia é mostrar que tem muitas saídas e também tirar a imagem ruim de imprecisão que ficou... Espero ter ajudado.

  

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço