LCD 1602 Keypad Shield Zeitschaltuhr

Was ist an dem Code falsch? Wieso kann man da mit dem Sainsmart KeypadShield die Std,Min nicht verstellen?

time_t S1_OnHour =18;
time_t S1_OnMinute =30;
int S1_OffHour =22;
int8_t S1_OffMinute =30;
int8_t S2_OnHour =18;
int8_t S2_OnMinute =0;
int8_t S2_OffHour =22;
int8_t S2_OffMinute =0;

 #define Schaltzeit(_hr_, _min_) (_hr_ * SECS_PER_HOUR + _min_ * SECS_PER_MIN)
 #define Schaltzeit1 (currentTime >= S1_OnTime) && (currentTime <= S1_OffTime)
 #define Schaltzeit2 (currentTime >= S2_OnTime) && (currentTime <= S2_OffTime)
 time_t currentTime = Schaltzeit(hour(), minute());
 time_t S1_OnTime = Schaltzeit(S1_OnHour, S1_OnMinute);
 time_t S1_OffTime = Schaltzeit(S1_OffHour, S1_OffMinute);
 time_t S2_OnTime = Schaltzeit(S2_OnHour, S2_OnMinute);
 time_t S2_OffTime = Schaltzeit(S2_OffHour, S2_OffMinute);
  void HELP_FUNC_set_szeit(int8_t l_i)
  {
    // position auswählen
    switch(_pos)
    {
      // wert verändern, entweder nach oben oder nach unten
      case 0: Schaltzeit(S1_OnHour+l_i,S1_OnMinute); break; // hour
      case 1: Schaltzeit(S1_OnHour,S1_OnMinute+l_i); break; // hour
      case 2: S1_OffHour+l_i,S1_OffMinute; break; // hour
      case 3: S1_OffHour,S1_OffMinute+l_i; break; // hour
      case 4: S2_OnHour+l_i,S2_OnMinute,S2_OffHour,S2_OffMinute; break; // hour
      case 5: S2_OnHour,S2_OnMinute+l_i,S2_OffHour,S2_OffMinute; break; // hour
      case 6: S2_OnHour,S2_OnMinute,S2_OffHour+l_i,S2_OffMinute; break; // hour
      case 7: S2_OnHour,S2_OnMinute,S2_OffHour,S2_OffMinute+l_i; break; // hour
    }
  }
  
  void FUNC_szeit(void)
  {
    /* --------- INIT ---------
     * Initialisierung dieser Funktion
     * wird nur einmal beim Start dieser Funktion ausgefuert
     * danach nur erneut, wenn die Menu Funktion verlassen wurde
     * wenn keine Variablen initialisiert werden müssen, kann diese 
     * Funktion anstatt mit if(!LCDML.FuncInit()) ....     mit 
     * LCDML.FuncInit();  aufgerufen werden     
     */   
    LCDML.FuncInit();
    
    
    /* --------- LOOP ----------
     * Hier sollte der Code stehen der ständig neu geladen wird 
     * z.B. eine Uhrzeit oder änliches.
     */
       if(LCDML.Timer(g_timer_wait, 1000)) 
    {
      char lcdline[17]; 
      lcd.clear();
      lcd.setCursor(0,0);
      sprintf(lcdline,"%02d:%02d",S1_OnHour,S1_OnMinute);
      lcd.print(lcdline);
      lcd.setCursor(0,1);
      sprintf(lcdline,"%02d:%02d",S1_OffHour,S1_OffMinute);
      lcd.print(lcdline);

    }
    
    /* Hier wird nur ein Ereignis ausgelöst, sobald ein Button gedrückt
     * wurde. Die Funktion LCDML.checkButtons liefert true, wenn ein Button 
     * seit dem letztem durchlauf betätigt wurde, ansonsten false.     
     */
    if(LCDML.checkButtons()) 
    {
      //Bei Buttons kannst du am besten immer >= abfragen, da ansonsten keine Auktion ausgeführt wird, wenn du Button up = 2 hast
      //Button Up auswerten
      if (LCDML.g_button_up >= 1) 
      {
        // zurücksetzen des Buttons
        LCDML.g_button_up = 0;
        // setzen des datum, ich habe hier mal eine Funktion erstellt, die den Quellcode minimiert
        HELP_FUNC_set_szeit(1);
      } 
      
      //Button down auswerten
      if(LCDML.g_button_down >= 1)
      {
        // zurücksetzen des Buttons
        LCDML.g_button_down = 0;
        // setzen des datum, ich habe hier mal eine Funktion erstellt, die den Quellcode minimiert
        HELP_FUNC_set_szeit(-1);
      }
    
      // Button right auswerten
      if (LCDML.g_button_right >= 1) 
      {
        // als erstes immer alles zurücksetzen wann man nicht mehr benötigt, dann vergiss man es nicht und es ensteht 
        // ein gewisses maß an ordnung
        LCDML.g_button_right=0;
        
        _pos=(_pos+1)%8;
        
        // hier standen mal ifs abfragen, ich bevorzuge switch da dieses wesentlich schneller als if ist und die position 
        // immer nur einen wert einnehmen kann, daher ist der code so übersichtlicher
        switch(_pos)
        {
          case 0: lcd.setCursor(0,0); break;
          case 1: lcd.setCursor(3,0); break;
          case 2: lcd.setCursor(0,1); break;
          case 3: lcd.setCursor(3,1); break;
          case 4: lcd.setCursor(8,0);  break;
          case 5: lcd.setCursor(11,0); break;
          case 6: lcd.setCursor(8,1);  break;
          case 7: lcd.setCursor(11,1); break;
        }        
      }
    }
        
    /* --------- STOP  ---------      
     * CTR_func_end (direct, enter, up, down, left, right)
     * Fall in dieser Funktion keine Variablen zurückgesetzt werden 
     * müssen, kann diese Funktion auch vereinfacht mit CTR_end(0, 1, 1, 1, 1, 1);
     * aufgerufen werden. Die Endbedingungen müssen durch die Zahlen >0 vorgegeben 
     * werden
     * Wenn alles 0 ist, hängt das gesammte Programm in dieser Funktion fest
     */
    if(LCDML.FuncEnd(0, 1, 0, 0, 0, 0)) 
    {
      /* Falls noch Variablen zurückgesetzt werden müssen, bevor diese Funktion
       * verlassen wird, kann dies in dieser If Schleife geschehen
       */
    } 
      
  }