Cronometro dando lag

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 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.


Alguem poderia me auxiliar com este problema.

Obrigado.

@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

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.

@aluizs,

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

Abraços.