Cronómetro con 2 botones [inicio + restablecimiento]

En el código que te he escrito uso las teclas start y pause para que se acciones solo al presionarlas.
Tomo en cada caso el valor de millis().
Ahora me doy cuenta que al presionar start o pausa no hago lo que se pretende.

EDITO: debe ser de mis peores códigos. Acabo de descubrir que omití

 sprintf(buffer, "%02d:%02d:%02d.%d", horas, minutos, segundos, decimas);

ya lo edité.
Igualmente el código no hace mucho.

EDITADO:
Olvida el código anterior. Lleno de errores.
Esta tmb pero al menos se aproxima

#include <Arduino.h>

//#include <LiquidCrystal_I2C.h>//Libreria para LCD I2C
#include <Wire.h>//libreria requrida para usar SDA y SCL
//LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

// Variables para los cálculos internos del cronómetro
unsigned long horas         = 0;
unsigned long minutos       = 0;
unsigned long segundos      = 0;
unsigned long decimas       = 0;
unsigned long milisegundos = 0;
unsigned long time_reestablecer, time_pausa, nexttime, tiempo_corriendo;
int reestablecer, stop, pausa, reestablecerAnt = LOW, stopAnt = LOW, pausaAnt = LOW;

const byte pulsador_inicio = 3; // pulsador_inicio en PIN digital 10
const byte pulsador_pausa  = 4; // pulsador_pausa en PIN digital 9
bool fpausa = true;
char buffer[30];

void millis2time(unsigned long tmp) {
  unsigned long todosLosSegundos = tmp/1000;
  horas     = todosLosSegundos/3600;
  unsigned long segundosRestantes = todosLosSegundos%3600;
  minutos   = segundosRestantes/60;
  segundos  = segundosRestantes%60;
  decimas   = (tmp/100 - todosLosSegundos*10); 
}

void presentacionLCD() {
      // Mostramos el tiempo a través del LCD      

    //lcd.setCursor(4, 1);
    if (!fpausa)
        millis2time(millis()-tiempo_corriendo);
    else 
        millis2time(time_reestablecer-tiempo_corriendo);
                
    sprintf(buffer, "%02ld:%02ld:%02ld.%ld", horas, minutos, segundos, decimas);
    //lcd.print(buffer);

    Serial.println(buffer);
  }


void setup() {
  Serial.begin(115200); // Comienzo de la comunicación serie
  Serial.println("Comenzando el cronometro");  
  delay(1000);
  pinMode(pulsador_inicio, INPUT_PULLUP); // Pin digital 10 como entrada  
  pinMode(pulsador_pausa, INPUT_PULLUP); // Pin digital 9 como entrada
  //lcd.begin(20, 4);//Inicializar la LCD 20x4
  //lcd.backlight();//Encender la luz de fondo
  //lcd.setCursor(1, 0);
  //lcd.print("------------------");
  //lcd.setCursor(1, 3);
  //lcd.print("------------------");
}

void loop()  {

  // Si presionamos el pulsador de pausa se congela el tiempo hasta que lo volvamos a presionar
  pausa = digitalRead(pulsador_pausa);
  if (!pausa && pausaAnt)  {    
      fpausa = false;
      nexttime = tiempo_corriendo = millis();  
      Serial.println("Inicio: "+String(tiempo_corriendo)); 
  }
  pausaAnt = pausa;

  // Si presionamos el pulsador de inicio se pone todo a cero
  reestablecer = digitalRead(pulsador_inicio);   

  if (!reestablecer && reestablecerAnt)  {
      time_reestablecer = millis();

      Serial.println("Reestablezco: "+String(time_reestablecer)); 
      fpausa = true;
  }
  reestablecerAnt = reestablecer;

  if (millis() >= nexttime && !fpausa) {
      presentacionLCD();
      nexttime += 100;
  }
}

He comentado todo lo referente a lcd asi que quita los // y lo tienes activo otra vez.
Hay cosas para mejorar aún.