Classe+RunTimer

Home > Robótica > Bibliotecas **Recursos** > **RunTimer** > Timer2 > CircularBuffer > SerialLog > ActionPlan **Dispositivos** > Ultrassom > Array de sensores > NRF24L01 > Wireless log > RF24Control **Movimento** > StepperMotor > StepperMotorTm > DoubleStepper > DoubleStepperTm

Esta é uma classe bem enxuta, com pouco código que cria um timer via software. Foi feita para evitar o uso dos //timers// do arduino, que são recursos bem restritos e um tanto complicados de usar. Sempre que uma aplicação usa um //timer// de hardware, perde os recursos que utilizam aquele //timer//. O arduino Uno por exemplo tem 3 //timers// de hardware: //timer0//, //timer1// e //timer2//. O //timer0// é utilizado para funções de marcação de tempo como //delay//, //millis// e //micros//. Portanto o uso do //timer0// em uma aplicação faz com que essas funções deixem de funcionar. O //timer1// é usado pela biblioteca //Servos// para o controle de servos. Finamente o //timer2// é usado pela função //tone//. Além disso, todos eles estão associados a pinos de //pwm//. O //timer0// controla o //pwm// dos pinos 5 e 6, o //timer1// o dos pinos 9 e 10 e o //timer2// dos pinos 3 e 11.

O resumo da ópera é que se não é necessário uma extrema precisão na marcação de intervalos de tempo, esta classe resolve o problema sem complicações e sem o uso de //timers// de hardware.

Pode ser usada de duas maneiras, monitorando o retorno do método //run//, ou derivando a classe em uma classe descendente e reescrevendo o método //onTimerEvent//. Abaixo a declaração pública da classe:

code format="java5" class RunTimer { public: RunTimer;             // construtor boolean run;          // chamar a cada loop void start(unsigned long microseconds, boolean firstNow=false, boolean comprime=false); // ativa o timer void stop;        // desliga o timer boolean timerIsOn;    // verifica se o timer está ativo

protected: virtual void onTimerEvent{}; // evento };

code O uso básico da classe é bastante simples. Declare uma instância da classe e use o método //start// informando o intervalo de tempo para iniciar o timer e depois monitorar o retorno do método //run// dentro da função //loop.// O método //stop// para a geração de eventos.

code format="java5" RunTimer tm;

void setup { ...  tm.start(500000); // 500 milissegundos ou 0,5 segundo ... }

void loop { ...  if(tm.run) {    // código que será executado a cada intervalo de tempo } ... }

code

Também é possível derivar a classe, criar uma classe descendente e reescrever o evento //onTimerEvent//. Abaixo um exemplo de como poderia ser feito:

code format="java5" class MyClass: public RunTimer { public: MyClass:RunTimer{};

void init(unsigned long interval) {     start(interval); }

protected: void onTimerEvent {   // código a executar } };

MyClass mc;

void setup { ...  mc.init(500000); ... }

void loop { ...  mc.run; ... }

code

O método //start// tem dois parâmetros opcionais além do intervalo de tempo. Quando //firstNow// é true, o primeiro evento é disparado imediatamente. O parâmetro comprime faz com que eventuais atrasos no disparo de eventos sejam compensados no evento seguinte. Temos que lembrar que é um //timer// de software, a verificação do tempo é feita no método //run//. Se o loop demora muito para ser executado, com certeza os eventos terão algum atraso. Por exemplo, se o //timer// está configurado para disparar um evento a cada 1000 microssegundos, mas o loop demora 50 microssegundos para ser executado, então pode ocorrer que um evento seja disparado 1050 microssegundos após o evento anterior. Nesse caso se o parâmetro //comprime// for //true//, o próximo evento será configurado para disparar após 950 microssegundos, de forma a compensar o atraso do evento anterior.

**Importante:** não deixe de chamar o método //run// a cada iteração do //loop// principal. Sem isso o //timer// não funciona.

.