#include <LiquidCrystal.h>

#include <dht_nonblocking.h>
#include <Arduino.h>
#include <Wire.h>
#include <DS3231.h>

#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP085_U.h>

#define CLK 2
#define DIO 3
DS3231 clock;

RTCDateTime dt;
LiquidCrystal lcd(8, 9, 10, 11, 12, 13);

#define DHT_SENSOR_TYPE DHT_TYPE_11
static const int DHT_SENSOR_PIN = 2; 
DHT_nonblocking dht_sensor( DHT_SENSOR_PIN, DHT_SENSOR_TYPE );

Adafruit_BMP085_Unified bmp = Adafruit_BMP085_Unified(10085);


bool colonVisible = false;
int pause = 500;

String speicher = "";
int zaehler = 0;
String zeile = "";

int stunde = 20;
int minute = 10;
int sekunde = 10;

float groundLevelPressure;

void setup() {
  lcd.begin(16, 2);
  lcd.setCursor(0, 0);
  clock.begin();
  //clock.setDateTime(__DATE__, __TIME__);
  if (!bmp.begin())
  {
    /* There was a problem detecting the BMP085 ... check your connections */
    lcd.print("Kein BMP085");
    while (1);
  }
  sensors_event_t event;
  bmp.getEvent(&event);
  groundLevelPressure = event.pressure;
}

void druckeZahl(int zahl) {
  if (zahl < 10) {
    lcd.print(0);
  }
  lcd.print(zahl);
}

void meinPrint(String zeile) {
  if (zaehler == 0) {
    lcd.setCursor(0, 0);
    lcd.print(zeile);
  }
  else {
    if (zaehler == 1) {
      lcd.setCursor(0, 1);
      lcd.print(zeile);
      speicher = zeile;
    }
    else {
      lcd.setCursor(0, 0);
      lcd.print("                ");
      lcd.setCursor(0, 1);
      lcd.print("                ");
      lcd.setCursor(0, 1);
      lcd.print(zeile);
      lcd.setCursor(0, 0);
      lcd.print(speicher);
      speicher = zeile;
    }
  }
  zaehler++;
}

float humidity;
float temperature;

int modus = 2;
//1 temperatur, 2 datum, 3 luftfeuchtigkeit

void loop() {

  if (modus == 1) {
    lcd.setCursor(0, 1);
    lcd.print("                ");
    lcd.setCursor(0, 1);
    bmp.getTemperature(&temperature);
    lcd.print("Temp: ");
    lcd.print(temperature, 1);
    lcd.print(" C");
  }

  if (modus == 2) {
    dt = clock.getDateTime();
    lcd.setCursor(0, 1);
    lcd.print("                ");
    lcd.setCursor(0, 1);
    if (dt.dayOfWeek == 1) {
      lcd.print("Montag");
    }
    if (dt.dayOfWeek == 2) {
      lcd.print("Dienstag");
    }
    if (dt.dayOfWeek == 3) {
      lcd.print("Mittwoch");
    }
    if (dt.dayOfWeek == 4) {
      lcd.print("Donnerstag");
    }
    if (dt.dayOfWeek == 5) {
      lcd.print("Freitag");
    }
    if (dt.dayOfWeek == 6) {
      lcd.print("Samstag");
    }
    if (dt.dayOfWeek == 7) {
      lcd.print("Sonntag");
      dt.dayOfWeek = 0;
    }
  }

  if (modus == 3) {
    dt = clock.getDateTime();
    lcd.setCursor(0, 1);
    lcd.print("                ");
    lcd.setCursor(0, 1);
    lcd.print(dt.day);
    lcd.print(".");
    lcd.print(dt.month);
    lcd.print(".");
    lcd.print(dt.year);
  }

  if (modus == 4) {
    lcd.setCursor(0, 1);
    lcd.print("                ");
    lcd.setCursor(0, 1);
    lcd.print("Feuchte: ");
    lcd.print(humidity, 1);
    lcd.print("%");
  }

  if (modus == 5) {
    lcd.setCursor(0, 1);
    lcd.print("                ");
    lcd.setCursor(0, 1);
    sensors_event_t event;
    bmp.getEvent(&event);
    if (event.pressure) {
      // Display atmospheric pressue in hPa
      lcd.print("Druck: ");
      lcd.print(round(event.pressure));
      lcd.print(" hPa");
    }
  }

  if (modus == 6) {
    lcd.setCursor(0, 1);
    lcd.print("                ");
    sensors_event_t event;
    bmp.getEvent(&event);
    int pressure = event.pressure;
    lcd.setCursor(0, 1);
    if (pressure < 1000) {
      lcd.print("Mistwetter");
    }
    if (pressure > 1000 && pressure < 1025) {
      lcd.print("Veraenderlich");
    }
    if (pressure > 1025) {
      lcd.print("Sonne");
    }
  }

  if (modus == 7) {
    lcd.setCursor(0, 1);
    lcd.print("                ");
    lcd.setCursor(0, 1);
    sensors_event_t event;
    bmp.getEvent(&event);
    int pressure = event.pressure;
    if (pressure) {
      float seaLevelPressure = 1026; // SENSORS_PRESSURE_SEALEVELHPA;
      lcd.print("Hoehe: ");
      lcd.print(round(bmp.pressureToAltitude(seaLevelPressure,
                                             event.pressure)));
      lcd.print(" m");
    }
  }

  if (modus == 8) {
    lcd.setCursor(0, 1);
    lcd.print("                ");
    lcd.setCursor(0, 1);
    sensors_event_t event;
    bmp.getEvent(&event);
    int pressure = event.pressure;
    if (pressure) {
      lcd.print("Flughoehe: ");
      lcd.print(round(bmp.pressureToAltitude(groundLevelPressure,
                                             event.pressure)));
      lcd.print("m");
    }
  }

  if (modus == 10) {
    dt = clock.getDateTime();
    lcd.setCursor(0, 1);
    lcd.print("                ");
    lcd.setCursor(0, 1);
    if (dt.month == 1) {
      lcd.setCursor(0, 1);
      lcd.print("Januar");
    }
    lcd.setCursor(0, 1);
    if (dt.month == 2) {
      lcd.setCursor(0, 1);
      lcd.print("Febrauar");
    }
    lcd.setCursor(0, 1);
    if (dt.month == 3) {
      lcd.setCursor(0, 1);
      lcd.print("März");
    }
    lcd.setCursor(0, 1);
    if (dt.month == 4) {
      lcd.setCursor(0, 1);
      lcd.print("April");
    }
    lcd.setCursor(0, 1);
    if (dt.month == 5) {
      lcd.setCursor(0, 1);
      lcd.print("Mai");
    }
    lcd.setCursor(0, 1);
    if (dt.month == 6) {
      lcd.setCursor(0, 1);
      lcd.print("Juni");
    }
    lcd.setCursor(0, 1);
    if (dt.month == 7) {
      lcd.setCursor(0, 1);
      lcd.print("Juli");
    }
    lcd.setCursor(0, 1);
    if (dt.month == 8) {
      lcd.setCursor(0, 1);
      lcd.print("August");
    }
    lcd.setCursor(0, 1);
    if (dt.month == 9) {
      lcd.setCursor(0, 1);
      lcd.print("September");
    }
    lcd.setCursor(0, 1);
    if (dt.month == 10) {
      lcd.setCursor(0, 1);
      lcd.print("Oktober");
    }
    lcd.setCursor(0, 1);
    if (dt.month == 11) {
      lcd.setCursor(0, 1);
      lcd.print("November");
    }

    lcd.setCursor(0, 1);
    if (dt.month == 12) {
      lcd.setCursor(0, 1);
      lcd.print("Dezember");
    }
  }

  modus++;
  if (modus == 11) {
    modus = 1;
  }

  for (int i = 0; i < 25; i++) {
    dt = clock.getDateTime();
    lcd.setCursor(0, 0);
    druckeZahl(dt.hour);
    lcd.print(":");
    druckeZahl(dt.minute - 1);
    lcd.print(":");
    druckeZahl(dt.second);

    // während der 200ms Wartezeit messen wir
    for (int j = 0; j < 20; j++) {
      dht_sensor.measure(&temperature, &humidity);
      delay(10);
    }
  }

}