Da haste ihn
#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);
}