/**************************************************************************/
/*
   Bei einer Ref. Spannung von 4,096 Volt
   und einem Messteiler von 3 zu 1 ist die Rechnung
   4,096 x 4 = 16,384 / 1024 = 0,016
   Ist 0-1023 x 16 / 1000
   !! Höchte Messspannung ist 16,384 Volt !! bei 3 zu 1 Teiler
*/
/**************************************************************************/
#include <LiquidCrystal_I2C.h> // LCD Display
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

const byte ANALOG_PIN = A0; // Hier wird der Name vom Messeingang festgelegt
float max31 = 0;      // Der Speicher für den ausgelesenen Analogwert vom Messbuchse
float max31alt = 0;
float max32 = 0;       // Der Speicher für den ausgelesenen Max-Analogwert vom ADC
float min31 = 0;      // Der Speicher für den ausgelesenen Analogwert vom Messbuchse
float min31alt = 1023;
float min32 = 0;       // Der Speicher für den ausgelesenen Max-Analogwert vom ADC
float durchschnitt = 0;
unsigned long startzeit = 0;
unsigned long endzeit = 0;
unsigned long Sekundenablauf01 = 0; // Messung erneuern nach eine Sekunde
const unsigned long Pausezeit01 = 1000;
//====================================================================================
void setup(void) {
  analogReference(EXTERNAL); // Externe Referenzspannung am AREF 4,096Volt
  Serial.begin(9600);

  pinMode(ANALOG_PIN, INPUT); // Input vom Messteiler
  lcd.begin(20, 4);
  lcd.backlight();
  lcd.clear();
  // Display Maxwert
  lcd.setCursor (0, 0);
  lcd.print (F("Maximalwert"));
  lcd.setCursor (18, 0);
  lcd.print (F("V"));
  // Display Minwert
  lcd.setCursor (0, 1);
  lcd.print (F("Minimalwert"));
  lcd.setCursor (18, 1);
  lcd.print (F("V"));
  // Display Durchschnitts Wert
  lcd.setCursor (0, 2);
  lcd.print (F("Normalwert"));
  lcd.setCursor (18, 2);
  lcd.print (F("V"));
}
//===================================================================================
void loop(void) {
  //--------------------------Zeit für die Durchlaufmessung------------------------------------------------
  startzeit = micros();

  //-----------------------Nach einer Sekunde neue Messung starten-----------------------------------------
  if (millis() - Sekundenablauf01 >= Pausezeit01) {
    max32 = ((max31alt * 16) / 1000); // 0-1023 x 0,016
    lcd.setCursor (13, 0);
    lcd.print (F("     "));
    lcd.setCursor (13, 0);
    lcd.print (max32);
    max31alt = 0;
    min32 = ((min31alt * 16) / 1000); // 0-1023 x 0,016
    lcd.setCursor (13, 1);
    lcd.print (F("     "));
    lcd.setCursor (13, 1);
    lcd.print (min32);
    min31alt = 1023;
    lcd.setCursor (13, 2);
    lcd.print (F("     "));
    lcd.setCursor (13, 2);
    durchschnitt = (max32 - min32) / 2;
    if (max32 == min32) {
      durchschnitt = 0;
    }
    lcd.print (durchschnitt);
    Sekundenablauf01 = millis();
    //Serial.println(F("Datenausgabe aufs Display"));
  }
  // -----------------------------Max- und Minwert messen und Maxwert sichern----------------------
  max31 = analogRead (ANALOG_PIN); // Analogen Eingang A0 auslesen
  min31 = max31;
  if (max31 >= max31alt) {
    max31alt = max31;
  }
  // -----------------------------Minimalwert sichern----------------------------------------------
  if (min31 <= min31alt) {
    min31alt = min31;
  }
  // -----------------------------------Laufzeittest----------------------------------------------
  endzeit = micros();
  //Serial.println(endzeit - startzeit);
}