/*
  ==============================================
             Test I2C-Analog OUT
  ==============================================

  Die Werte für die Analogkanäle können über die serielle Schnittstelle
  vorgegeben werden
  Kanal, Analogwert
  Kanal 0..3
  Wert  0.. 1023 = 10,23V
  Die Adresse für die 4x Output Baugruppe ist im Scanner "0x85"
  Die Adresse für die 5x Input Messkarte ist im Scanner "0x08"
  Die Adresse des LCD Display ist im Scanner "0x3f"
*/

#include <Wire.h>
#include <LiquidCrystal_I2C.h> // LCD Display
#define I2C_IN_ADDR 0x8 // I2C-INPUT-Addresse als 7 Bit = 0x8 oder Dez. in Klammer (8)
#define I2C_OUT_ADDR 0x58 // I2C-OUTPUT-Addresse als 7 Bit = 0x58 oder Dez. in Klammer (88)

// Für die 4x0-10 Volt Output Karte
int  SEL = 32;       // serielle Datenlänge
char Empfang[32];  // Epfangsdaten der seriellen Schnittstelle
byte HBy;
byte LBy;
int WERT;
int KANAL;
int z = 0;

//LCD Display
LiquidCrystal_I2C lcd(0x3f, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Set the LCD I2C address

// Für die 5x 0-10 Volt input Karte
int AIN_1[11];         // Array mit 11 Werten anlegen
int i;
int Analogwert[4];     // Analogwerte Kanal 0-4

void setup() {
  Serial.begin(9600);       // Serielle Schnittstelle konfigurieren
  Wire.begin();  // I2C-Pins definieren

  lcd.begin(20, 4);  // initialize the lcd for 20 chars 4 lines, turn on backlight
  lcd.backlight();
  lcd.clear();
  lcd.setCursor(12, 0);
  lcd.print("Mes.");
  lcd.setCursor(12, 1);
  lcd.print("Mes.");
  lcd.setCursor(12, 2);
  lcd.print("Mes.");
  lcd.setCursor(12, 3);
  lcd.print("Mes.");
}

void loop() {
  int i = 0;
  /*
    while (Serial.available() > 0) {  // Serielle Daten vorhanden?
      KANAL =Serial.parseInt();       // Erste Eingabe ist Kanal
      WERT = Serial.parseInt();       // Zweite Eingabe ist der Wert

      Serial.println(KANAL);          // Ausgabe Kanal auf den PC
      Serial.println(WERT);           // Ausgabe Wert auf den PC
  */

  if (z == 9) {
    z = 0;
  }
  z = z + 1;

  if (z < 9) {
    if (z == 1) {
      KANAL = 0;
      WERT = 100;
    }
    if (z == 2) {
      KANAL = 1;
      WERT = 200;
    }
    if (z == 3) {
      KANAL = 2;
      WERT = 300;
    }
    if (z == 4) {
      KANAL = 3;
      WERT = 400;
    }
    if (z == 5) {
      KANAL = 0;
      WERT = 500;
    }
    if (z == 6) {
      KANAL = 1;
      WERT = 600;
    }
    if (z == 7) {
      KANAL = 2;
      WERT = 700;
    }
    if (z == 8) {
      KANAL = 3;
      WERT = 800;
    }

    lcd.setCursor(0, KANAL);        // Werte auf das Display Ausgeben. Kanal ist Zeilennummer 0-3
    lcd.print("Wert ");             // Das Wort "Wert" aufs Display ausgeben
    lcd.setCursor(5, KANAL);       // Cursor auf Stelle 5 in die gleiche Zeile
    lcd.print("     ");             // Alten Wert Löschen
    lcd.setCursor(5, KANAL);
    lcd.print(WERT);                // Neuen Wert schreiben


    HBy = WERT / 256;        //HIGH-Byte berechnen
    LBy = WERT - HBy * 256;  //LOW-Byte berechnen

    Wire.beginTransmission(I2C_OUT_ADDR); // Start Übertragung zur ANALOG-OUT Karte
    Wire.write(KANAL);                    // Kanal in I2C Bus schreiben
    Wire.write(LBy);                      // LOW-Byte in I2C Bus schreiben
    Wire.write(HBy);                      // HIGH-Byte in I2C Bus schreiben
    Wire.endTransmission();               // Übergabe Daten eines Kanals Ende
  }

  // 11 Bytes von Analogkarte lesen
  Wire.requestFrom(I2C_IN_ADDR, 11);

  //  Werte in Array kopieren
  for (i = 0; i < 11; i++)
  {
    int c = Wire.read();
    AIN_1[i] = c;
  }

  // Werte berechnen. Analogwert = Highbyte * 256 + Lowbyte
  Analogwert[0] = AIN_1[2] * 256 + AIN_1[1];
  Analogwert[1] = AIN_1[4] * 256 + AIN_1[3];
  Analogwert[2] = AIN_1[6] * 256 + AIN_1[5];
  Analogwert[3] = AIN_1[8] * 256 + AIN_1[7];
  Analogwert[4] = AIN_1[10] * 256 + AIN_1[9];

  if (z == 2) {
    if ((Analogwert[0] >= 106) || (Analogwert[0] < 94)) {
      Serial.print("Fehler Wert 100= "); Serial.println(Analogwert[0]);
    }
  }
  if (z == 3) {
    if ((Analogwert[1] > 206) || (Analogwert[1] < 194)) {
      Serial.print("Fehler Wert 200= "); Serial.println(Analogwert[1]);
    }
  }
  if (z == 4) {
    if ((Analogwert[2] > 306) || (Analogwert[2] < 294)) {
      Serial.print("Fehler Wert 300= "); Serial.println(Analogwert[2]);
    }
  }
  if (z == 5) {
    if ((Analogwert[3] > 406) || (Analogwert[3] < 394)) {
      Serial.print("Fehler Wert 400= "); Serial.println(Analogwert[3]);
    }
  }

  if (z == 6) {
    if ((Analogwert[0] >= 506) || (Analogwert[0] < 494)) {
      Serial.print("Fehler Wert 500= "); Serial.println(Analogwert[0]);
    }
  }
  if (z == 7) {
    if ((Analogwert[1] > 606) || (Analogwert[1] < 594)) {
      Serial.print("Fehler Wert 600= "); Serial.println(Analogwert[1]);
    }
  }
  if (z == 8) {
    if ((Analogwert[2] > 706) || (Analogwert[2] < 694)) {
      Serial.print("Fehler Wert 700= "); Serial.println(Analogwert[2]);
    }
  }
  if (z == 9) {
    if ((Analogwert[3] > 806) || (Analogwert[3] < 794)) {
      Serial.print("Fehler Wert 800= "); Serial.println(Analogwert[3]);
    }
  }




  // Werte auf die serielle Schnittstelle und das LED Display ausgeben
  lcd.setCursor(16, 0);
  lcd.print("    ");
  lcd.setCursor(16, 0);
  lcd.print(Analogwert[0]);
  lcd.setCursor(16, 1);
  lcd.print("    ");
  lcd.setCursor(16, 1);
  lcd.print(Analogwert[1]);
  lcd.setCursor(16, 2);
  lcd.print("    ");
  lcd.setCursor(16, 2);
  lcd.print(Analogwert[2]);
  lcd.setCursor(16, 3);
  lcd.print("    ");
  lcd.setCursor(16, 3);
  lcd.print(Analogwert[3]);

  // 1 Sekunde warten
  delay(100);
}