/*
==============================================
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);
}