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!");
}
}
}