Leg no Cronometro

olá,

Estou tentando construir um cronometro acionado por botão e pausado pelo sensor hc-sr04, conforme código abaixo. entretanto ao implementar o sensor no código o cronometro dá leg durante a contagem.
Alguém poderia me auxiliar.

Obrigado.

/*

  • Cronômetro com Arduino e display LCD I2C
  • Autor: Daniele Alberti
  • Modificações: Ana Paula Messina - tecdicas
  • 18/10/2019
  • V1.0
    */

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <NewPing.h>
#include <Ultrasonic.h>

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

int estado_btnplay;
int estado_btnstop;

unsigned long tempo;
unsigned long tempo_play = 0;
unsigned long tempo_stop;
unsigned long tempo_segundo;

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

int controle = 0;

// Alterar o endereço conforme modulo I2C
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

Ultrasonic ultrasonic(TRIGGER_PIN, ECHO_PIN);

void setup()
{
pinMode(BTN_PLAY, INPUT_PULLUP);
pinMode(BTN_STOP, INPUT_PULLUP);

lcd.begin(16,2);
lcd.setCursor(4,0);
lcd.print(“CRONOMETRO”);
lcd.setCursor(5,1);
lcd.print(“DIGITAL”);
delay(1000);
lcd.clear();
lcd.setCursor(0,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);

if ((estado_btnplay == LOW) && (controle == 0))
{

lcd.clear();
controle = 2;
 lcd.setCursor(0,0);
 lcd.print("STOP P/ PARAR");

}

if ((estado_btnplay ==HIGH) && (controle == 2))
{

// contar++;
//lcd.setCursor(0,1);
//lcd.print(contar);

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(0,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(3,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(6,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(9,1);
lcd.print(decimas);
}
}
if ((estado_btnstop == LOW) && (controle == 2))
{

horas = 0;
minutos = 0;
segundos = 0;
decimas = 0;

lcd.setCursor(0,0);
lcd.print(" ");
lcd.setCursor(0,0);
lcd.print(“STOPPED”);

//lcd.print(contar);
controle = 0;
}

if (cmMsec < 20 )
{
lcd.clear();
lcd.setCursor(0,1);
lcd.print(cmMsec);
controle = 0;
}

}