#include <Stepper.h> 
#include "RTC.h"

int x, y, z;                        // Motorvariablen für Schritte
int i;
int SPU = 2048;                     // Schritte pro Umdrehung.  

Stepper Motor1(SPU, 2, 4, 3, 5);
Stepper Motor2(SPU, 6, 8, 7, 9);
Stepper Motor3(SPU, 10, 12, 11, 13);

void setup() {
  Serial.begin(9600);
  RTC.begin();
    RTCTime startTime(9, Month::JANUARY, 2024, 16, 50, 00,
                      DayOfWeek::THURSDAY, SaveLight::SAVING_TIME_ACTIVE);
    RTC.setTime(startTime);

  pinMode(A0, OUTPUT);      // LED Pins
  pinMode(A1, OUTPUT);
  pinMode(A2, OUTPUT);
  pinMode(A3, INPUT);       // Endschalter Pins
  pinMode(A4, INPUT);
  pinMode(A5, INPUT);
  Motor1.setSpeed(5);       // Motorgeschwindigkeit
  Motor2.setSpeed(5);
  Motor3.setSpeed(5);

for (int i = 1; i <= 5; i++) {
    digitalWrite(A0, HIGH);
    delay(300);
    digitalWrite(A0, LOW);
    delay(300);
    digitalWrite(A1, HIGH);
    delay(300);
    digitalWrite(A1, LOW);
    delay(300);
    digitalWrite(A2, HIGH);
    delay(300);
    digitalWrite(A2, LOW);
    delay(300);
}

  if (analogRead(A3) < 800) {             // Überprüft ob Klappe 1 offen ist
    Motor1.setSpeed(10);
    while (analogRead(A3) < 800) {        // Fährt auf Nullstellung zurück, wenn nicht betätigt
      Motor1.step(1);                     
    }
    Motor1.setSpeed(5);                   // Motorpins nicht mehr ansteuern
    digitalWrite(2,LOW);
    digitalWrite(3,LOW);
    digitalWrite(4,LOW);
    digitalWrite(5,LOW);
    delay(500);
  }

  if (analogRead(A4) < 800) {             // Überprüft ob Klappe 2 offen ist
    Motor2.setSpeed(10);
    while (analogRead(A4) < 800) {        // Fährt auf Nullstellung zurück, wenn nicht betätigt
      Motor2.step(1);                      
    }
    Motor2.setSpeed(5);
    digitalWrite(6,LOW);
    digitalWrite(7,LOW);
    digitalWrite(8,LOW);
    digitalWrite(9,LOW);
  delay(500);
  }

    if (analogRead(A5) < 800) {             // Überprüft ob Klappe 3 offen ist
      Motor3.setSpeed(10);
      while (analogRead(A5) < 800) {        // Fährt auf Nullstellung zurück, wenn nicht betätigt
        Motor3.step(1);                      
      }
    Motor3.setSpeed(5);
    digitalWrite(10,LOW);
    digitalWrite(11,LOW);
    digitalWrite(12,LOW);
    digitalWrite(13,LOW);
    delay(500);
  }

digitalWrite(A0,HIGH);                      // Leuchtende LED zeigt Oberseite an 
delay(5000);                                // fünf Sekunden zum Ausrichten des Würfels
digitalWrite(A0,LOW);  
}


void loop() { 
  RTCTime currentTime;
  RTC.getTime(currentTime);

  x = 0;   
  if (x == 0){ 
  RTCTime currentTime;
  RTC.getTime(currentTime);                                       	       // Klappe 1 
    Serial.print(currentTime.getMinutes());
    Serial.print("  Start  ");
    Serial.println(((currentTime.getMinutes() / 5) * 5 ) / 5 * (2900));
    Motor1.step(((currentTime.getMinutes() / 5) * 5) / 5 * (-2900));       // Aktuelle Startminute abrunden und Klappe auffahren
    x = ((currentTime.getMinutes() / 5) * 5 ) / 5 * (2900);          
  }

  while (x < 37000){  
      RTCTime  currentTime;
      RTC.getTime(currentTime);         
      switch (currentTime.getMinutes()){
        case 5:
        case 10:
        case 15:
        case 20:
        case 25:
        case 30:
        case 35:
        case 40:
        case 45:
        case 50:
        case 55:
          Motor1.step(-2900);                                   // elf gleich große Schritte alle fünf Minuten
          x = x + 2900;
          break;
        case 59:
          while(currentTime.getSeconds() < 59){
            Motor1.step(-5100);                                 // Letzen fünf Minuten mit mehr Schritten, um Umfallen zu garantieren
            x = x + 5100;
            break;  
          }
      }
      digitalWrite(2,LOW);
      digitalWrite(3,LOW);
      digitalWrite(4,LOW);
      digitalWrite(5,LOW);
      delay(5000);                                             // Warte 5 Sekunden, bis Stunde angezeigt wird  

      switch (currentTime.getMinutes()){
        case 5:
        case 10:
        case 15:
        case 20:
        case 25:
        case 30:
        case 35:
        case 40:
        case 45:
        case 50:
        case 55:
          while (currentTime.getMinutes() == 5 || currentTime.getMinutes() == 10 || currentTime.getMinutes() == 15 || currentTime.getMinutes() == 20 || currentTime.getMinutes() == 25 || currentTime.getMinutes() == 30 || currentTime.getMinutes() == 35 || currentTime.getMinutes() == 40 || currentTime.getMinutes() == 45 || currentTime.getMinutes() == 50 || currentTime.getMinutes() == 55){
              for (int i = 0; i < currentTime.getHour(); i++) {
                digitalWrite(A0, HIGH);
                delay(250);
                digitalWrite(A0, LOW);
                delay(250);
              }  
            delay(5500);
            RTC.getTime(currentTime);  
          }
          break;
        default:
          if (x < 37000){
              for (int i = 0; i < currentTime.getHour(); i++) {
                digitalWrite(A0, HIGH);
                delay(250);
                digitalWrite(A0, LOW);
                delay(250);
              }
            delay(5500);
          }
        break;
      }
    Serial.print(currentTime.getMinutes());
    Serial.print(":");
    Serial.print(currentTime.getSeconds());
    Serial.print("  M1  ");
    Serial.println(x); 
    }
  
  delay(1000);
  Motor1.setSpeed(10);
    while (analogRead(A3) < 800) {                           // Fährt auf Nullstellung zurück, bis Endschalter gedrückt wird
    Motor1.step(1);
    }
  Motor1.setSpeed(5);
  digitalWrite(2,LOW);
  digitalWrite(3,LOW);
  digitalWrite(4,LOW);
  digitalWrite(5,LOW);
  delay(500);

                              y = 0;                                                   // Klappe 2 
                              while (y < 37000){
                                RTCTime currentTime;
                                RTC.getTime(currentTime);
                                switch (currentTime.getMinutes()){
                                  case 5:
                                  case 10:
                                  case 15:
                                  case 20:
                                  case 25:
                                  case 30:
                                  case 35:
                                  case 40:
                                  case 45:
                                  case 50:
                                  case 55:
                                    Motor2.step(-2900);                                 // elf gleich große Schritte alle fünf Minuten
                                    y = y + 2900;
                                    break;
                                  case 59:
                                    while(currentTime.getSeconds() < 59 ){
                                      Motor2.step(-5100);                               // Letzen fünf Minuten mit mehr Schritten, um Umfallen zu garantieren
                                      y = y + 5100;
                                      break;
                                    }
                                  }
                                  digitalWrite(6,LOW);
                                  digitalWrite(7,LOW);
                                  digitalWrite(8,LOW);
                                  digitalWrite(9,LOW);
                                  delay(5000);                                          // Warte 5 Sekunden, bis Stunde angezeigt wird

                                  switch (currentTime.getMinutes()){
                                  case 5:
                                  case 10:
                                  case 15:
                                  case 20:
                                  case 25:
                                  case 30:
                                  case 35:
                                  case 40:
                                  case 45:
                                  case 50:
                                  case 55:
                                    while (currentTime.getMinutes() == 5 || currentTime.getMinutes() == 10 || currentTime.getMinutes() == 15 || currentTime.getMinutes() == 20 || currentTime.getMinutes() == 25 || currentTime.getMinutes() == 30 || currentTime.getMinutes() == 35 || currentTime.getMinutes() == 40 || currentTime.getMinutes() == 45 || currentTime.getMinutes() == 50 || currentTime.getMinutes() == 55){
                                        for (int i = 0; i < currentTime.getHour(); i++) {
                                          digitalWrite(A1, HIGH);
                                          delay(250);
                                          digitalWrite(A1, LOW);
                                          delay(250);
                                        }  
                                      delay(5500);
                                      RTC.getTime(currentTime);  
                                    }
                                    break;
                                  default:
                                    if (y < 37000){
                                        for (int i = 0; i < currentTime.getHour(); i++) {
                                          digitalWrite(A1, HIGH);
                                          delay(250);
                                          digitalWrite(A1, LOW);
                                          delay(250);
                                        }
                                      delay(5500);
                                    }
                                  break;
                                }
                                Serial.print(currentTime.getMinutes());
                                Serial.print(":");
                                Serial.print(currentTime.getSeconds());
                                Serial.print("  M2  ");
                                Serial.println(y); 
                              }
                              delay(1000);
                              Motor2.setSpeed(10);
                                while (analogRead(A4) < 800) {                           // Fährt auf Nullstellung zurück, bis Endschalter gedrückt wird
                                Motor2.step(1);
                                }
                              Motor2.setSpeed(5);
                              digitalWrite(6,LOW);
                              digitalWrite(7,LOW);
                              digitalWrite(8,LOW);
                              digitalWrite(9,LOW);
                              delay(500);

                                                          z = 0;                                                      // Klappe 3
                                                          while (z < 37000){
                                                              RTCTime currentTime;
                                                              RTC.getTime(currentTime);
                                                              switch (currentTime.getMinutes()){
                                                                case 5:
                                                                case 10:
                                                                case 15:
                                                                case 20:
                                                                case 25:
                                                                case 30:
                                                                case 35:
                                                                case 40:
                                                                case 45:
                                                                case 50:
                                                                case 55:
                                                                  Motor3.step(-2900);                                 // elf gleich große Schritte alle fünf Minuten
                                                                  z = z + 2900;
                                                                  break;
                                                                case 59:
                                                                  while(currentTime.getSeconds() < 59){
                                                                    Motor3.step(-5100);                               // Letzen fünf Minuten mit mehr Schritten, um Umfallen zu garantieren
                                                                    z = z + 5100;
                                                                    break;
                                                                  }
                                                               }
                                                            digitalWrite(10,LOW);
                                                            digitalWrite(11,LOW);
                                                            digitalWrite(12,LOW);
                                                            digitalWrite(13,LOW);
                                                            delay(5000);                                              // Warte 5 Sekunden, bis Stunde angezeigt wird

                                                            switch (currentTime.getMinutes()){
                                                            case 5:
                                                            case 10:
                                                            case 15:
                                                            case 20:
                                                            case 25:
                                                            case 30:
                                                            case 35:
                                                            case 40:
                                                            case 45:
                                                            case 50:
                                                            case 55:
                                                              while (currentTime.getMinutes() == 5 || currentTime.getMinutes() == 10 || currentTime.getMinutes() == 15 || currentTime.getMinutes() == 20 || currentTime.getMinutes() == 25 || currentTime.getMinutes() == 30 || currentTime.getMinutes() == 35 || currentTime.getMinutes() == 40 || currentTime.getMinutes() == 45 || currentTime.getMinutes() == 50 || currentTime.getMinutes() == 55){
                                                                  for (int i = 0; i < currentTime.getHour(); i++) {
                                                                    digitalWrite(A2, HIGH);
                                                                    delay(250);
                                                                    digitalWrite(A2, LOW);
                                                                    delay(250);
                                                                  }  
                                                                delay(5500);
                                                                RTC.getTime(currentTime);  
                                                              }
                                                              break;
                                                            default:
                                                              if (z < 37000){
                                                                  for (int i = 0; i < currentTime.getHour(); i++) {
                                                                    digitalWrite(A2, HIGH);
                                                                    delay(250);
                                                                    digitalWrite(A2, LOW);
                                                                    delay(250);
                                                                  }
                                                                delay(5500);
                                                              }
                                                            break;
                                                            }
                                                            Serial.print(currentTime.getMinutes());
                                                            Serial.print(":");
                                                            Serial.print(currentTime.getSeconds());
                                                            Serial.print("  M3  ");
                                                            Serial.println(z); 
                                                          }
                                                          delay(1000);
                                                          Motor3.setSpeed(10);
                                                            while (analogRead(A5) < 800) {                           // Fährt auf Nullstellung zurück, bis Endschalter gedrückt wird
                                                            Motor3.step(1);
                                                            }
                                                          Motor3.setSpeed(5);
                                                          digitalWrite(10,LOW);
                                                          digitalWrite(11,LOW);
                                                          digitalWrite(12,LOW);
                                                          digitalWrite(13,LOW);
                                                          delay(500);
}
