modificar hora timer con teclado

Hola amigos, no se como modificar la hora y fecha del timer desde un teclado 4x4 para activar un un led al que le sigue una secuencia que ya esta programada.
También me gustaría poder modificar la variable de millis desde el teclado.

Este programa lo he ido haciendo a base de leer en el foro y de ver vídeos, yo soy mecánico y estoy atascado en este punto. Quisiera saber si hay algún tutorial o vídeo sobe este tema.

Gracias.

#include <Keypad.h>     // importa libreria Keypad
#include <Wire.h>      // libreria de comunicacion por I2C
#include <LCD.h>      // libreria para funciones de LCD
#include <LiquidCrystal_I2C.h>    // libreria para LCD por I2C
#include <Time.h>         //  Libreria tiempo
#include <TimeAlarms.h>   //  Libreria tiempo
#include <RTClib.h>   // incluye libreria para el manejo del modulo RTC reloj
#include <SoftwareSerial.h> // Comunicacion serial para bluetooch


RTC_DS3231 rtc;     // crea objeto del tipo RTC_DS3231


LiquidCrystal_I2C lcd (0x27, 2, 1, 0, 4, 5, 6, 7); // DIR, E, RW, RS, D4, D5, D6, D7




int estadobl=0;
int contador = 1;
const byte FILAS = 4;     // define numero de filas
const byte COLUMNAS = 4;    // define numero de columnas
char keys[FILAS][COLUMNAS] = {    // define la distribucion de teclas
  
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};

byte pinesFilas[FILAS] = {9,8,7,6};   // pines correspondientes a las filas
byte pinesColumnas[COLUMNAS] = {5,4,3,2}; // pines correspondientes a las columnas

Keypad teclado = Keypad(makeKeymap(keys), pinesFilas, pinesColumnas, FILAS, COLUMNAS);  // crea objeto

char pulsacion;       // almacena la tecla presionada
byte INDICE = 0;      // indice del array

bool evento_inicio = true;  // variable de control para inicio de evento con valor true
bool evento_fin = false;  // variable de control para inicio de evento con valor false

// PINES
const int PIN_LED_VERDE = 13;
const int PIN_LED_AMARILLO = 12;
const int PIN_LED_ROJO = 11;
const int PIN_PULSADOR = 10;
// ESTADOS
const int ESTADO_OFF = 0;
const int ESTADO_VERDE = 1;
const int ESTADO_AMARILLO = 2;
//CONSTANTES
const int TIEMPO = 1500;
const int TIEMPO2 = 1500;
// VARIABLES
int estado = ESTADO_OFF;
int pulsadorAntes = LOW;
int pulsadorAhora = LOW;
int tiempo = 0;
int tiempoCambio = 0;
int ultimoCambio = 0;

// INIZIALIZAR

void setup()
{
  Serial.begin(9600);      // inicializa comunicacion serie

  pinMode(PIN_LED_VERDE, OUTPUT);
  pinMode(PIN_LED_AMARILLO, OUTPUT);
  pinMode(PIN_LED_ROJO, OUTPUT);
  pinMode(PIN_PULSADOR, INPUT);

  lcd.setBacklightPin(3,POSITIVE);  // puerto P3 de PCF8574 como positivo
  lcd.setBacklight(LOW);   // habilita iluminacion posterior de LCD
  lcd.begin(16, 2);     // 16 columnas por 2 lineas para LCD 1602A
  lcd.clear();      // limpia pantalla
  
  intro_0();
  
  apagar();

  if (! rtc.begin()) 
 {       // si falla la inicializacion del modulo
   while (1);         // bucle infinito que detiene ejecucion del programa
 }
 rtc.adjust(DateTime(__DATE__, __TIME__));
}

// FUNCIONALIDAD
void loop()
{
    if(Serial.available()>0)  // BLUETOOCH
  {
  estado = Serial.read();
  }

  if (estado =='1')
  {
   encenderVerde();
  }

  if (estado =='2')
  {
   apagar();
  }


   DateTime fecha = rtc.now();                       
   
 if ( fecha.hour() == 12 && fecha.minute() == 23 )
      { 
      if ( evento_inicio == true )                        // si evento_inicio es verdadero
     {                                                   
        encenderVerde();  
       }                     
        evento_inicio = false;                          // carga valor falso en variable de control
   }                                                    // para evitar ingresar mas de una vez

  obtenerDatos();
  controlarCircuito();

  pulsacion = teclado.getKey();  // Lee la tecla pulsada

   if (pulsacion != 0)
 {      
    lcd.clear();
    delay(100);
 } 

 if(contador == 5){ menu_5();accion_5();}
 if(contador == 4){ menu_4();accion_4();}
 if(contador == 3){ menu_3();accion_3();}
 if(contador == 2){ menu_2();accion_2();}
 if(contador == 1){ menu_1();accion_1();}
   
}


void obtenerDatos(){

  pulsadorAntes = pulsadorAhora;
  pulsadorAhora = digitalRead(PIN_PULSADOR);
  tiempo = millis();
  tiempoCambio = tiempo - ultimoCambio;
  delay(50);
}

void controlarCircuito()
{
  switch (estado)
  {
    case ESTADO_OFF:
    controlarOff();
    break;
    case ESTADO_VERDE:
    controlarVerde();
    break;
    case ESTADO_AMARILLO:
    controlarAmarillo();
    break;
    
  }
}

void controlarOff()
{
  if ((pulsadorAntes == HIGH) && (pulsadorAhora == LOW)) 
  {
    encenderVerde();
  }
  
}
void controlarVerde()
{
  if ((pulsadorAntes == HIGH) && (pulsadorAhora == LOW)) 
  {
    apagar();
  }
  else if (tiempoCambio >= TIEMPO)
  {
    encenderAmarillo();
  }
}
void controlarAmarillo()
{
   if ((pulsadorAntes == HIGH) && (pulsadorAhora == LOW))
  {
    apagar();
  }

  else if (tiempoCambio >= TIEMPO2)
  {
    encenderVerde();
  }
}

 void apagar()
 {
  digitalWrite(PIN_LED_VERDE, LOW);
  digitalWrite(PIN_LED_AMARILLO, LOW);
  digitalWrite(PIN_LED_ROJO, HIGH);
  estado = ESTADO_OFF;
 }
 void encenderAmarillo()
 {
  digitalWrite(PIN_LED_VERDE, LOW);
  digitalWrite(PIN_LED_AMARILLO, HIGH);
  digitalWrite(PIN_LED_ROJO, LOW);
  estado = ESTADO_AMARILLO;
  ultimoCambio = tiempo;
 }
 void encenderVerde()
 {
  digitalWrite(PIN_LED_VERDE, HIGH);
  digitalWrite(PIN_LED_AMARILLO, LOW);
  digitalWrite(PIN_LED_ROJO, LOW);
  estado = ESTADO_VERDE;
  ultimoCambio = tiempo;
 }


 void intro_0(){ 
 lcd.clear();  // Borra el  LCD
 lcd.setCursor(0,0);         // Se posiciona en la Columna 3, Fila 0
 lcd.print("REGADOR");
 lcd.setCursor(0,1);
 lcd.print("ELECTRONICO");
 delay(4000);                // espera 4 segundos mostrando el intro
 lcd.clear();
}
/////////////////////Menu_1  //////////////////////////////////
void menu_1(){ 
   lcd.setCursor(0,0);
   lcd.print("ON     1");
   lcd.setCursor(10,0);
   lcd.print("OFF  2");   
   lcd.setCursor(0,1);
   lcd.print("AUTO   3"); 
   lcd.setCursor(10,1);
   lcd.print("MAS  *");
}
/////////////////////Accion 1 //////////////////////////////
void accion_1(){ 
  if(pulsacion == '1') encenderVerde();
  if(pulsacion == '2') apagar();
  if(pulsacion == '3') contador = 3;
  if(pulsacion == '*') contador = 2;
}
void menu_2(){ 
   lcd.setCursor(0,0);
   lcd.print("TEMP. HIDRANTE 1");
   lcd.setCursor(0,1);
   lcd.print("TEMP. SECTORES 2");    
}
void accion_2(){ 
  if(pulsacion == '1') 
  if(pulsacion == '2') contador = 6;  
  if(pulsacion == '0') contador = 1;
}
void menu_3(){ 
   lcd.setCursor(0,0);
   lcd.print("DIA :           ");
   lcd.setCursor(0,1);
   lcd.print("HORA :         *");
}
void accion_3(){ 
  if(pulsacion == '*') contador = 1;
  if(pulsacion == '0') contador = 1;
}
void menu_4(){
   lcd.clear();
   lcd.setCursor(0,0);
   lcd.print("SEGUNDOS       1");
   lcd.setCursor(0,1);
   lcd.print("MENU           *");
}
void accion_4(){
  if(pulsacion == '*') contador = 1;
  if(pulsacion == '1'); // DEBERA COGER VALOR Y TRASPASARLO A MILLES DE CODIGO
}
void menu_5(){
   lcd.clear();
   lcd.setCursor(0,0);
   lcd.print("SEGUNDOS       1");
   lcd.setCursor(0,1);
   lcd.print("MENU           *");
}
void accion_5(){
  if(pulsacion == '*') contador = 1;
  if(pulsacion == '1'); // DEBERA COGER VALOR Y TRASPASARLO A MILLES DE CODIGO
}
void AUTO(){ 
  lcd.setCursor(0,0);
  lcd.print("DIA");
  lcd.setCursor(0,1);
  lcd.print("HORA");
}

Te recomiendo crear un menu básico El profe Garcia.