Como crear una cuenta atras y actualizar un lcd

Bueno hemos estado un buen tiempo hasta encontrarle la vuelta a cada detalle con Ramon.
Finalmente esta es la versión que hace todo lo que el quería.

#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>

#define I2C_ADDR    0x27

const byte filas = 4;
const byte columnas = 4;
byte pinesF[filas] = {9,8,7,6};
byte pinesC[columnas] = {5,4,3,2};
 
char teclas[filas][columnas] = {
 
 {'1','2','3','A'},
 {'4','5','6','B'},
 {'7','8','9','C'},
 {'*','0','#','D'}
};
 
Keypad teclado = Keypad(makeKeymap(teclas), pinesF, pinesC, filas, columnas);

char tecla;
unsigned long start;
unsigned long num;
unsigned long TiempoCarga;
const byte pinCarga  = 10;
bool cargar   = false;
bool cargaAnt = false;
bool startlcd = false;

LiquidCrystal_I2C             lcd(I2C_ADDR,2, 1, 0, 4, 5, 6, 7);

void setup()
   {
    lcd.begin (16,2);
    lcd.setBacklightPin(3,POSITIVE);
    lcd.setBacklight(HIGH);
    pinMode(pinCarga, OUTPUT);
    digitalWrite(pinCarga, LOW);   // rele apagado
    lcd.home ();
    lcd.print("Amp. bateria:");
    num = 0;
    Serial.begin(9600);
   }

void loop() {

  char key = teclado.getKey();
   while(key != NO_KEY)
   {
      switch (key)
      {
         case NO_KEY:
            break;

         case '0': case '1': case '2': case '3': case '4':     //Muestra en el lcd los digitos pulsados
         case '5': case '6': case '7': case '8': case '9':
            lcd.print(key);
            num = num * 10 + (key - '0');
            break;

         case '*':                            //Valida los amperios introducidos y hace el calculo de los minutos restantes
                  lcd.setCursor (0,2);
                  num = num /2.5;           //El alternador que utilizo es de 150 amperios/hora, asi que 150/60=2.5
                  lcd.print(String("Restante: ") + int(num) + String("min."));
                  cargar = true;
                  TiempoCarga = num; // paso a seg y milisegundos
                  break;
        case '#':                          //Resetea el lcd como al principio por si nos hemos equivocado al introducir los amperios
                  cargar = false;
                  TiempoCarga =0;
                  start = 0;
                  num = 0;
                  lcd.clear();
                  lcd.print("Amp. bateria:");
                  digitalWrite(pinCarga, LOW);
                  break;
      }

      key = teclado.getKey();
   }

   if (cargar && !cargaAnt) {
        start = millis();
        digitalWrite(pinCarga, LOW);      // supongo rele que se acciona
        startlcd = true;
//        Serial.println("Inicia carga");
    }
    if (!cargar && cargaAnt){
        digitalWrite(pinCarga, HIGH); // supongo rele desenergizado
        startlcd = false;
//        Serial.println("Detiene carga");
    }  
    cargaAnt = cargar;
    if (startlcd) {
        //Serial.println(String("Restante:")+long(TiempoCarga - millis() + start));
        unsigned long resta = (millis() - start) / 60000;
        num = TiempoCarga - resta;
        Serial.println(String("Restante:")+long(num));
        lcd.setCursor (0,2);
        char buffer[20];
        sprintf(buffer, "Restante %02dmin.", num);  
        lcd.print(buffer);
        
        if (num == 0) {
            cargar = false;
            TiempoCarga =0;
            start = 0;
            num = 0;
            lcd.clear();
            lcd.print("Bateria cargada!");
        }
    }

}