#include <LiquidCrystal_I2C.h> // Library for LCD
LiquidCrystal_I2C lcd(0x27, 20, 4); // I2C address 0x27, 20 column and 4 rows
#include "DHT.h"
#include <TimerOne.h>


//Eingänge
#define DHTPIN 8
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);

int analogPin = A0;
int val = 0;
bool wasser = false;

#define button 2
#define down 6
#define up 3

volatile int temp_soll = 20;

const unsigned long zeit = 1000000;
volatile int zaehler_timer;


bool lcd_update = false;
bool menu_merker = false;
int lcd_seite = 0;

int item_selected = 0;

// Pins für den Rotary Encoder
const int encoderPinA = 2;
const int encoderPinB = 3;
const int encoderButtonPin = 4;

volatile int menuIndex = 0; // Aktuelle Menüauswahl
const char* menuItems[] = {"Temp_Soll", "Temp_Hyst.", "Feuchte_Soll", "Feuchte Hyst"};
const int numMenuItems = sizeof(menuItems) / sizeof(menuItems[0]);





//################################################
void menu_aufruf() {

  menu_merker = true;
  //item_selected = 0;

  //Serial.println(menu_merker);



}
//#############################

void zeitbasis() {

  zaehler_timer++;

  if (zaehler_timer == 10) {
    //lcd_aktualisieren = 1;
  }
  if (zaehler_timer == 10) {

    //Freigabe_Messung = 1;
    //lcd_aktualisieren = 1;
    //lcd_seite = 1;
  }

  if (zaehler_timer == 15) {
    //lcd_aktualisieren = 1;
    //zaehler_timer = 0;
  }

}

void setup() {
  Serial.begin(9600); // Setup der seriellen Verbindung

  pinMode(button, INPUT);
  pinMode(button, INPUT_PULLUP);
  pinMode(down, INPUT);
  pinMode(down, INPUT_PULLUP);
  pinMode(up, INPUT);
  pinMode(up, INPUT_PULLUP);


  //Sensor initialisieren
  dht.begin();

  //LCD initialisieren
  lcd.init(); //initialize the lcd
  lcd.backlight(); //open the backlight


  //Timer Interrupt
  Timer1.initialize(zeit);
  Timer1.attachInterrupt(zeitbasis);



  // Rotary Encoder Setup
  pinMode(encoderPinA, INPUT_PULLUP);
  pinMode(encoderPinB, INPUT_PULLUP);
  pinMode(encoderButtonPin, INPUT_PULLUP);






  // Attach Interrupts
  attachInterrupt(digitalPinToInterrupt(encoderPinA), menuChange, CHANGE);
  attachInterrupt(digitalPinToInterrupt(encoderPinB), menuChange, CHANGE);
  attachInterrupt(digitalPinToInterrupt(encoderButtonPin), menuSelect, FALLING);



  attachInterrupt(digitalPinToInterrupt(2), menu_aufruf, HIGH);





  void wasserstandsmessung() {
    val = analogRead(analogPin); // Pin einlesen

    if (val > 1000) {

      wasser = 1;
      lcd_update = true;
      lcd_seite = 0;

      //Serial.println("Wasser im Behälter erkannt");

    }

    else {

      wasser = 0;
      lcd_update = true;
      lcd_seite = 1;

      //Serial.println("kein Wasser im Behälter");


    }


  }


  void lcd_anzeige() {

    if (((lcd_update == true) && (menu_merker == false))) {

      lcd_update = false;

      lcd.clear();

      switch (lcd_seite) {

        case 0:

          lcd.setCursor(0, 0); //Text soll beim ersten Zeichen in der ersten Reihe beginnen..
          lcd.print("Alle"); //In der ersten Zeile soll der Text „Test Zeile 1“ angezeigt werden
          lcd.setCursor(0, 1); //Genauso geht es bei den weiteren drei Zeilen weiter
          lcd.print("Messwerte");
          lcd.setCursor(0, 2);
          lcd.print("im");
          lcd.setCursor(0, 3);
          lcd.print("erlaubten Bereich");

          break;

        case 1:  //Wassermangel

          lcd.setCursor(0, 0); //Text soll beim ersten Zeichen in der ersten Reihe beginnen..
          lcd.print("Kein"); //In der ersten Zeile soll der Text „Test Zeile 1“ angezeigt werden
          lcd.setCursor(0, 1); //Genauso geht es bei den weiteren drei Zeilen weiter
          lcd.print("Wasser");
          lcd.setCursor(0, 2);
          lcd.print("im");
          lcd.setCursor(0, 3);
          lcd.print("Behaelter!");

          break;


      }
    }

    if (menu_merker == true) {

      //menu_merker = false;

      lcd.clear();

      switch (item_selected) {

        case 0:

          lcd.setCursor(0, 0); //Text soll beim ersten Zeichen in der ersten Reihe beginnen..
          lcd.print(">Sollwert Temperatur"); //In der ersten Zeile soll der Text „Test Zeile 1“ angezeigt werden
          lcd.setCursor(1, 1); //Genauso geht es bei den weiteren drei Zeilen weiter
          lcd.print("Temperatur Hyster.");
          lcd.setCursor(1, 2);
          lcd.print("Sollw. Lu.-Feuchte");
          lcd.setCursor(1, 3);
          lcd.print("Lu.Feuchte Hyster");

          break;

        case 1:

          lcd.setCursor(0, 0); //Text soll beim ersten Zeichen in der ersten Reihe beginnen..
          lcd.print(" Sollwert Temperatur"); //In der ersten Zeile soll der Text „Test Zeile 1“ angezeigt werden
          lcd.setCursor(1, 1); //Genauso geht es bei den weiteren drei Zeilen weiter
          lcd.print(">Temperatur Hyster.");
          lcd.setCursor(1, 2);
          lcd.print(" Sollw. Lu.-Feuchte");
          lcd.setCursor(1, 3);
          lcd.print(" Lu.-Feuchte Hyster.");

          break;

      }

    }

  }



  void loop() {

    wasserstandsmessung();

    if (menu_merker == true) {

      if ((digitalRead(up))) {

        item_selected++;
        delay(100);
      }

      if ((digitalRead(down))) {
        delay(100);

        item_selected--;
      }


    }

    lcd_anzeige();

    Serial.println(zaehler_timer);
    Serial.print(item_selected);

    delay(1000);

  }