int sensorPin = A0; // Analogeingang für den Lichtsensor
 int schaltuhr = 3; // Eingang von Schaltuhr
 int NachtLed = 2; // leuchtet bei Nacht, Ausgang ist dann auf High
 int outputPin1 = A4; //Bür0
 int outputPin2 = A5; // Schlafz. li. Fe.+Tü.
 int outputPin3 = 13; // Schlafz.Tü.re
 int outputPin4 = 12; // Wohnzimmer kompl.
 int outputPin5 = 11; // Küche
 int outputPin6 = 10; // WC
 int tagPin1 = 9; //Schlafz. li. Fe.+Tü.
 int tagPin2 = 8; //Schlafz.re Tü.
 int tagPin3 = 7; //Büro
 int tagPin4 = 6; //Küche + WC
 int tagPin5 = 5; //Wohnzimmer kompl.
 int tagPin6 = 4; //Schlafz. Fe. re.
 int schaltpin1 = A1; // Eingang Schalterstellung
 int schaltpin2 = A2;
 int schaltpin3 = A3;
 

const int myArray[] ={680,850,940};// hier wird die Dunkelphase bestimmt

 int nachtschwelle = 850;  //Umschaltung von Tag auf Nacht, //zur Sicherheit,  wenn Schalter Unterbrechung durch einen Defekt hat
int sensorValue;
const unsigned long aktivierungsdauer = 2000; // Dauer der Aktivierung real in Millisekunden (1 Minute)
bool SeperateFenster = false; //Separates Fenster
int AktivSchaltuhr = 0;
bool dunkel = false; // Flag, um den Dunkelheitszustand zu verfolgen
bool hell = true;  // am Tage
bool fenrech = false;
bool kontakt = false;
bool Tag = false;
bool Nacht = false;
bool verzNacht = true;
bool verzTag = true;




void setup() {

    pinMode(sensorPin, INPUT);
    pinMode(outputPin1, OUTPUT); // Lege den Ausgang als Ausgang fest
    pinMode(outputPin2, OUTPUT); // Lege den Ausgang als Ausgang fest
    pinMode(outputPin3, OUTPUT); // Lege den Ausgang als Ausgang fest
    pinMode(outputPin4, OUTPUT); // Lege den Ausgang als Ausgang fest
    pinMode(outputPin5, OUTPUT); // Lege den Ausgang als Ausgang fest
    pinMode(outputPin6, OUTPUT); // Lege den Ausgang als Ausgang fest
    pinMode(schaltpin1, INPUT_PULLUP); // Schalterstellung auf Low abfragen und LED weiß anschalten
    pinMode(schaltpin2, INPUT_PULLUP); // Schalterstellung auf Low abfragen und LED gelb anschalten
    pinMode(schaltpin3, INPUT_PULLUP); // Schalterstellung auf Low abfragen und LED grün anschalten
    pinMode(NachtLed, OUTPUT);
    pinMode(schaltuhr, INPUT_PULLUP);
    pinMode(tagPin1, OUTPUT); //Schlafz. li. Fe.+Tü.
    pinMode(tagPin2, OUTPUT); //Schlafz.re Tü.
    pinMode(tagPin3, OUTPUT);
    pinMode(tagPin4, OUTPUT);
    pinMode(tagPin5, OUTPUT);
    pinMode(tagPin6, OUTPUT);

 }

void loop() //*********** Beginn der Hauptschleife ***************************!!!!!!!!!!!!!!!
{   

      sensorValue = analogRead(sensorPin); // Lese den Wert vom Lichtsensor  

      //************************************************ von hier bis 
      Schwellwertabfrage(); // Unterprogramm zur Abfrage Übergang Tag -> Nacht ****************************

      // Überprüfe, ob es hell ist
      if (sensorValue < nachtschwelle && verzTag == true)
      { // es ist noch tag
        dunkel = false;
//        verzTag = false;

      }

      //Schwellenschaltung von Nacht ---> Tag
      if (dunkel == false && hell == false) 
      {
          hell = true;
              //Signalisiert Tag / Nacht -> Hier Tag = aus
          digitalWrite(NachtLed, LOW); // weil wieder Tag

          Tag = true; // es ist Tag

      }
      if (sensorValue > nachtschwelle && verzNacht == true) // es ist bereits nacht 
      {
        verzNacht = false; // HIZUGEFÜGT ! 
        dunkel = true; // die Variable hell wird noch nicht verändert, wird später auf false gesetzt

      }
  
      //Schwellenschaltung von Tag ---> Nacht
      if (dunkel == true && hell == true) 
      {
        //Signalisiert Tag / Nacht -> Hier Nacht = ein
        digitalWrite(NachtLed, HIGH); // bei Nacht ist die rote LED an
        
        nachtsteuerung(); //************************************************************************UP Nacht
 
        hell = false; // erst jetzt ist es nicht mehr hell

          verzTag == true;
          Tag = true;
          delay(30000);

        SeperateFenster = false;  // Steuerung seperates Fenster freigeben

      }


      if(digitalRead(schaltuhr) == LOW && Tag == true)
      {
        tagesansteuerung(); // UP zur Tagesansteuerung
		
        Tag = false;
        SeperateFenster = false;

      }          

     if(digitalRead(schaltuhr) == HIGH)
     {
          if (SeperateFenster == false) 
          {
            // Separate fenstersteuerung
            fereschlaf();
            //Fenstersteuerung sperren
            SeperateFenster = true;
             verzNacht = true; // HIZUGEFÜGT !

          }
      }          

  
} //********************** Ende der Loop-Schleife   !!!!!!!!!!!!!!!!    ********************



// ************* Funktionen (Unterprogramme) *********************************************!!!!!!!!!!!!!


void Schwellwertabfrage(){ // Unterprogram Abfrage der Schalterstellung, der 3 Dunkelphasen

  //Potistufe 1 -> Standard
    if (digitalRead(A1) == LOW){
    nachtschwelle = myArray[0];

  }
  //Potistufe 2 -> Heller
  if (digitalRead(A2) == LOW){
    nachtschwelle = myArray[1];
  }
  //Potistufe 3 -> Heller als 2
  if (digitalRead(A3) == LOW){
    nachtschwelle = myArray[2];
 }    
}

void nachtsteuerung()
{
    digitalWrite(outputPin1, HIGH); // Büro
    delay(aktivierungsdauer);
     digitalWrite(outputPin1, LOW);
    delay(500);
    digitalWrite(outputPin2, HIGH); // Schlafz. li. Fe.+Tü.
    delay(aktivierungsdauer);
    digitalWrite(outputPin2, LOW);
    delay(500);
    digitalWrite(outputPin3, HIGH); // Schlafz.Tü.re
    delay(aktivierungsdauer);
    digitalWrite(outputPin3, LOW);
    delay(500);
    digitalWrite(outputPin4, HIGH); //Wohnzimmer kompl.
    delay(aktivierungsdauer);
    digitalWrite(outputPin4, LOW);
    delay(500);
    digitalWrite(outputPin5, HIGH); //  Küche
    delay(aktivierungsdauer);
    digitalWrite(outputPin5, LOW); //
    delay(500);
    digitalWrite(outputPin6, HIGH); // WC
    delay(aktivierungsdauer);
    digitalWrite(outputPin6, LOW); //
    delay(500);
  }

void tagesansteuerung()
{
    digitalWrite(tagPin1, HIGH); //Schlafz. li. Fe.+Tü.
    delay(aktivierungsdauer);
    digitalWrite(tagPin1, LOW);
    delay(500);
    digitalWrite(tagPin2, HIGH); //Schlafz.re Tü.
    delay(aktivierungsdauer);
    digitalWrite(tagPin2, LOW);
    delay(500);
    digitalWrite(tagPin3, HIGH); 7; //Büro
    delay(aktivierungsdauer);
    digitalWrite(tagPin3, LOW);
    delay(500);
    digitalWrite(tagPin4, HIGH); //Küche + WC
    delay(aktivierungsdauer);
    digitalWrite(tagPin4, LOW);
    delay(500);
    digitalWrite(tagPin5, HIGH); //Wohnzimmer
    delay(aktivierungsdauer);
    digitalWrite(tagPin5, LOW);
    delay(500);
 
}
void fereschlaf()
 {
if (digitalRead(NachtLed) == LOW && digitalRead(schaltuhr) == HIGH){
    digitalWrite(tagPin6, HIGH); //Schlafz. Fe. re.
    delay(aktivierungsdauer);
    digitalWrite(tagPin6, LOW);
    delay(500);
}
}