Timer com ESP8266 na IDE do Arduino

timerIntrodução ao timer

O timer é um dos recursos de interrupção utilizados para disparar eventos de forma assíncrona, de tal modo que seu programa mantém uma execução normal e no estouro do timer, o programa salta para o evento para atender a interrupção. Isso lhe dá a liberdade que você não teria se durante o fluxo de um programa você tivesse que parar dentro de uma função no loop para fazer verificação.

Além da liberdade, você consegue maior precisão no tempo, porque se seu programa tiver delay em qualquer função (como por exemplo, um delay em um SYNACK na rede) você já não teria mais precisão no tempo de um checker, ou seja, você não consegue utilizar tempo como parâmetro dentro de um loop com um incrementador.

A utilização de timer se prevalece de um recurso independente do fluxo principal do programa e no caso específico do ESP8266, você encontra 2 tipos diferentes de interrupção. Trataremos aqui de apenas um desses tipo, mas vamos fazer uma introdução de ambos.

os_timer

Esse timer é baseado em software e suporta a geração de vários timers (provavelmente mais timers do que você poderá utilizar como hobista). Por ser baseado em software, já pode-se deduzir que ele tem menos acuidade do que o timer por hardware, mas não há dúvida de que é melhor do que qualquer solução paleativa e desse recurso que traterei de exemplificar. Os fatores que podem prejudicar sua acuidade são os recursos periféricos como o próprio WiFi e a percepção dessa imprecisão pode ser maior em menores intervalos. O exemplo aqui será para uma interrupção longa porque o propósito desse post é ser um adendo ao próximo post (que está quase finalizado já) e nesse próximo post um longo tempo será aplicado à interrupção.

hw_timer

Infelizmente não achei 1 exemplo que fosse sobre a utilização do timer por hardware. Se alguém achar uma documentação a respeito, prometo estudá-la e implementar, então crio um post exclusivo tratando disso. É também por essa razão que veremos apenas interrupções do timer por software.




Interrupções devem utilizar apenas flags

Eu mesmo não sigo sempre essa regra; quando você vai tratar uma interrupção (o timer é um tipo de interrupção), a função que trata o evento deve apenas setar uma flag e o tratamento deve ser feito no loop do programa. Mas eu mesmo me coloquei em condições de programação de quem programa com threads e nesses casos específicos eu não tenho vergonha e nem pudor em dizer que sim – eu faço uso de chamada de funções dentro de interrupções. Mas aqui no exemplo vou fazer bonitinho, afinal, é pra servir de exemplo.

Configurar a IDE do Arduino para programar o ESP8266

Se você ainda não o fez, leia esse post onde trato de mostrar a configuração.

Código de exemplo com timer

O yield() do ESP8266 tem uma diferença do Arduino. No ESP8266 o yield() é utilizado no lugar do delay() para não interromper as tarefas principais como o WiFi. Aprecie o código e divirta-se.

Inscreva-se no nosso newsletter, alí em cima à direita e receba novos posts por email.

Siga-nos no Do bit Ao Byte no Facebook.

Prefere twitter? @DobitAoByte.

Inscreva-se no nosso canal Do bit Ao Byte Brasil no YouTube.

Sistemas Embarcados

BR-Arduino.org

Próximo post a caminho!





euler_banner

Comments

comments

Djames Suhanko

Djames Suhanko é Perito Forense Digital. Já atuou com deployer em sistemas de missão critica em diversos países pelo mundão. Programador Shell, Python, C, C++ e Qt, tendo contato com embarcados ( ora profissionalmente, ora por lazer ) desde 2009.

Deixe uma resposta