/*
  Juni 2025
  06_HTU_NTP_OLED.ino
  HTU21 Sensor Temperatur Luftfeuchte
  Detum und Uhrzeit aus dem Internet mit NTP
  für ESP8266 (und ESP32) mit WLAN
  Anzeige am seriellen Monitor und am OLED

  Sommer- und Winterzeit werden automatisch umgestellt
*/


#include "myNTP_Time.h"   // für NTP Internet Zeit-Datum
#include "myOLED_u8g2.h"  // für Anzeige am OLED
#include <Adafruit_HTU21DF.h>

Adafruit_HTU21DF  htu = Adafruit_HTU21DF();

unsigned long lastOLEDTimer = 0;
unsigned long lastTimeTimer = 0;

const int delayOLED = 8000;  // 8 sek
const int delayTime = 1000;  // 1 sek

String anzeigeStatus = "Sensor";  // { Sensor; Zeit}

// ------------------  setup()  ------------------------------
void setup() {
  Serial.begin(115200);
  Serial.println("\n\nDatum und Uhrzeit aus dem Internet per NTP!");

  if (!htu.begin()) {         // Sensor start
    Serial.println("Couldn't find sensor!");
  }

  initOLED();  // siehe myOLED_u8g2.h
  showLogo();
  delay(displayDelay);
  showStartText();
  delay(displayDelay);

  initWiFi();  // WLAN start siehe myWiFi.h

  // Initialize a NTPClient to get time
  bool timeSync = getNtpServer();  // siehe myNTP_Time.h
  Serial.printf("NTP Synchronisation %s!\n\n", timeSync ? "erfolgreich" : "fehlgeschlagen");
}


// ------------------  loop()  ------------------
void loop() {
  checkWiFi();  // Prüft WLAN Verbindung und stellt bei Bedarf wieder her

  //******  diese Schleife wird für die OLED-Anzeige durchlaufen
  //******  der Anzeigestatus wird in bestimmten Zeitintervall umgestellt
  if ((millis() - lastOLEDTimer) > delayOLED) {
    if (anzeigeStatus == "Zeit") {
      anzeigeStatus = "Sensor";
      // Sensor auslesen
      float temp = htu.readTemperature();
      float rel_hum = htu.readHumidity();

      showSensor("HTU21-Sens", temp, rel_hum);  // siehe myOLED.h

      Serial.print("\nTemp: ");    Serial.print(temp);      Serial.print(" °C\t\t");
      Serial.print("Humidity: ");  Serial.print(rel_hum);   Serial.println(" %\n");

    } else if (anzeigeStatus == "Sensor") {
      anzeigeStatus = "Zeit";
    }
    lastOLEDTimer = millis();
  }

  //******  diese Schleife wird für die Uhrzeit-Aktualisierung pro Sekunde durchlaufen
  //******  Anzeige von Datum und Uhrzeit jede Sekunde wenn anzeigeStatus == "Zeit"
  if ((millis() - lastTimeTimer) > delayTime) {
    if (anzeigeStatus == "Zeit") {
      //showTime();   // Anzeige Datum Uhrzeit

      time(&now);                      // read the current time
      localtime_r(&now, &tm);          // update the structure tm with the current time
      String txtDate = printDateDE();  // siehe myNTP_Time.h
      Serial.print("\t");
      String txtTime = printTime();  // siehe myNTP_Time.h
      Serial.println("\t" + weekDays[tm.tm_wday]);

      txtDate = "  " + txtDate;
      txtTime = "    " + txtTime;
      String txtDay = weekDays[tm.tm_wday];

      snprintf(line1, sizeof(line1), txtDate.c_str());  // Überschreibt line1 mit "Hallo", Zeichenlänge wird geprüft
      snprintf(line2, sizeof(line2), txtTime.c_str());  // Überschreibt line1 mit "Hallo", Zeichenlänge wird geprüft
      snprintf(line3, sizeof(line3), txtDay.c_str());   // Überschreibt line1 mit "Hallo", Zeichenlänge wird geprüft
      showTextOLED(lines, 3);                           // line1, line2, line3 werden angezeigt. line4, line5 werden ignoriert
    }
    lastTimeTimer = millis();
  }
}
