I2C LCD Display macht faxen

Da haste ihn :wink:

#include <DS1307RTC.h> // RTC
#include <Time.h>
#include <Wire.h> // I2C
#include <ShiftPWM.h> // RGB Shift Register

// LCD Display
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
#define I2C_ADDR    0x27
#define BACKLIGHT_PIN     3
#define En_pin  2
#define Rw_pin  1
#define Rs_pin  0
#define D4_pin  4
#define D5_pin  5
#define D6_pin  6
#define D7_pin  7
LiquidCrystal_I2C	
lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,
D4_pin,D5_pin,D6_pin,D7_pin);

// RGB Shift Register
const int ShiftPWM_latchPin=8;
const bool ShiftPWM_invertOutputs = false;
const bool ShiftPWM_balanceLoad = false;
unsigned char maxHelligkeit = 255;
unsigned char pwmFrequenz = 75;
unsigned int numRegister = 3;
unsigned int numAusgaenge = numRegister*8;
unsigned int numRgbLeds = numRegister*8/3;
unsigned long startZeit = 0;

// Digitale Eingänge
const int buttonPin = 2; // Manuelle Umschaltung
const int buzzerPin = 3; // Piezzo
const int pumpePin = 4;
const int wasserPin = 5; // Schwimmer Wasserstand
const int neblerPin = 7;
const int alarmPin = 10;
static int temperatur = 0; // debug
static int wasserstand = 0; // debug

unsigned long aktuelleZeit;  

char* meldetext[] = 
{
  /*  0 */  "AUS             ",
  /*  1 */  "Fade1           ",
  /*  2 */  "Fade1+          ",
  /*  3 */  "Fade1++         ",
  /*  4 */  "Fade2           ",
  /*  5 */  "Fade2+          ",
  /*  6 */  "Fade2++         ",
  /*  7 */  "FadeAlle        ",
  /*  8 */  "FadeAlle+       ",
  /*  9 */  "FadeAlle++      ",
  /* 10 */  "FadeFlash       ",
  /* 11 */  "FadeFlash+      ",
  /* 12 */  "FadeFlash++     ",
  /*  13 */  "Regenbogen1    ",
  /* 14 */  "Regenbogen1+    ",
  /* 15 */  "Regenbogen1++   ",
  /* 16 */  "Regenbogen2     ",
  /* 17 */  "Regenbogen2+    ",
  /* 18 */  "Regenbogen2++   ",
};

void setup(){
  while(!Serial){
    delay(100); 
  }
  Serial.begin(9600);

  // LCD Display
  lcd.begin (16,2);
  lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE);
  lcd.setBacklight(HIGH);
  lcd.home ();

  pinMode(buttonPin, INPUT);
  pinMode(wasserPin, INPUT);
  pinMode(buzzerPin, OUTPUT);
  pinMode(pumpePin, OUTPUT);
  pinMode(neblerPin, OUTPUT);
  pinMode(alarmPin, OUTPUT);

  // RGB Shift Register
  ShiftPWM.SetAmountOfRegisters(numRegister);
  ShiftPWM.SetPinGrouping(1);
  ShiftPWM.Start(pwmFrequenz,maxHelligkeit);
}

void loop() 
{    
  aktuelleZeit = millis();
  static int i;

  // LCD Display
  lcd.setCursor(0,0); // Display 1. Zeile
  uhrzeit();

  lcd.setCursor(0,1); // Display 2. Zeile

  // Manuell umschalten (Taster)
  static int buttonStatus;
  static int letzterButtonStatus;

  buttonStatus = digitalRead(buttonPin);
  if(buttonStatus != letzterButtonStatus) 
  {
    if(buttonStatus == HIGH) 
    {
      i++;
      lcd.print(meldetext[i]);
      startZeit = millis();
      ShiftPWM.SetAll(0);
    }
    letzterButtonStatus = buttonStatus;
  }

  // Manuell umschalten (Serieller Monitor)
  if(Serial.available())
  {
    i = Serial.parseInt();
    startZeit = millis();
  }

  // Automisch umschalten (RTC)

  // Überwachung Wasserstand & Temperatur  
  //   int wasserstand = digitalRead(wasserPin);
  /*  if(wasserstand == 0 && temperatur == 1)
   {
   lcd.print("Wasserstand MIN ");
   digitalWrite(pumpePin, LOW);
   digitalWrite(neblerPin, LOW);
   digitalWrite(alarmPin, HIGH);
   }
   else if(wasserstand == 1 && temperatur == 0)
   {
   lcd.print("Temperatur MAX  ");
   digitalWrite(pumpePin, LOW);
   digitalWrite(neblerPin, LOW);
   digitalWrite(alarmPin, HIGH);
   }
   else if(wasserstand == 1 && temperatur == 1)
   {
   static unsigned long vorherigeZeit;
   Serial.println(vorherigeZeit);
   // Alle 2s umschalten
   if(aktuelleZeit - vorherigeZeit > 2000 && aktuelleZeit - vorherigeZeit < 4000)
   {
   lcd.print("Wasserstand MIN ");
   digitalWrite(alarmPin, HIGH);
   }
   else if(aktuelleZeit - vorherigeZeit > 4000)
   {
   lcd.print("Temperatur MAX  ");
   vorherigeZeit = aktuelleZeit;
   digitalWrite(alarmPin, LOW);
   }
   digitalWrite(pumpePin, LOW);
   digitalWrite(neblerPin, LOW);
   }
   else 
   {
   digitalWrite(pumpePin, HIGH);
   digitalWrite(neblerPin, HIGH);
   digitalWrite(alarmPin, LOW);
   }
   */

  switch(i) 
  {
  case 0:

    break;

  case 1:
    rgbFade1(500); //(unsigned long) fadeZeit, Std. 500;
    break;

  case 2:
    rgbFade1(200); //(unsigned long) fadeZeit, Std. 500;
    break;

  case 3:
    rgbFade1(50); //(unsigned long) fadeZeit, Std. 500;
    break;

  case 4:
    rgbFade2(500); //(unsigned long) fadeZeit, Std. 500;
    break;

  case 5:
    rgbFade2(200); //(unsigned long) fadeZeit, Std. 500;
    break;

  case 6:
    rgbFade2(100); //(unsigned long) fadeZeit, Std. 500;
    break;

  case 7:
    rgbFadeAlle(5000); //(unsigned long) zyklusZeit, Std. 5000;
    break;

  case 8:
    rgbFadeAlle(2000); //(unsigned long) zyklusZeit, Std. 500;
    break;

  case 9:
    rgbFadeAlle(1000); //(unsigned long) zyklusZeit, Std. 500;
    break;

  case 10:
    rgbFadeFlash(2000); //(unsigned long) fadeZeit, Std. 5000;
    break;

  case 11:
    rgbFadeFlash(500); //(unsigned long) fadeZeit, Std. 5000;
    break;

  case 12:
    rgbFadeFlash(50); //(unsigned long) fadeZeit, Std. 5000;
    break;

  case 13:
    rgbRegenbogen(3000, numRgbLeds); // (unsigned long zyklusZeit, int rainbowWidth), Std. 3000, numRgbLeds)
    break;

  case 14:
    rgbRegenbogen(1000, numRgbLeds);// (unsigned long zyklusZeit, int rainbowWidth), Std. 3000, numRgbLeds)
    break;

  case 15:
    rgbRegenbogen(500, numRgbLeds);// (unsigned long zyklusZeit, int rainbowWidth), Std. 3000, numRgbLeds)
    break;

  case 16:
    rgbRegenbogen(10000, 5 * numRgbLeds);// (unsigned long zyklusZeit, int rainbowWidth), Std. 3000, numRgbLeds)
    break;

  case 17:
    rgbRegenbogen(3000, 5 * numRgbLeds);// (unsigned long zyklusZeit, int rainbowWidth), Std. 3000, numRgbLeds)
    break;

  case 18:
    rgbRegenbogen(1000, 5 * numRgbLeds);// (unsigned long zyklusZeit, int rainbowWidth), Std. 3000, numRgbLeds)
    break;

  default:
    i = 0;
    lcd.clear();
  }
}

// Fade In und Fade Out jeder LED einzeln
void rgbFade1(unsigned long i) 
{
  unsigned long fadeZeit = i;
  unsigned char helligkeit;
  unsigned long loopZeit = numAusgaenge * fadeZeit * 2;
  unsigned long zeit = millis() - startZeit;
  unsigned long timer = zeit % loopZeit;
  unsigned long aktuellerSchritt = timer % (fadeZeit * 2);

  int aktiveLed = timer / (fadeZeit * 2);

  if(aktuellerSchritt <= fadeZeit) helligkeit = aktuellerSchritt * maxHelligkeit / fadeZeit;
  else helligkeit = maxHelligkeit - (aktuellerSchritt - fadeZeit) * maxHelligkeit / fadeZeit;
  ShiftPWM.SetAll(0);
  ShiftPWM.SetOne(aktiveLed, helligkeit);
}

// Fade In und Fade Out jeder LED einzeln
void rgbFade2(unsigned long i) 
{
  unsigned long fadeZeit = i;
  unsigned long loopZeit = numAusgaenge * fadeZeit;
  unsigned long zeit = millis() - startZeit;
  unsigned long timer = zeit % loopZeit;
  unsigned long aktuellerSchritt = timer % fadeZeit;

  int aktiveLed = timer / fadeZeit;
  unsigned char helligkeit = aktuellerSchritt * maxHelligkeit / fadeZeit;

  ShiftPWM.SetAll(0);
  ShiftPWM.SetOne((aktiveLed + 1) % numAusgaenge, helligkeit);
  ShiftPWM.SetOne(aktiveLed, maxHelligkeit - helligkeit);
}

void rgbFadeAlle(unsigned long i) 
{ 
  unsigned long zyklusZeit = i;
  unsigned long zeit = millis() - startZeit;
  unsigned long hue = (360 * zeit / zyklusZeit) % 360;
  ShiftPWM.SetAllHSV(hue, 255, 255); 
}

// Fade In und Fade Out alle LEDs
void rgbFadeFlash(unsigned long i) 
{
  unsigned char helligkeit;
  unsigned long fadeZeit = i;
  unsigned long zeit = millis() - startZeit;
  unsigned long aktuellerSchritt = zeit % (fadeZeit * 2);

  if(aktuellerSchritt <= fadeZeit) helligkeit = aktuellerSchritt * maxHelligkeit / fadeZeit;
  else helligkeit = maxHelligkeit -(aktuellerSchritt - fadeZeit) * maxHelligkeit / fadeZeit;
  ShiftPWM.SetAll(helligkeit);
}

// Regenbogen
void rgbRegenbogen(unsigned long zyklusZeit, int rainbowWidth) 
{
  unsigned long zeit = millis() - startZeit;
  unsigned long colorShift = (360 * zeit / zyklusZeit) % 360;

  for(unsigned int led = 0; led < numRgbLeds; led++) 
  {
    int hue = ((led) * 360 / (rainbowWidth - 1) + colorShift) % 360;
    ShiftPWM.SetHSV(led, hue, 255, 255);
  }
}

void uhrzeit() 
{
  static unsigned long vorherigeZeit;
  aktuelleZeit = millis();
  int wartezeit = 100;

  if(aktuelleZeit - vorherigeZeit > wartezeit) 
  {
    vorherigeZeit = aktuelleZeit;  
    tmElements_t tm;
    RTC.read(tm);
    print2digits(tm.Day);
    lcd.print('.');
    print2digits(tm.Month);
    lcd.print(".  ");
    print2digits(tm.Hour);
    lcd.print(':');
    print2digits(tm.Minute);
    lcd.print(':');
    print2digits(tm.Second);

    //Starte die Routine von 8:00 - 20:30 jede halbe Stunde
    //RTC.read(tm);
    //    if ((tm.Minute >= 8 && tm.Minute <= 50) && (tm.Second == 0 || tm.Second == 30)) routine = 1;
    //  else routine = 0;
  }
}

void print2digits(int i) {
  if(i >= 0 && i < 10) 
  {
    lcd.print('0');
    lcd.print(i);
  }
  else lcd.print(i);
}