# Cronometro dando lag

**URL:** <https://forum.fazedores.com/t/cronometro-dando-lag/7081>\
**Category:** Arduino\
**Created:** [Fevereiro 4, 2020, 12:18am UTC](https://forum.fazedores.com/t/cronometro-dando-lag/7081 "2020-02-04T00:18:15Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![aluizs](https://avatars.discourse-cdn.com/v4/letter/a/c67d28/32.png) [@aluizs](https://forum.fazedores.com/u/aluizs)\
**Post date:** [Fevereiro 4, 2020, 12:18am UTC](https://forum.fazedores.com/t/cronometro-dando-lag/7081/1 "2020-02-04T00:18:15Z")

</div>

Olá,

Estou trabalhando em um projeto de cronometro que é acionado por um botão e pausado através de um sensor ultrassônico (hc-sr04), só que começou a dar lag depois que implementei o código do sensor, antes disto estava funcionando normalmente.

Estou usando o arduino uno, 2 botões táctil e o sensor ultrassônico utilizando o código abaixo.

#include \<Wire.h\>  
#include \<LCD.h\>  
#include \<LiquidCrystal\_I2C.h\>  
#include \<NewPing.h\>  
#include \<Ultrasonic.h\>

#define I2C\_ADDR 0x27 // Add your address here.  
#define Rs\_pin 0  
#define Rw\_pin 1  
#define En\_pin 2  
#define BACKLIGHT\_PIN 3  
#define D4\_pin 4  
#define D5\_pin 5  
#define D6\_pin 6  
#define D7\_pin 7  
//--------------------------------------------------------  
#define BTN\_PLAY 10  
#define BTN\_STOP 11  
//--------------------------------------------------------  
#define ECHO\_PIN 13 // Arduino pin tied to echo pin on the ultrasonic sensor.  
#define TRIGGER\_PIN 12 // Arduino pin tied to trigger pin on the ultrasonic sensor.  
#define MAX\_DISTANCE 20 // Maximum distance we want to ping for (in centimeters). Maximum sensor distance is rated at 400-500cm.

long tempo\_2;  
long distancia;  
//--------------------------------------------------------  
int estado\_btnplay;  
int estado\_btnstop;

unsigned long tempo;  
unsigned long tempo\_play = 0;  
unsigned long tempo\_stop;  
unsigned long tempo\_segundo;

int controle = 1;

int horas = 0;  
int minutos = 0;  
int segundos = 0;  
int decimas = 0;  
int milisegundos = 0;  
int contar = 1;

//------------------------------------------------------------  
// Alterar o endereço conforme modulo I2C  
Ultrasonic ultrasonic(TRIGGER\_PIN, ECHO\_PIN);  
LiquidCrystal\_I2C lcd(I2C\_ADDR,En\_pin,Rw\_pin,Rs\_pin,D4\_pin,D5\_pin,D6\_pin,D7\_pin);

void setup()  
{  
Serial.begin(9600);  
pinMode(BTN\_PLAY, INPUT\_PULLUP);  
pinMode(BTN\_STOP, INPUT\_PULLUP);

[//LCD.Backlight](https://LCD.Backlight) ON;  
lcd.begin(20,4);  
lcd.setBacklightPin(BACKLIGHT\_PIN,POSITIVE);  
lcd.setBacklight(HIGH);

lcd.home ();  
lcd.setCursor(3,0);  
lcd.print(“Tec Dicas”);  
lcd.setCursor(3,1);  
lcd.print(“Cronometro”);  
delay(1000);  
lcd.clear();  
lcd.setCursor(3,0);  
lcd.print(“PLAY p/ iniciar”);  
}

void loop()  
{  
estado\_btnplay = digitalRead (BTN\_PLAY);  
estado\_btnstop = digitalRead (BTN\_STOP);

//-------------------------------------------------------  
float cmMsec, inMsec;  
long microsec = ultrasonic.timing();  
// cmMsec = ultrasonic.convert(microsec,Ultrasonic::CM);  
cmMsec = ultrasonic.convert(microsec, Ultrasonic::CM);

//--------------------------------------------------------

if ((estado\_btnplay == LOW) && (controle == 1)) //apertado  
{  
controle = 0;  
lcd.setCursor(3, 0);  
lcd.print("TEMPO ‘PLAY’ ");  
}

if (controle == 0)  
{  
milisegundos = millis();  
if(milisegundos % 100 == 0){ //Entrar apenas se tiver passado o décimo de segundo  
decimas++;  
if(decimas == 10){ //Quando passou 10 décimos de segundo, conta um segundo  
decimas = 0;  
segundos++;  
}  
if(segundos == 60){  
// Após 60 segundos, conta um minuto  
segundos = 0;  
minutos++;  
}  
if(minutos == 60){// Depois de 60 minutos, conta uma hora  
minutos = 0;  
horas++;  
}  
//exibição no LCD  
lcd.setCursor(3,1);  
if(horas \< 10){ //se as horas forem menor que 10, acrescenta um 0 na frente  
lcd.print(“0”);  
}  
lcd.print(horas);  
lcd.print(":");

lcd.setCursor(6,1);  
if(minutos \< 10){//se os minutos forem menor que 10, acrescenta um 0 na frente  
lcd.print(“0”);  
}  
lcd.print(minutos);  
lcd.print(":");

lcd.setCursor(9,1);  
if(segundos \< 10)

{//se os segundos forem menor que 10, acrescenta um 0 na frente  
lcd.print(“0”);  
}  
lcd.print(segundos);  
lcd.print(":");

lcd.setCursor(12,1);  
lcd.print(decimas);  
}  
}

//-----------------------------------------  
if ((estado\_btnstop == LOW) && (controle == 0)) //apertado  
{  
controle = 1;  
horas = 0;  
minutos = 0;  
segundos = 0;  
decimas = 0;

lcd.setCursor(3, 0);  
lcd.print("TEMPO ‘STOP’ ");  
delay(10000);  
}  
else if ((estado\_btnstop == LOW) && (controle == 1)) //apertado  
{  
lcd.setCursor(3, 0);  
lcd.print("PLAY p/ iniciar ");

lcd.setCursor(3,1);  
lcd.print(“00:00:00:0”);  
}

//----------------------------------------

//-------------------------------------------------------  
if (cmMsec \< 20 )  
{  
controle = 1;  
horas = 0;  
minutos = 0;  
segundos = 0;  
decimas = 0;

lcd.setCursor(3, 0);  
lcd.print("TEMPO ‘STOP’ ");  
}

lcd.setCursor(3,3);  
lcd.print(cmMsec);  
//-------------------------------------------------------

}

a estrutura dos botões estão de acordo com a imagem abaixo.

 ![](https://tecdicas.com/content/images/2019/11/montagem-cronometro-arduino-display-lcd-i2c.jpg)  
Alguem poderia me auxiliar com este problema.

Obrigado.

---

<div class="post-metadata">

**Author:** ![WagnerB](https://sea2.discourse-cdn.com/flex016/user_avatar/forum.fazedores.com/wagnerb/32/1911_2.png) [@WagnerB](https://forum.fazedores.com/u/WagnerB)\
**Post date:** [Fevereiro 11, 2020, 8:42pm UTC](https://forum.fazedores.com/t/cronometro-dando-lag/7081/2 "2020-02-11T20:42:58Z")

</div>

@aluizs use a interrupção de um dos timers do controlador ao invés das funções millis.

Da forma como está você vai ter lag tratando tudo no loop principal.

Abraços

---

<div class="post-metadata">

**Author:** ![aluizs](https://avatars.discourse-cdn.com/v4/letter/a/c67d28/32.png) [@aluizs](https://forum.fazedores.com/u/aluizs)\
**Post date:** [Fevereiro 12, 2020, 3:38pm UTC](https://forum.fazedores.com/t/cronometro-dando-lag/7081/3 "2020-02-12T15:38:36Z")

</div>

Wagner,

Obrigado pela ajuda, mas sou iniciante na linguagem do arduino, poderia me enviar um exemplo deste tipo de interrupção para eu estudar e implementar.

```
Obrigado.
```

---

<div class="post-metadata">

**Author:** ![WagnerB](https://sea2.discourse-cdn.com/flex016/user_avatar/forum.fazedores.com/wagnerb/32/1911_2.png) [@WagnerB](https://forum.fazedores.com/u/WagnerB)\
**Post date:** [Fevereiro 12, 2020, 4:45pm UTC](https://forum.fazedores.com/t/cronometro-dando-lag/7081/4 "2020-02-12T16:45:01Z")

</div>

@aluizs,

Tente essas duas páginas em português. Se precisar de outros da uma googleada e procure por “arduino timer interrupt”.

> **[Saiba como usar Timers do ATmega328 no Arduino - Embarcados](https://www.embarcados.com.br/timers-do-atmega328-no-arduino/)**
>
> Veja como utilizar um dos timers do ATmega328, o TIMER1, na plataforma Arduino. Inclue configuração de seus registradores e uso do recurso de interrupção.

> **[Tutorial: Executando funções em intervalos de tempo fixos (timers) com Arduino](http://labdegaragem.com/profiles/blogs/tutorial-executando-fun-es-em-intervalos-de-tempo-fixos-timers)**
>
> Esse tutorial eu postei originalmente no meu blog: blog.tiago.eti.br, e decidi reproduzi-lo aqui.
> 
> Embora o Ardiono seja uma plataforma muito fácil de utilizar…

Abraços.
